<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Maxime Chéramy</title>
    <description>The latest articles on DEV Community by Maxime Chéramy (@maximecheramy).</description>
    <link>https://dev.to/maximecheramy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F968737%2Fd804d4fa-a5e1-4a60-9723-4dbe718b626a.jpg</url>
      <title>DEV Community: Maxime Chéramy</title>
      <link>https://dev.to/maximecheramy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maximecheramy"/>
    <language>en</language>
    <item>
      <title>Tools for Semantic Versioning</title>
      <dc:creator>Maxime Chéramy</dc:creator>
      <pubDate>Sat, 14 Jan 2023 14:44:49 +0000</pubDate>
      <link>https://dev.to/maximecheramy/tools-for-semantic-versioning-48la</link>
      <guid>https://dev.to/maximecheramy/tools-for-semantic-versioning-48la</guid>
      <description>&lt;p&gt;&lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;Semantic Versioning&lt;/a&gt; (also known as SemVer) is a widely-used method of versioning software releases. It uses a version number in the format of X.Y.Z (Major.Minor.Patch), where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The major version number (X) is incremented when there are breaking changes in the software's API or functionality.&lt;/li&gt;
&lt;li&gt;The minor version number (Y) is incremented when new, backwards-compatible features are added.&lt;/li&gt;
&lt;li&gt;The patch version number (Z) is incremented for backwards-compatible bug fixes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semantic versioning simplifies the work of developers by providing a clear and consistent method for identifying the level of changes in software releases, allowing them to easily assess the potential impact of updating their dependencies and plan accordingly.&lt;/p&gt;

&lt;p&gt;In this article I present tools that I use to assist me in managing the versions, publication, and updates of libraries.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conventional Commits
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.conventionalcommits.org" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt; is a method of writing commit messages that is also machine-readable. The goal is to make it easier to automate the release process, generate changelogs, etc.&lt;/p&gt;

&lt;p&gt;Commit messages written in this format follow a specific structure and contain a prefix (e.g. feat, fix, chore, etc.) that indicates the type of change made. The prefix is followed by a colon and a space, then a short description of the change. An exclamation mark can be used to indicate a breaking change.&lt;/p&gt;

&lt;p&gt;This format allows for easy identification of the type of change and its purpose, making it easier for developers to understand the context of a commit and the impact it may have on the codebase.&lt;/p&gt;

&lt;p&gt;Another popular commit format is &lt;a href="https://gitmoji.dev/" rel="noopener noreferrer"&gt;Gitmoji&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Semantic Release
&lt;/h1&gt;

&lt;p&gt;Semantic Release is a tool that automates the process of versioning and publishing of libraries. The versioning follows the principles of Semantic Versioning.&lt;/p&gt;

&lt;p&gt;The tool works by analyzing the commit messages in a project's repository, determining the type of changes made (e.g. bug fixes, new features, breaking changes), and automatically generating a new version number and release notes. This is often used in conjunction with Conventional Commits (or the very similar Angular Commit Convention).&lt;/p&gt;

&lt;p&gt;It also allows for automated publishing of the release to various package managers such as npm, pypi and maven central. I've mainly used it with npm libraries: every time a PR or MR is merged on Github or Gitlab, Semantic Release creates a changelog, a new release with the new version, publishes the library to the registry, etc. I highly recommend it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Commitizen
&lt;/h1&gt;

&lt;p&gt;When using Semantic Release, you might be faced by an annoying issue: your commit messages weren't following the convention and they were ignored. It could be because of a typo, a missing colon, an unknown type, etc. And this can be very frustrating because the commit won't appear in the changelog, if you can't wait for the next release and you will have to create a dummy commit to force Semantic Release to create a new release.&lt;/p&gt;

&lt;p&gt;If you are using the command line to create your commits, one solution is to use &lt;a href="https://commitizen-tools.github.io/commitizen/" rel="noopener noreferrer"&gt;Commitizen&lt;/a&gt;. Commitizen will provide you with a nice prompt to ask you the type of change, the scope and the message. This way the commit will be well-formatted and this will also help the developers to adopt the convention. Indeed, at the beginning it could be difficult to decide of the correct type for a change (eg. between chore, libs and refactor).&lt;/p&gt;

&lt;h1&gt;
  
  
  Commitlint
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://commitlint.js.org/" rel="noopener noreferrer"&gt;Commitlint&lt;/a&gt; is tool that takes commit messages and check that they follow the commit convention that your project uses. &lt;/p&gt;

&lt;p&gt;You can configure your CI or your git hooks to check the commit messages.&lt;/p&gt;

&lt;h1&gt;
  
  
  Renovate
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.mend.io/free-developer-tools/renovate/" rel="noopener noreferrer"&gt;Renovate&lt;/a&gt; is a tool that automatically creates pull requests / merge requests to update dependencies to their latest version, it can work with the main package managers. Semantic Versioning will be very helpful here because we can decide to automatically update (and merge if we want) patches, but keep a code review for minor and major updates for example.&lt;/p&gt;

&lt;p&gt;The most popular alternative to Renovate is Dependabot. They are very similar in their objectives but I tend to prefer Renovate that I find more flexible.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>DIY: I've built a music box for the 2nd x-mas of my son</title>
      <dc:creator>Maxime Chéramy</dc:creator>
      <pubDate>Sun, 27 Nov 2022 20:20:18 +0000</pubDate>
      <link>https://dev.to/maximecheramy/diy-ive-built-a-music-box-for-the-2nd-x-mas-of-my-son-j03</link>
      <guid>https://dev.to/maximecheramy/diy-ive-built-a-music-box-for-the-2nd-x-mas-of-my-son-j03</guid>
      <description>&lt;p&gt;For last Christmas, I wanted to offer my son a music box. But I wanted it to be unique so I decided to build it myself.&lt;/p&gt;

&lt;p&gt;In this article, I describe the main components, with links to the source code and schematics. It's not a tutorial but it can be useful if you want to do something similar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh36mkoi5irm4v86jgx3d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh36mkoi5irm4v86jgx3d.png" alt="The MP3 music player"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Presentation
&lt;/h2&gt;

&lt;p&gt;The music box is an MP3 player with 6 playlists, volume buttons, previous, stop and next buttons.&lt;/p&gt;

&lt;p&gt;Here are the components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ELEGOO nano (4€)&lt;/li&gt;
&lt;li&gt;DFPlayer Mini (3.5€)&lt;/li&gt;
&lt;li&gt;CQRobot speaker 3 Watt 8 Ohm (4€)&lt;/li&gt;
&lt;li&gt;Buttons (11€)&lt;/li&gt;
&lt;li&gt;PCB boards + wires kit (10€)&lt;/li&gt;
&lt;li&gt;Battery holders (3€)&lt;/li&gt;
&lt;li&gt;Wooden box (8€)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The cost of this project is less than 50€, if I don't count my mistakes (2 wooden boxes wasted because the first one was slightly too small, and the second one I drilled a hole on the wrong side).&lt;/p&gt;

&lt;h2&gt;
  
  
  Electronics
&lt;/h2&gt;

&lt;p&gt;The player is based on an Arduino nano and a DFPlayer Mini.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc6s00745q5uo8tfdpkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpc6s00745q5uo8tfdpkb.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The buttons are not shown on this schematic but they are connected to the following pins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;volume down: B2&lt;/li&gt;
&lt;li&gt;volume up: B3&lt;/li&gt;
&lt;li&gt;playlists: B4 to B9&lt;/li&gt;
&lt;li&gt;previous: B12&lt;/li&gt;
&lt;li&gt;stop: A0&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Arduino nano
&lt;/h3&gt;

&lt;p&gt;The Arduino Nano is a small, complete, and breadboard-friendly board based on the ATmega328. I decided to use an Elegoo model, which is compatible but much cheaper.&lt;/p&gt;

&lt;p&gt;The board is powered by 6 AA batteries (~9V), and we use the +5V output to power the DFPlayer Mini.&lt;/p&gt;

&lt;h3&gt;
  
  
  DFPlayer Mini
&lt;/h3&gt;

&lt;p&gt;The DFPlayer Mini is a small MP3 module that can play mp3 files from an SD card or a USB stick. The documentation is available there: &lt;a href="https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299" rel="noopener noreferrer"&gt;https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is actually challenging to find a legit DFPlayer Mini, the one I received is based on a MH2024K-16SS chip. This means that the firmware is different and the commands are different.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software
&lt;/h2&gt;

&lt;p&gt;The source code of this project can be found here: &lt;a href="https://github.com/MaximeCheramy/BabyMp3Player" rel="noopener noreferrer"&gt;https://github.com/MaximeCheramy/BabyMp3Player&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To develop on the Arduino, I use &lt;a href="https://platformio.org/" rel="noopener noreferrer"&gt;PlatformIO&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  DFPlayer support
&lt;/h3&gt;

&lt;p&gt;Probably the most difficult part of this project was getting the DFPlayer to work. I accidentally bought a cheap copy based on a different chipset. I thought it was broken but it just behaved differently (no checksums, different codes for commands).&lt;/p&gt;

&lt;p&gt;There are several libraries available to control this chipset with an Arduino. I decided to use the &lt;a href="https://github.com/Makuna/DFMiniMp3" rel="noopener noreferrer"&gt;DFMiniMp3 library&lt;/a&gt;, and in order to make it work with my module, I contributed to the library: &lt;a href="https://github.com/Makuna/DFMiniMp3/pull/77" rel="noopener noreferrer"&gt;https://github.com/Makuna/DFMiniMp3/pull/77&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Main program
&lt;/h3&gt;

&lt;p&gt;The logic is quite simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Configuration of the Arduino for all the buttons&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configuration of the DFPlayer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In a loop, we read the state of all the buttons.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a button is pressed (for at least 50ms), we store the button index in a variable named &lt;code&gt;currentButton&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If no button is pressed (for at least 50ms), we call the &lt;code&gt;buttonUp&lt;/code&gt; function with &lt;code&gt;currentButton&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;The &lt;code&gt;buttonUp&lt;/code&gt; function calls the appropriate function to change the volume, playlist, etc.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The volume level and the current playlist are stored in the EEPROM of the Arduino.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I built this box exactly 1 year ago, I now have some feedback about it.&lt;/p&gt;

&lt;p&gt;One of my biggest fear was that it would simply not work properly. Especially because of this fake DFPlayer Mini which doesn't seem as good as the original (missing commands, need to add extra delays). It turns out that this module seems to work fine. However, I have some reliability issues with the battery holders that... don't hold the batteries after a drop. Or faulty contacts (I decided not to show pictures of the inside of the box because I'm too ashamed of my soldering).&lt;br&gt;
The autonomy is good enough, but I didn't implement anything to automatically turn off the board after some inactivity. As a result, if the box isn't switched off, I will have to replace the batteries.&lt;/p&gt;

&lt;p&gt;Apart from these minor issues, it works great. I really enjoyed working on this project and my son loves his music box.&lt;/p&gt;

</description>
      <category>diy</category>
      <category>arduino</category>
      <category>cpp</category>
      <category>music</category>
    </item>
    <item>
      <title>Overview of the current and next-gen frontend development tools</title>
      <dc:creator>Maxime Chéramy</dc:creator>
      <pubDate>Tue, 08 Nov 2022 23:49:32 +0000</pubDate>
      <link>https://dev.to/maximecheramy/overview-of-the-next-gen-frontend-dev-tools-5fm1</link>
      <guid>https://dev.to/maximecheramy/overview-of-the-next-gen-frontend-dev-tools-5fm1</guid>
      <description>&lt;p&gt;Frontend Tools are moving fast, and it can be hard to keep up! In this article, I will give a short description of Webpack, Rollup, Parcel, Vite, TypeScript, SWC, ESBuild, Babel, Terser, Uglify, ESLint, prettier, Rome tools...&lt;/p&gt;

&lt;h2&gt;
  
  
  Transpilers/Compilers
&lt;/h2&gt;

&lt;p&gt;The JavaScript language is evolving a lot but in order to support old browsers, we need to make some transformations (for new syntax) or add polyfills/ponyfills to add new functions.&lt;/p&gt;

&lt;p&gt;The most popular JavaScript compiler is &lt;a href="//babel.dev"&gt;Babel&lt;/a&gt;. It supports the very latest ECMAScript features and it is clearly the most mature JavaScript Compiler available. But, some people started to think that it was too slow...&lt;/p&gt;

&lt;p&gt;So here comes &lt;a href="//swc.rs"&gt;SWC&lt;/a&gt; and &lt;a href="//esbuild.github.io"&gt;esbuild&lt;/a&gt;. These tools claim to be between 10x and 100x faster than Babel. But how?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1st reason: Babel is written in JavaScript, a single-threaded interpreted language. SWC is written in Rust and esbuild is written in Go. By using these languages, it's possible to have a faster code and to heavily use parallelism. &lt;/li&gt;
&lt;li&gt;2nd reason: they have been built with performance in mind from the beginning. They use optimized data structures and they don't need to support very old versions of JavaScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TypeScript
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt; extends JavaScript by adding types to the language. It may looks a bit scary at the beginning because it adds some syntax and you'll have the feeling to develop more slowly at the beginning.&lt;br&gt;
In practice, TypeScript speeds up your development experience by catching errors and providing fixes before you even run your code. Your IDE will offer a much better completion by knowing the type of the objects you're manipulating. For serious projects, I wouldn't go back to JavaScript.&lt;/p&gt;

&lt;p&gt;What about the performance? Well, the TS compiler (tsc) is also capable of transforming JS/TS code into ES5 but has similar perf to Babel. It's possible to use SWC, esbuild and Babel for TypeScript but it won't check your types. However, it's possible to use these tools and do the type checking with tsc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linters and Formatters
&lt;/h2&gt;

&lt;p&gt;I think it's a good transition to speak about &lt;a href="//eslint.org"&gt;ESLint&lt;/a&gt;. ESLint is a linter that helps identifying and fixing potential issues with your code. It can be formatting issues but it can also be used to enforce some rules to avoid potential bugs.&lt;/p&gt;

&lt;p&gt;ESLint is often compared to &lt;a href="//prettier.io"&gt;prettier&lt;/a&gt; because it can be used as a code formatter: you define formatting rules and then use the autofix feature to correct the code, when possible. However prettier has a different approach: you set formatting options and it gets rid of the original styling and reformats everything. &lt;a href="https://prettier.io/docs/en/comparison.html" rel="noopener noreferrer"&gt;It's possible to use prettier to format the code and ESLint to enforce other coding rules!&lt;/a&gt; It's actually the most popular option nowadays.&lt;/p&gt;

&lt;p&gt;Guess what, people also started to complain that ESLint and Prettier were too slow on big projects. And the new kid in town is &lt;a href="//rome.tools"&gt;Rome Tools&lt;/a&gt;. Rome Tools ambitions to be a linter, formatter, bundler, etc. For now, only the Linter and Formatter seems to be usable and clearly the project is a bit too young to be used on production projects. But I've tested their Linter on a big project and for the comparison, ESLint takes almost a minute while Rome takes less than a second. The comparison isn't entirely fair because the lint rules were different though, but it's still impressive.&lt;/p&gt;

&lt;p&gt;If during Code Reviews, people make comments on the formatting, please consider setting up a formatting tool such as prettier instead. Same for the lint. Code review should focus on code readability, design, complexity, tests, etc. But anything that can be automated should be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minifiers
&lt;/h2&gt;

&lt;p&gt;Before we move on to Frontend Bundlers, a quick word about minifiers. A JS minifier reduces the code length by removing unnecessary code (comments, block delimiters, variables too long, etc.) without altering its functionality. The main goal is to make the website load faster.&lt;/p&gt;

&lt;p&gt;There are many minifiers such as &lt;a href="https://terser.org/" rel="noopener noreferrer"&gt;terser&lt;/a&gt; and &lt;a href="https://lisperator.net/uglifyjs/" rel="noopener noreferrer"&gt;uglify&lt;/a&gt;. But, because minifying also require to parse the JS, it is actually possible to use esbuild and SWC to minify the code. &lt;a href="https://github.com/privatenumber/minification-benchmarks" rel="noopener noreferrer"&gt;Here's a benchmark of the main minifiers.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bundlers and Dev Servers
&lt;/h2&gt;

&lt;p&gt;Let's now talk about the frontend build tools, which are meant to make your life easier during development but also to generate the build artifacts that you will host somewhere. I will cover the following tools: Webpack, Rollup, Parcel, esbuild, Vite and Turbopack.&lt;/p&gt;

&lt;p&gt;The most popular bundler is &lt;a href="//webpack.js.org"&gt;Webpack&lt;/a&gt;. It is highly customizable, it will bundle your JS files but also your other assets using loaders (CSS, images, etc.), do some tree-shaking and minify everything. It's also a dev server: during the development, you’ll have access to a webserver with HMR and source-map. Webpack is full of features, but the configuration is a bit complex and it's a bit slow. Tools such as Create React App (for React projects) can help to start with a pre-configured webpack configuration.&lt;/p&gt;

&lt;p&gt;&lt;a href="//rollupjs.org"&gt;Rollup&lt;/a&gt; is focusing on the bundling part and has a different approach. This article is already big, so here’s a &lt;a href="https://medium.com/webpack/webpack-and-rollup-the-same-but-different-a41ad427058c" rel="noopener noreferrer"&gt;good article&lt;/a&gt; on the subject. The tldr is: "Use webpack for apps, and Rollup for libraries".&lt;/p&gt;

&lt;p&gt;&lt;a href="//parceljs.org"&gt;Parcel&lt;/a&gt; is meant to be a zero configuration web application bundler. It has a dev server with hot-reload and everything. This should work great for most projects, I recommend you give it a try. Oh, and it’s based on SWC, so it’s fast!&lt;/p&gt;

&lt;p&gt;&lt;a href="//esbuild.github.io"&gt;esbuild&lt;/a&gt; is not only a compiler but also a bundler with tree-shaking, source-map, minification, etc. However, this project is young and esbuild is mainly used for the compilation, for now.&lt;/p&gt;

&lt;p&gt;More recently, &lt;a href="https://vercel.com/blog/turbopack" rel="noopener noreferrer"&gt;Vercel announced Turbopack&lt;/a&gt;. Behind it we can find the creator of Webpack, so it's clearly a serious candidate. And their secret  for being faster is also to use tools developed in Rust.&lt;/p&gt;

&lt;p&gt;And now, let’s talk about the no-bundlers solutions. I've presented you several bundlers, but I haven't told you why we need them. We need to bundle for production builds when we want tree-shaking, lazy-loading, chunk splitting and support of old browsers... But do we really need to bundle the app during the development phase?&lt;/p&gt;

&lt;p&gt;&lt;a href="//vitejs.dev"&gt;Vite&lt;/a&gt; is an ESM-based dev server. The idea is simple: modern browsers now support ESM, so we can actually serve the modules directly to the browser without bundling!&lt;/p&gt;

&lt;p&gt;Vite will compile the code using esbuild and they are able to bundle your app using rollup. Even though esbuild could also bundle the app, &lt;a href="https://vitejs.dev/guide/why.html#why-not-bundle-with-esbuild" rel="noopener noreferrer"&gt;they decided not to use it&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As you can see, there are many new tools coming up and it's very exciting to see how fast they are. Nevertheless, I would still recommend using tools such as Babel, TSC, Webpack, ESLint and Prettier for most projects. The reason is that they are stable and full of features. Even though they are a bit slow, they do the job.&lt;/p&gt;

&lt;p&gt;I've experimented most of the tools I'm describing on side-projects or as a replacement in projects I have at work. I'm impressed by their speed, but I also realized that the time needed to bundle an app isn't only the time needed to transpile the code. I've tested using SWC instead of Babel in a project that takes 5 minutes to be built. Turns out, most of the time was actually spent compressing images through webpack loaders. Using caches was way more efficient.&lt;/p&gt;

&lt;p&gt;I know, I've presented a ton of exciting new tools and my conclusion is that they shouldn't be used yet. Let me be clear, frontend tools are evolving so fast that this advice will be deprecated in 6 months. So, follow these tools and watch their adoption and change logs.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>webpack</category>
    </item>
  </channel>
</rss>
