<?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: Igor Golodnitsky</title>
    <description>The latest articles on DEV Community by Igor Golodnitsky (@appqui).</description>
    <link>https://dev.to/appqui</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%2F122950%2Ff165fd92-a5d2-4f09-b213-0e30b5ed21f1.jpeg</url>
      <title>DEV Community: Igor Golodnitsky</title>
      <link>https://dev.to/appqui</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/appqui"/>
    <language>en</language>
    <item>
      <title>How I optimized Carousel for EditorJS 2x in size.</title>
      <dc:creator>Igor Golodnitsky</dc:creator>
      <pubDate>Fri, 29 Mar 2024 16:00:00 +0000</pubDate>
      <link>https://dev.to/appqui/how-i-optimized-carousel-for-editorjs-2x-in-size-4efa</link>
      <guid>https://dev.to/appqui/how-i-optimized-carousel-for-editorjs-2x-in-size-4efa</guid>
      <description>&lt;h2&gt;
  
  
  Why are we doing this?
&lt;/h2&gt;

&lt;p&gt;I am supporting a project where lawyers, advisors can publish articles or news, to get more attention and clients. Initially it was made through &lt;em&gt;TinyMCE&lt;/em&gt;, but they wanted not just HTML, but also a way of showing many pictures with interactions. &lt;br&gt;
I was seeking UI editor like Medium, and I guess best what I found was &lt;a href="https://editorjs.io/"&gt;EditorJS&lt;/a&gt; and during checking its &lt;a href="https://github.com/editor-js/awesome-editorjs"&gt;Awesome List&lt;/a&gt; there were several carousel plugins and I stopped on &lt;a href="https://github.com/mr8bit/carousel-editorjs/"&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74nebz2sub3pmsk6yrhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74nebz2sub3pmsk6yrhc.png" alt="carousel look like this" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;The pros&lt;/em&gt;: it had already generated bundle with it, which I could easily add to my project&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The cons&lt;/em&gt;: there were no demo page with it, it was only a screenshot, which later happens already outdated 😬&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In current version there were buttons to move order, but for some reason instead of "delete" ❎ button as on screenshot it was blank, and also inside &lt;em&gt;toolbox&lt;/em&gt; it was also blank.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;No other way&lt;/em&gt;: I need to &lt;em&gt;fork&lt;/em&gt;, &lt;em&gt;clone&lt;/em&gt; it, 🔧 bugs, &lt;em&gt;build&lt;/em&gt; myself. About &lt;em&gt;fixing&lt;/em&gt; part maybe will write separate post, but I would like to share process of optimizing bundle, because it looked a bit heavy for such kind of code.&lt;/p&gt;
&lt;h2&gt;
  
  
  What with bundle size?
&lt;/h2&gt;

&lt;p&gt;Let's see initial size of build we have &lt;em&gt;35.4k&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;    &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt;
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;35.4&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After fixes size become even smaller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;    &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt;
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;35.1&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even without tools it looked a bit weird, all files in source without minification costs us &lt;em&gt;27k&lt;/em&gt;, its something not needed inside, and if you &lt;em&gt;unpack&lt;/em&gt; it with something like &lt;a href="https://beautifier.io/"&gt;https://beautifier.io/&lt;/a&gt; you will see:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F633btzvuemqhohp9dipc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F633btzvuemqhohp9dipc.png" alt="strange stuff inside" width="680" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What the hell &lt;code&gt;process.chdir&lt;/code&gt; doing inside browser bundle?&lt;/p&gt;

&lt;h2&gt;
  
  
  What bundle consists of?
&lt;/h2&gt;

&lt;p&gt;So as always we add &lt;code&gt;webpack-bundle-analyzer&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"webpack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.29.5"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"webpack-bundle-analyzer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.10.1"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"webpack-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.2.3"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding &lt;code&gt;--profile&lt;/code&gt; flag to build command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack --mode production --profile"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bundle inside looks like this:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkhk7qlpva7qqhg2jxrc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkhk7qlpva7qqhg2jxrc.jpg" alt="Initial build size 35.11k" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What we have here, lets show it in form of json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"index.js + uploader.js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8.64k"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"index.css"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.64k"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"button-icon.svg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"439b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;"all"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"13kb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"styles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"style-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.67k"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"css-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"808b"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"babel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.42k"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ajax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14kb"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src&lt;/code&gt; is fine, its meat we need to deliver.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;babel&lt;/code&gt; hard to say, why it was used. There is no &lt;code&gt;target&lt;/code&gt; or &lt;code&gt;browserlist&lt;/code&gt; left. Not sure if author wanted to support &lt;code&gt;IE11&lt;/code&gt;. Even when this component was created in 2021, &lt;code&gt;es6&lt;/code&gt; was on 97% adoption through browsers.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;styles&lt;/code&gt; is interesting, we have &lt;code&gt;index.css&lt;/code&gt; of &lt;em&gt;3.64k&lt;/em&gt; and delivery mechanism that costs &lt;em&gt;5.4k&lt;/em&gt;, which more than css itself 😺. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ajax&lt;/code&gt; is a blackbox for us for now, its another &lt;code&gt;UMD&lt;/code&gt; bundle, need to build it separately, and check what inside.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Remove babel and styles
&lt;/h2&gt;

&lt;p&gt;Remove &lt;code&gt;babel&lt;/code&gt; from &lt;code&gt;webpack.config.js&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjgodz5c5acezhnmfrwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnjgodz5c5acezhnmfrwu.png" alt="remove babel" width="345" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remove &lt;code&gt;styles&lt;/code&gt; is trickier. In fact what we could do, is just remove it from bundle, to separate file. We could put it as it is, but author decided to use a bit of scss-stuff, and we might want to leave it. For webpack4 I didn't find a solution for this, so I updated it to webpack5.&lt;/p&gt;

&lt;p&gt;Packages now looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"mini-css-extract-plugin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.8.1"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"svg-inline-loader"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.8.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"webpack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.91.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"webpack-bundle-analyzer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.10.1"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"webpack-cli"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.2.3"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding MiniCssExtractPlugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MiniCssExtractPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mini-css-extract-plugin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MiniCssExtractPlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bundle.css&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;css$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nx"&gt;MiniCssExtractPlugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;css-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postcss-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postcss-nested-ancestors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postcss-nested&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's build it, and see what we get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;    &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt; 
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;22.8&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;  &lt;span class="mf"&gt;3.1&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you see &lt;code&gt;bundle.css&lt;/code&gt; is even smaller than css inside bundle, this is because to be in js, css need a bit of escaping and module instantiation. After we remove utils for loading, now instead of &lt;em&gt;9k&lt;/em&gt; we have &lt;em&gt;3.1k&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Intermediate result: &lt;em&gt;25.9k&lt;/em&gt; vs &lt;em&gt;35.1k&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking ajax library
&lt;/h2&gt;

&lt;p&gt;Library used here: &lt;a href="https://github.com/codex-team/ajax"&gt;https://github.com/codex-team/ajax&lt;/a&gt;. As stated in readme it is &lt;code&gt;Just another AJAX requests helper&lt;/code&gt;. Main reason why it was used, I guess a simple helper for submitFiles(). Lets see what &lt;code&gt;dist&lt;/code&gt; have inside:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpo0g4jim3aqnjy0v6iwt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpo0g4jim3aqnjy0v6iwt.png" alt="ajax dist initially" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What we really need is in red border.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;  &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt;  
&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;14.3&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.74kb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"utils.js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.74kb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nl"&gt;"all"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5.5kb"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"http-build-query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"569b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"promise-polyfill"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7kb"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Again this library is from 2020.&lt;/p&gt;

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

&lt;p&gt;Support of Promise in major browsers goes from 2014. Yes we supported &lt;code&gt;IE11&lt;/code&gt; for many years, and I guess in 2018 many companies let it go. Problem here that polyfill always here, npm distribute this bundle, and no way to tell, if you need it for your build or not.&lt;/p&gt;

&lt;p&gt;After removing &lt;code&gt;promise-polyfill&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;  &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt; 
&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;7.09&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After removing &lt;code&gt;babel&lt;/code&gt; for es6 classes emulation 👽&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;  &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt; 
&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;6.09&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we copy this &lt;code&gt;main.js&lt;/code&gt; to our carousel project as &lt;code&gt;ajax.js&lt;/code&gt;, and build it, we will get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;    &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt; 
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;14.7&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;  &lt;span class="mf"&gt;3.1&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's already much better, but what I don't like about this, is that &lt;code&gt;ajax.js&lt;/code&gt; is still &lt;code&gt;UMD&lt;/code&gt; style webpack bundle, that means array of modules inside connected by something called &lt;code&gt;(webpack)/buildin/global.js&lt;/code&gt; which takes &lt;em&gt;472b&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9io6j68azp09rfkk74jd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9io6j68azp09rfkk74jd.png" alt="(webpack)/buildin/global.js" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why use it, if we have such a great thing like &lt;code&gt;ESM&lt;/code&gt; 😃.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enabling ESM for ajax project
&lt;/h2&gt;

&lt;p&gt;I didn't follow long story of dealing with ESM inside webpack during last 5 years, but looks like now it works good, and in fact my build from webpack was even more compact, than I could make from &lt;code&gt;esbuild&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;To enable it you just need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;upgrade webpack to latest 5, for me its &lt;code&gt;^5.91.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;change &lt;code&gt;"type": "module"&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;rewrite fully &lt;code&gt;webpack.config.js&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wt1t6pp42ofh921o5n5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2wt1t6pp42ofh921o5n5.png" alt="initial vs module" width="764" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result is nice 🔥 and one more useless kilobyte gone.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;  &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt; 
&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;5.06&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lets see final result 🎉: &lt;em&gt;16.9k&lt;/em&gt; vs &lt;em&gt;35.1k&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight awk"&gt;&lt;code&gt;    &lt;span class="nx"&gt;Asset&lt;/span&gt;      &lt;span class="nx"&gt;Size&lt;/span&gt; 
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;  &lt;span class="mf"&gt;13.8&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;span class="nx"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;  &lt;span class="mf"&gt;3.1&lt;/span&gt; &lt;span class="nx"&gt;KiB&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resume
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don't treat bundles as binary, it is JavaScript&lt;/li&gt;
&lt;li&gt;JavaScript is a high-level language&lt;/li&gt;
&lt;li&gt;It is easily readable 📚, even when minified&lt;/li&gt;
&lt;li&gt;Can be formatted 📏 by vscode&lt;/li&gt;
&lt;li&gt;It is a pleasure to feel full control of it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading. 🤘&lt;br&gt;
Open to collaboration. 👋&lt;br&gt;
If you have full-time or part-time projects. &lt;br&gt;
Usually work as full-stack: &lt;code&gt;.net&lt;/code&gt; + &lt;code&gt;js&lt;/code&gt;. &lt;br&gt;
Write me 📫: &lt;a href="//mailto:igor.golodnitsky@gmail.com"&gt;igor.golodnitsky@gmail.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>babel</category>
      <category>webpack</category>
      <category>esbuild</category>
      <category>esm</category>
    </item>
  </channel>
</rss>
