<?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: José Miguel</title>
    <description>The latest articles on DEV Community by José Miguel (@jmarroyave).</description>
    <link>https://dev.to/jmarroyave</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%2F235177%2F9839a682-0ae4-48b4-8064-828806d3bd32.jpg</url>
      <title>DEV Community: José Miguel</title>
      <link>https://dev.to/jmarroyave</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jmarroyave"/>
    <language>en</language>
    <item>
      <title>Bundle's Size: an insight</title>
      <dc:creator>José Miguel</dc:creator>
      <pubDate>Tue, 24 Sep 2019 17:26:23 +0000</pubDate>
      <link>https://dev.to/jmarroyave/bundle-s-size-an-insight-4h6l</link>
      <guid>https://dev.to/jmarroyave/bundle-s-size-an-insight-4h6l</guid>
      <description>&lt;p&gt;I don’t know if there are enough articles on how to optimize the bundle’s size, in almost everyone I’ve seen i find something else to add to my pipeline and that is why i want to start with the conclusion I reached.&lt;/p&gt;

&lt;p&gt;A bundle is a set of assets grouped based on a dependency analysis deduced from the source code (imports) which solves the problem of integrating the dependencies in a project. Having a range of assets, different in type and functionality, some included explicitly in the code and others implicitly that help the development process (webpack, react, dev mode) it is evident that the complexity is proportional to the size of the bundle .&lt;/p&gt;

&lt;p&gt;The final product is not only the content, it also includes the interaction experience and this begins when the user decides to click the link and awaits for the response. Although the bundle simplified the complexity of the dependencies, it is necessary to realize some assumptions to improve this experience, such as that all the code must be present at the same time (splitting), or that must be loaded sequentially (parallelism) and finally that source code must be pretty and understandable (minify).&lt;/p&gt;

&lt;p&gt;In summary, i found 4 main areas which group the actions needed to reduce a bundle’s size&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  delete: redundant or sub utilized code&lt;/li&gt;
&lt;li&gt;  extract: assets favoring paralelization&lt;/li&gt;
&lt;li&gt;  divide: group only the code needed&lt;/li&gt;
&lt;li&gt;  optimize: each asset, according to its type&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;I made a simple SPA to show some projects and then hosted it on github, I needed to add some dynamic components to the page so I used ReactJS to implement it with &lt;a href="https://jmarroyave-blog.herokuapp.com/en/2019/09/11/reactjs-portals/" rel="noopener noreferrer"&gt;portals&lt;/a&gt;. My point is why something so simple was so big:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.js 586.6KB
  2.js 377.3KB
  3.js  45.7KB
--------------
     1,009.6KB

polyfill.js  93.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2Fjm-git.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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2Fjm-git.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is page’s image and it requires almost 1MB of code without counting the HTML, CSS and images. My hypothesis is that “the bundle is packing code that it does not use” so I started to investigate a little and reduce each part involved (although in this post I will focus on the javascript code)&lt;/p&gt;

&lt;p&gt;The final result, after reviewing the bundle was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    app.js 481.9KB
    --------------
           481.9KB

    polyfill.js  92.9KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which represents a 48% of the original size and although the hypothesis was correct it just describes only a part of the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analysis and Tools
&lt;/h2&gt;

&lt;p&gt;To start I needed to see the bundle’s composition&lt;/p&gt;

&lt;h4&gt;
  
  
  webpack
&lt;/h4&gt;

&lt;p&gt;It generates a file with the dependency graph and the assets list, quite big and in json format, has a lot of information but it’s not so manageable&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webpack --profile --json &amp;gt; stats.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;a href="https://www.npmjs.com/package/webpack-bundle-analyzer" rel="noopener noreferrer"&gt;webpack-bundle-analyzer&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;it analyzes the dependency graph generated by webpack, good for visualizing the composition but not detailed enough&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    # package
    npm install webpack-bundle-analyzer -g

    # analyze, generate report
    webpack-bundle-analyzer stats.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2F01.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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2F01.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.npmjs.com/package/source-map-explorer" rel="noopener noreferrer"&gt;source-map-explorer&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;very similar to the previous one, not so colorful, but with a better level of detail&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source-map-explorer script.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2Fsource-map-explorer.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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2Fsource-map-explorer.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.npmjs.com/package/bundle-stats" rel="noopener noreferrer"&gt;bundle-stats&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;provides the most complete list of assets included in the bundle, it is more like a visualization tool for stats.json&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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2Fbundle-stats.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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2Fbundle-stats.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;now, with the bundle’s composition information&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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2F01-1.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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2F01-1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. react-dom.development.js
&lt;/h4&gt;

&lt;p&gt;changed the mode to production in webpack.config.js&lt;/p&gt;

&lt;p&gt;mode: 'production'&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.82MB 
app - 2.58MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. moment.js -&amp;gt; date-fns
&lt;/h4&gt;

&lt;p&gt;The library moment.js, despite of being quite complete is quite big. I replaced it with &lt;a href="https://date-fns.org/" rel="noopener noreferrer"&gt;date-fns&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.32MB 
app - 2.08MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. clean unused code
&lt;/h4&gt;

&lt;p&gt;after a quick review of dead code in some components i had to remove some unused imports left&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.27MB 
app - 2.02MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. helmet -&amp;gt; document.title
&lt;/h4&gt;

&lt;p&gt;i used helmet just for the page title so i changed it for document.title = “title”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.22MB 
app - 1.98MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. axios -&amp;gt; fetch
&lt;/h4&gt;

&lt;p&gt;I used axios just for server requests and that could be easily replaced by fetch&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.03MB 
app - 1.79MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  6. lint fixes
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.03MB 
app - 1.79MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  7. removing javascript-time-ago
&lt;/h4&gt;

&lt;p&gt;I am working on a framework that I have been building over time and at some point in time I used this functionality which can be replaced by date-fns too&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 1.62MB 
app - 1.38MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  8. material-ui
&lt;/h4&gt;

&lt;p&gt;it would be a highly cost refactor, I just upgrade the package to the latest version hoping that the devs behind the library were also doing their thing in this matter&lt;/p&gt;

&lt;h4&gt;
  
  
  9. react -&amp;gt; preact
&lt;/h4&gt;

&lt;p&gt;changing react for preact? it sounds good although the migration process was a little buggy&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 1.51MB 
app - 1.27MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  10. remove hot loader and development dependencies
&lt;/h4&gt;

&lt;h4&gt;
  
  
  11. extracting assets: css, fonts, images
&lt;/h4&gt;

&lt;p&gt;webpack - mini-css-extract-plugin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 1.43MB 
app - 1.19MB 
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  12. dynamic loading
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { FixedSizeList } from 'react-window'; 

const { FixedSizeList } = Loadable({
   loader: () =&amp;gt; import('react-window'),
       loading: Loading,
}); 

const FixedSizeList = Loadable({
   loader: () =&amp;gt; import('react-window/FixedSizeList'),
       loading: Loading,
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  13. targeting
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;devtool: false,
target: "web", 
externals: {
 React: 'react'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  14. minimize
&lt;/h4&gt;

&lt;p&gt;Terser&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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2F13.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%2Fjmarroyave-blog.herokuapp.com%2Fwp-content%2Fuploads%2F2019%2F09%2F13.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Summarizing, I categorized the previous 14 points as follows&lt;/p&gt;

&lt;h4&gt;
  
  
  delete
&lt;/h4&gt;

&lt;p&gt;development support&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  react-dom.development.js&lt;/li&gt;
&lt;li&gt;  removing hot loader&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;refactoring&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  moment.js&lt;/li&gt;
&lt;li&gt;  helmet&lt;/li&gt;
&lt;li&gt;  axios&lt;/li&gt;
&lt;li&gt;  javascript-time-ago&lt;/li&gt;
&lt;li&gt;  material-ui&lt;/li&gt;
&lt;li&gt;  react&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;code review&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  unused code&lt;/li&gt;
&lt;li&gt;  linting&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  extract
&lt;/h4&gt;

&lt;p&gt;css, images, fonts&lt;/p&gt;

&lt;h4&gt;
  
  
  divide
&lt;/h4&gt;

&lt;p&gt;Dynamic loading&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  react-window&lt;/li&gt;
&lt;li&gt;  optimizations chunks&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  optimize
&lt;/h4&gt;

&lt;p&gt;targeting and minimizing&lt;/p&gt;

&lt;p&gt;This far the list for today, I am aware that it can be more extensive. I would like to know which other points you recommend taking into account.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://lemoncode.net/lemoncode-blog/2018/5/7/webpack-poniendo-a-dieta-tus-bundles-ii" rel="noopener noreferrer"&gt;https://lemoncode.net/lemoncode-blog/2018/5/7/webpack-poniendo-a-dieta-tus-bundles-ii&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://dev.to/sheddy_nathan/possible-ways-to-reduce-your-webpack-bundle-size-js-secrets-550"&gt;https://dev.to/sheddy_nathan/possible-ways-to-reduce-your-webpack-bundle-size-js-secrets-550&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://medium.com/@poshakajay/heres-how-i-reduced-my-bundle-size-by-90-2e14c8a11c11" rel="noopener noreferrer"&gt;https://medium.com/@poshakajay/heres-how-i-reduced-my-bundle-size-by-90-2e14c8a11c11&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://material-ui.com/guides/minimizing-bundle-size/" rel="noopener noreferrer"&gt;https://material-ui.com/guides/minimizing-bundle-size/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://goenning.net/2018/11/26/how-we-reduced-initial-jscss-size/" rel="noopener noreferrer"&gt;https://goenning.net/2018/11/26/how-we-reduced-initial-jscss-size/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.intercom.com/blog/reducing-intercom-messenger-bundle-size/" rel="noopener noreferrer"&gt;https://www.intercom.com/blog/reducing-intercom-messenger-bundle-size/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>deploy</category>
    </item>
    <item>
      <title>Bundle Size: insight</title>
      <dc:creator>José Miguel</dc:creator>
      <pubDate>Mon, 23 Sep 2019 21:30:31 +0000</pubDate>
      <link>https://dev.to/jmarroyave/bundle-size-insight-42g5</link>
      <guid>https://dev.to/jmarroyave/bundle-size-insight-42g5</guid>
      <description>&lt;p&gt;No se si hay suficientes artículos de como optimizar el tamaño del &lt;em&gt;bundle&lt;/em&gt;, en casi todos los que he visto encuentro algo más para agregar a mi proceso y es por eso que quiero empezar con la conclusión a la que llegué.&lt;/p&gt;

&lt;p&gt;El &lt;em&gt;bundle&lt;/em&gt; es un conjunto de &lt;em&gt;assets&lt;/em&gt; agrupados en base a un análisis de dependencias deducido del código fuente (imports) que resuelven el problema de la integración de las dependencias de un proyecto. Teniendo una gama de &lt;em&gt;assets&lt;/em&gt; distintos, tanto en tipo como en funcionalidad, algunos incluidos explicitamente como en el código y otros implicitos que ayudan al proceso de desarrollo (webpack, react, dev mode) es evidente que la complejidad sea proporcional a la dimensión del bundle.&lt;/p&gt;

&lt;p&gt;El producto final no es unicamente el contenido también incluye la experiencia de interacción y esta empieza cuando el usuario decide darle click al link y espera su respuesta. Si bien el bundle simplificó la complejidad de las dependencias, es necesario evidenciar unas suposiciones para mejorar la experiencia, como la que todo el código debe estar presente al mismo tiempo (splitting), o que deba cargarse secuencialmente (paralelismo) y por último que los fuentes sean bonitos y entendibles (minify).&lt;/p&gt;

&lt;p&gt;En resumen, mi conclusión es que para reducir el bundle se deben tomar acciones en estas cuatro areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  eliminar: código redundante o sub utilizado&lt;/li&gt;
&lt;li&gt;  extraer: assets y favorecer la paralelización&lt;/li&gt;
&lt;li&gt;  dividir: agrupar solo el código necesario&lt;/li&gt;
&lt;li&gt;  optimizar: cada uno de los assets, según su tipo&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  PROBLEMA
&lt;/h1&gt;

&lt;p&gt;Hice una SPA simple para presentar unos proyectos y la hospedé en github, necesitaba agregar unos componentes dinámicos a la página por lo que use ReactJS implementándolo por medio de &lt;a href="https://jmarroyave-blog.herokuapp.com/es/2019/09/11/reactjs-portales/" rel="noopener noreferrer"&gt;portales&lt;/a&gt;. La cuestión es que para ser algo tan simple era demasiado pesado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.js 586.6KB  
  2.js 377.3KB  
  3.js  45.7KB  
--------------  
     1,009.6KB

polyfill.js  93.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fmiro.medium.com%2Fmax%2F1798%2F0%2ApJL6BzvIgSKvqdtM.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%2Fmiro.medium.com%2Fmax%2F1798%2F0%2ApJL6BzvIgSKvqdtM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta es la foto de la página y requiere de casi 1MB de código sin contar el HTML, CSS, imágenes. Mi hipótesis es “el bundle está empacando código que no utiliza” por lo que me puse a investigar un poco y a reducir cada una de las partes involucradas (aunque en este post me enfocaré en el código de javascript)&lt;/p&gt;

&lt;p&gt;El resultado final, luego de revisar el bundle fue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.js 481.9KB  
--------------  
       481.9KB

polyfill.js  92.9KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;lo cual representa un &lt;strong&gt;48%&lt;/strong&gt; del tamaño del original y aunque la hipótesis era correcta era solo una parte del problema.&lt;/p&gt;

&lt;h1&gt;
  
  
  ANÁLISIS Y HERRAMIENTAS
&lt;/h1&gt;

&lt;p&gt;Para empezar necesitaba ver la composición del bundle&lt;/p&gt;

&lt;h2&gt;
  
  
  WEBPACK
&lt;/h2&gt;

&lt;p&gt;permite generar un &lt;a href="https://webpack.js.org/api/stats/" rel="noopener noreferrer"&gt;archivo&lt;/a&gt; con el grafo de dependencias y assets, bastante grande y en json, mucha información pero poco manejable&lt;/p&gt;

&lt;p&gt;webpack --profile --json &amp;gt; stats.json&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.npmjs.com/package/webpack-bundle-analyzer" rel="noopener noreferrer"&gt;WEBPACK-BUNDLE-ANALYZER&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;analiza el grafo de dependencias que genera webpack, bueno para visualizar el conjunto pero no tan bueno para el detalle&lt;/p&gt;

&lt;p&gt;# package&lt;br&gt;&lt;br&gt;
npm install webpack-bundle-analyzer -g# analyze, generate report&lt;br&gt;&lt;br&gt;
webpack-bundle-analyzer stats.json&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%2Fmiro.medium.com%2Fmax%2F1742%2F0%2AftcIMlbtIdSU03i3.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%2Fmiro.medium.com%2Fmax%2F1742%2F0%2AftcIMlbtIdSU03i3.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;a href="https://www.npmjs.com/package/source-map-explorer" rel="noopener noreferrer"&gt;SOURCE-MAP-EXPLORER&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;muy parecido al anterior, no tan bonito, pero con un mejor nivel de detalle&lt;/p&gt;

&lt;p&gt;source-map-explorer script.js&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%2Fmiro.medium.com%2Fmax%2F1664%2F0%2ArTHZpAvZbmXDGKdG.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%2Fmiro.medium.com%2Fmax%2F1664%2F0%2ArTHZpAvZbmXDGKdG.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;a href="https://www.npmjs.com/package/bundle-stats" rel="noopener noreferrer"&gt;BUNDLE-STATS&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Este brinda una lista completa de la composición del bundle, los assets y los paquetes incluidos, es una visualización del stats.json generado por webpack&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%2Fmiro.medium.com%2Fmax%2F1664%2F0%2Aos9jcfRGEtCBn8ZH.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%2Fmiro.medium.com%2Fmax%2F1664%2F0%2Aos9jcfRGEtCBn8ZH.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  SOLUCIÓN
&lt;/h1&gt;

&lt;p&gt;Ya con la información de la composición&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%2Fmiro.medium.com%2Fmax%2F1742%2F0%2A2DrzfSIeip4hD4tG.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%2Fmiro.medium.com%2Fmax%2F1742%2F0%2A2DrzfSIeip4hD4tG.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1. REACT-DOM.DEVELOPMENT.JS
&lt;/h2&gt;

&lt;p&gt;cambiando el modo a producción en webpack.config.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mode: 'production'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.82MB   
app - 2.58MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. MOMENT.JS -&amp;gt; DATE-FNS
&lt;/h2&gt;

&lt;p&gt;La biblioteca de moment.js a pesar de ser bastante completa es bastante grande, ademas de todas las localizaciones que incluye. La sustituí por &lt;a href="https://date-fns.org/" rel="noopener noreferrer"&gt;date-fns&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.32MB   
app - 2.08MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. LIMPIAR CÓDIGO NO UTILIZADO
&lt;/h2&gt;

&lt;p&gt;Hice una revisión de código muerto en algunos componentes la cual fue dejando imports sin utilizar&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.27MB   
app - 2.02MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. HELMET -&amp;gt; DOCUMENT.TITLE
&lt;/h2&gt;

&lt;p&gt;Utilizaba helmet unicamente para ponerle el título a la página, esto lo cambié por document.title = “title”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.22MB   
app - 1.98MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. AXIOS -&amp;gt; FETCH
&lt;/h2&gt;

&lt;p&gt;Para el manejo de la comunicación utilizaba axios pero la funcionalidad que requería podía ser cubierta por fetch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.03MB   
app - 1.79MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. LINT FIXES
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 2.03MB   
app - 1.79MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. ELIMINAR JAVASCRIPT-TIME-AGO
&lt;/h2&gt;

&lt;p&gt;Estoy trabajando sobre un framework que he ido construyendo en el tiempo y en algún momento utilicé esta función la cual puede ser sustituida por date-fns&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 1.62MB   
app - 1.38MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. MATERIAL-UI
&lt;/h2&gt;

&lt;p&gt;alto costo en refactor, solo actualice la versión esperando que los devs atrás de la biblioteca también estuvieran haciendo lo suyo en esta materia&lt;/p&gt;

&lt;h2&gt;
  
  
  9. REACT -&amp;gt; PREACT
&lt;/h2&gt;

&lt;p&gt;cambiar react por preact? suena bien aunque el proceso me resultó con varios errores en la migración.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 1.51MB   
app - 1.27MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. QUITAR HOT LOADER Y DEPENDENCIAS DE DEARROLLO
&lt;/h2&gt;

&lt;h2&gt;
  
  
  11. EXTRAER ASSETS: CSS, FUENTES, IMÁGENES
&lt;/h2&gt;

&lt;p&gt;webpack - mini-css-extract-plugin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all - 1.43MB   
app - 1.19MB   
polyfill - 248.1KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  12. DYNAMIC LOADING
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const { FixedSizeList } from 'react-window'; 

const { FixedSizeList } = Loadable({  
   loader: () =&amp;gt; import('react-window'),  
       loading: Loading,  
}); 

const FixedSizeList = Loadable({  
   loader: () =&amp;gt; import('react-window/FixedSizeList'),  
       loading: Loading,  
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  13. TARGETING
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;devtool: false,  
target: "web",   
externals: {  
 React: 'react'  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  14. MINIMIZAR
&lt;/h2&gt;

&lt;p&gt;Terser&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%2Fmiro.medium.com%2Fmax%2F1742%2F0%2ARGTAm__1lOQCL6sY.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%2Fmiro.medium.com%2Fmax%2F1742%2F0%2ARGTAm__1lOQCL6sY.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resumiendo, los 14 puntos anteriores los categoricé de la siguiente forma&lt;/p&gt;

&lt;h2&gt;
  
  
  ELIMINAR
&lt;/h2&gt;

&lt;p&gt;Apoyo a desarrollo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  react-dom.development.js&lt;/li&gt;
&lt;li&gt;  removing hot loader&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Refactoring&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  moment.js&lt;/li&gt;
&lt;li&gt;  helmet&lt;/li&gt;
&lt;li&gt;  axios&lt;/li&gt;
&lt;li&gt;  javascript-time-ago&lt;/li&gt;
&lt;li&gt;  material-ui&lt;/li&gt;
&lt;li&gt;  react&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Revisión de código&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  código no utilizado&lt;/li&gt;
&lt;li&gt;  linting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  EXTRAER
&lt;/h2&gt;

&lt;p&gt;css, imágenes, fuentes&lt;/p&gt;

&lt;h2&gt;
  
  
  DIVIDIR
&lt;/h2&gt;

&lt;p&gt;Dynamic loading&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  react-window&lt;/li&gt;
&lt;li&gt;  optimizations chunks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  OPTIMIZAR
&lt;/h2&gt;

&lt;p&gt;targeting y minimize&lt;/p&gt;

&lt;p&gt;Hasta aquí la lista por hoy, estoy consciente que puede ser más extensa. Me gustaría saber otros puntos que recomienden tomar en cuenta.&lt;/p&gt;

&lt;h1&gt;
  
  
  REFERENCIAS
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://lemoncode.net/lemoncode-blog/2018/5/7/webpack-poniendo-a-dieta-tus-bundles-ii" rel="noopener noreferrer"&gt;https://lemoncode.net/lemoncode-blog/2018/5/7/webpack-poniendo-a-dieta-tus-bundles-ii&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://dev.to/sheddy_nathan/possible-ways-to-reduce-your-webpack-bundle-size-js-secrets-550"&gt;https://dev.to/sheddy_nathan/possible-ways-to-reduce-your-webpack-bundle-size-js-secrets-550&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://dev.to/@poshakajay/heres-how-i-reduced-my-bundle-size-by-90-2e14c8a11c11"&gt;https://medium.com/@poshakajay/heres-how-i-reduced-my-bundle-size-by-90-2e14c8a11c11&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://material-ui.com/guides/minimizing-bundle-size/" rel="noopener noreferrer"&gt;https://material-ui.com/guides/minimizing-bundle-size/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://goenning.net/2018/11/26/how-we-reduced-initial-jscss-size/" rel="noopener noreferrer"&gt;https://goenning.net/2018/11/26/how-we-reduced-initial-jscss-size/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.intercom.com/blog/reducing-intercom-messenger-bundle-size/" rel="noopener noreferrer"&gt;https://www.intercom.com/blog/reducing-intercom-messenger-bundle-size/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>deploy</category>
    </item>
  </channel>
</rss>
