<?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: gonzalo</title>
    <description>The latest articles on DEV Community by gonzalo (@gonzalo).</description>
    <link>https://dev.to/gonzalo</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%2F134341%2F8c024a17-0b08-4019-834c-7923a7f2331b.jpeg</url>
      <title>DEV Community: gonzalo</title>
      <link>https://dev.to/gonzalo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gonzalo"/>
    <language>en</language>
    <item>
      <title>Qué es el Critical Rendering Path y cómo optimizarlo</title>
      <dc:creator>gonzalo</dc:creator>
      <pubDate>Mon, 02 Dec 2024 17:54:41 +0000</pubDate>
      <link>https://dev.to/gonzalo/que-es-el-critical-rendering-path-y-como-optimizarlo-101k</link>
      <guid>https://dev.to/gonzalo/que-es-el-critical-rendering-path-y-como-optimizarlo-101k</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es el Critical Rendering Path?
&lt;/h2&gt;

&lt;p&gt;El Critical Rendering Path es la secuencia de fases por las que pasa el navegador para convertir el HTML, CSS y JavaScript en píxeles en la pantalla:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parsea el HTML en el DOM (Document Object Model).&lt;/li&gt;
&lt;li&gt;Parsea el CSS en el CSSOM (CSS Object Model).&lt;/li&gt;
&lt;li&gt;Ejecuta scripts.&lt;/li&gt;
&lt;li&gt;Calcula el tamaño y posición de los elementos en la pantalla.&lt;/li&gt;
&lt;li&gt;Renderiza la página.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Estos pasos afectan directamente al rendimiento de nuestra web, por lo que habrá cosas que tenemos que tener en cuenta si queremos optimizar este proceso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Construyendo el DOM
&lt;/h3&gt;

&lt;p&gt;El navegador recibe el HTML a través de una llamada HTTP. En cuanto lo recibe empieza a construir el DOM con esos datos.&lt;/p&gt;

&lt;p&gt;Este DOM se construye a base de nodos, cada etiqueta de HTML equivaldría a un nodo, y elementos hijos en el HTML también serían nodos hijos en el árbol del DOM.&lt;/p&gt;

&lt;p&gt;A mayor número de nodos, más tardará en completarse el proceso de renderizado de la página.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS Object Model
&lt;/h3&gt;

&lt;p&gt;Mientras el DOM contiene toda la información del contenido de la página, el CSSOM contiene toda la información sobre cómo se va a ver ese contenido.&lt;/p&gt;

&lt;p&gt;El procesado de CSS bloquea el renderizado. Es decir, que hasta que no se procese por completo no se puede continuar con futuros pasos para mostrar finalmente el contenido en la pantalla. Esto se debe a que puede darse el caso de que en un archivo de CSS se sobreescriban los estilos que se han aplicado unas líneas más arriba.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render tree
&lt;/h3&gt;

&lt;p&gt;Una vez tenemos el DOM y el CSSOM listos, estos se combinan dando como resultado el "Render tree", que tendrá toda la información necesaria de los elementos que aparecerán en pantalla. En este árbol quedarán excluidos aquellos elementos como todo lo que tenga display: none; y sus descendientes o todo aquello que se encuentre en la etiqueta &amp;lt;head&amp;gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layout
&lt;/h3&gt;

&lt;p&gt;En la fase de "Layout" se define el tamaño de los elementos del render tree y su relación con otros elementos. Este proceso es dependiente de la pantalla en la que se esté visitando la página web.&lt;/p&gt;

&lt;p&gt;Si no se especifica, los elementos ocuparán por defecto el 100% del ancho del padre, que en algunos navegadores es un ancho fijo. Es por eso que es necesario incluir este elemento en la etiqueta &amp;lt;head&amp;gt; de nuestro documento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada vez que un usuario rota su dispositivo móvil, el proceso de Layout se vuelve a ejecutar, ya que los elementos y su disposición en la pantalla pueden potencialmente cambiar.&lt;/p&gt;

&lt;p&gt;El Layout puede afectar al rendimiento de una web, ya que a mayor número de nodos, más tardará este proceso en finalizar. Un proceso de Layout lento puede ocasionar que algunas animaciones no se vean bien, además de provocar que la primera carga de la página sea más lenta.&lt;/p&gt;

&lt;h3&gt;
  
  
  El pintado de la página
&lt;/h3&gt;

&lt;p&gt;El pintado de los píxeles en la pantalla es el último paso del proceso de renderizado. Es un paso rápido, ya que después de la primera carga (onload) ya solo se repintarán aquellas zonas de la página que hayan sufrido cambios, los navegadores ya están optimizados para evitar realizar este proceso de manera innecesaria.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimización del CRP
&lt;/h2&gt;

&lt;p&gt;Este proceso puede optimizarse de distintas maneras, pero cada caso es único y al final lo importante es que apliques en tu proyecto aquellas medidas que mejor le vengan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Carga de recursos críticos tan pronto como puedas
&lt;/h3&gt;

&lt;p&gt;La idea es que el navegador descargue recursos como imágenes, estilos, scripts, etc que sean cruciales para la página tan rápido como sea posible, por lo que convendría poner esos elementos lo más arriba posible en el &amp;lt;head&amp;gt;.&lt;/p&gt;

&lt;p&gt;Incluso si son scripts o estilos más pequeños pueden ir en etiquetas en línea.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
        &lt;span class="nc"&gt;.foo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por otra parte, si lo que estás cargando es un script que modifica algún elemento del DOM, la idea sería cargarlo una vez ya se ha construido el árbol con todos sus nodos. Es en esos casos en los que sería necesario cargar ese script al final del todo en la etiqueta body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- My content --&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./path/to/my/script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Posponer carga de scripts
&lt;/h3&gt;

&lt;p&gt;Posponer la carga de scripts que no modifican el DOM es una muy buena práctica para reducir el tiempo de carga de la web. Esto se puede hacer a través de los atributos "async" y "defer".&lt;/p&gt;

&lt;p&gt;Poniendo un script como async hará que este script se descargue y ejecute de manera independiente, por lo que no bloquearía el proceso de renderizado y el momento de la ejecución es arbitrario.&lt;/p&gt;

&lt;p&gt;Un script con el atributo defer se descargará de manera asíncrona, pero respeta el orden en el que se ubica en el documento. Es también una buena forma de controlar que un script pequeño se ejecute después de un script más grande.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./very-big-file.js"&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./big-file.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./small-file.js"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el ejemplo de arriba los tres scripts se descargarán de manera asíncrona. Asumimos que el último script se descargará primero, ya que es más pequeño. El primer script se descargará y ejecutará de manera totalmente independiente, ni espera a otros elementos para que estén listos ni bloquea el proceso de renderizado. En cualquier caso, el último script se ejecutará después del segundo, ya que el atributo defer respeta el orden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separación de estilos con media queries
&lt;/h3&gt;

&lt;p&gt;La idea sería cargar únicamente los estilos que se vayan a necesitar en pantalla, por lo que una técnica que podría ayudar a la optimización del rendimiento sería separar los estilos de la página en distintos archivos en función de si van a aplicar a móviles, tablets, escritorio, etc. En el HTML se cargarían estos archivos con media queries, evitando la carga innecesaria de estilos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"screen"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"sans-serif.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"print"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"serif.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Minificar recursos
&lt;/h3&gt;

&lt;p&gt;Aunque parezca una tontería, minificar los archivos puede ayudar considerablemente a la mejora del rendimiento de una página, ya que eliminando espacios en blanco, comentarios, etc puede reducir el trabajo que tiene que hacer el navegador para construir el render tree.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Esto son solamente unas pocas cosas que se deben tener en cuenta para optimizar este proceso. Teniendo esto en mente es más viable poder escribir código de calidad que ya esté pensado para optimizar el Critical Rendering Path.&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>javascript</category>
      <category>rendimiento</category>
    </item>
    <item>
      <title>Import aliases en tu aplicación de NodeJS</title>
      <dc:creator>gonzalo</dc:creator>
      <pubDate>Thu, 04 Apr 2024 15:26:57 +0000</pubDate>
      <link>https://dev.to/gonzalo/import-aliases-en-tu-aplicacion-de-nodejs-2kko</link>
      <guid>https://dev.to/gonzalo/import-aliases-en-tu-aplicacion-de-nodejs-2kko</guid>
      <description>&lt;p&gt;Hay ocasiones en las que nuestra aplicación crece y los imports acaban siendo algo feos y liosos, como estos:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;GenericRepository&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../../shared/generics/generic.repository&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto puede llevar a confusiones si crece demasiado. Afortunadamente hay medidas que se pueden tomar para evitar que esto ocurra y que nos queden unos imports así de claros y bonitos:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;GenericRepository&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@generics/generic.repository&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡Mira que bien se ve! Ahora te explico cómo usar correctamente estos imports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementación
&lt;/h2&gt;

&lt;p&gt;Asumiendo que estás utilizando TypeScript en tu aplicación, tendrás un archivo llamado tsconfig.json en el root de tu proyecto. Este archivo lucirá de una forma similar a esto:&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;"compilerOptions"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;configuración&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="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;Dentro de las compilerOptions vamos a definir nuestros path aliases. ¿Cómo? Pues lo primero que necesitamos es saber cuál es nuestra baseUrl. A mí personalmente me gusta meter toda la chicha en la carpeta src , por lo que mi baseUrl será así:&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;"compilerOptions"&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./src"&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="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;Si no tienes o no utilizas la carpeta src de esa manera no te preocupes, puedes configurar la baseUrl a un punto sin más, o a cualquier otro valor que aplique a tu proyecto. Aquí un ejemplo que muestra cómo sería la baseUrl basándose en el root del proyecto:&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;"compilerOptions"&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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="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;Una vez tenemos la baseUrl, ya podemos definir nuestros path aliases. ¡Olé!&lt;/p&gt;

&lt;h3&gt;
  
  
  Path aliases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;root&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;src&lt;/li&gt;
&lt;li&gt;api&lt;/li&gt;
&lt;li&gt;shared

&lt;ul&gt;
&lt;li&gt;generics&lt;/li&gt;
&lt;li&gt;utils&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Dentro de la carpeta src están las carpetas api y shared . Los import aliases que quiero configurar son para poder importar los archivos que estén dentro de la carpeta de generics y utils.&lt;/p&gt;

&lt;p&gt;Venga, ya lo importante. Aquí te muestro cómo quedaría nuestro &lt;code&gt;tsconfig.json&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"compilerOptions"&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;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"paths"&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;"@utils/*"&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="s2"&gt;"shared/utils/*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"@generics/*"&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="s2"&gt;"shared/generics/*"&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta forma podremos importar nuestros archivos de una forma mucho más limpia. Así nos quedarían los imports ahora:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;GenericRepository&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@generics/generic.repository&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solución de problemas
&lt;/h3&gt;

&lt;p&gt;¿Cómo? ¿En el editor parece que te va todo bien pero en la consola te salta el siguiente error?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Cannot find module '@generics/generic.repository'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¡No te preocupes! Aún nos queda un paso extra. Principalmente si estás utilizando la librería ts-node .&lt;/p&gt;

&lt;p&gt;El editor sabe que estás usando estos import aliases, pero para que funcione correctamente tenemos que ir poco más allá. Gracias a la librería &lt;a href="https://www.npmjs.com/package/tsconfig-paths" rel="noopener noreferrer"&gt;tsconfig-paths&lt;/a&gt; podemos hacer que nuestros bonitos imports funcionen a la perfección.&lt;/p&gt;

&lt;p&gt;Solo tendríamos que instalarla corriendo el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm install--save - dev tsconfig - paths
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y luego tendríamos que incluir esto en el script de ejecución de nuestra aplicación en el package.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-r tsconfig - paths / register
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En mi caso, el script quedaría así:&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;"scripts"&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;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ts-node-dev -r tsconfig-paths/register --env-file=.env.development index.ts"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Es bastante útil tener unos imports bien claros y lo más limpio posible. ¿Por qué? Pues porque ayuda a la lectura del código y evita tener ruido en nuestros archivos. Tanto tú como la gente que trabaje contigo lo agradeceréis.&lt;/p&gt;

&lt;p&gt;Además, creo que la ganancia de hacerlo en relación al esfuerzo que supone hace que merezca mucho la pena.&lt;/p&gt;

&lt;p&gt;¡Si tienes cualquier pregunta o comentario, no dudes en ponerlo por abajo!&lt;/p&gt;

&lt;p&gt;¡Saludos!&lt;/p&gt;

</description>
      <category>node</category>
      <category>typescript</category>
    </item>
    <item>
      <title>My first Angular Project!</title>
      <dc:creator>gonzalo</dc:creator>
      <pubDate>Fri, 24 May 2019 09:06:42 +0000</pubDate>
      <link>https://dev.to/gonzalo/my-first-angular-project-3251</link>
      <guid>https://dev.to/gonzalo/my-first-angular-project-3251</guid>
      <description>&lt;p&gt;A year ago, I started to study code online, and now I'm working in an English Academy as developer. &lt;/p&gt;

&lt;p&gt;After three months of hard work, we finally achieved our main goal, what was release the first viewable version. The next step is keep improving the website, as it still has some errors. &lt;/p&gt;

&lt;p&gt;The point is, this is my first Angular project and my first big project as well, so I'm very happy and I just wanted to share it with you!&lt;/p&gt;

&lt;p&gt;Here's the link in case you want to check it out: &lt;a href="https://www.americanlanguage.es/" rel="noopener noreferrer"&gt;https://www.americanlanguage.es/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
