<?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: Lew Yuburi</title>
    <description>The latest articles on DEV Community by Lew Yuburi (@lewisyuburi).</description>
    <link>https://dev.to/lewisyuburi</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%2F15550%2F1403f033-0ccb-4375-8545-c25b1fe15f7c.png</url>
      <title>DEV Community: Lew Yuburi</title>
      <link>https://dev.to/lewisyuburi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lewisyuburi"/>
    <language>en</language>
    <item>
      <title>Next.js + Typescript: mejora la manera en que importas componentes y módulos locales</title>
      <dc:creator>Lew Yuburi</dc:creator>
      <pubDate>Thu, 20 Feb 2020 17:52:15 +0000</pubDate>
      <link>https://dev.to/lewisyuburi/next-js-typescript-mejora-la-manera-en-que-importas-componentes-y-modulos-locales-42bc</link>
      <guid>https://dev.to/lewisyuburi/next-js-typescript-mejora-la-manera-en-que-importas-componentes-y-modulos-locales-42bc</guid>
      <description>&lt;p&gt;Un sinónimo de buena estructuración en un proyecto con Reactjs o Next.js a menudo es dividir los componentes y módulos en entidades más pequeñas para su efectiva reutilización y organización, haciendo así que sean más fáciles de mantener y escalar.&lt;/p&gt;

&lt;p&gt;Esto trae un consecuencia que, en lo personal, pienso que hace el código menos legible, confuso y suele ser frustrante: importar módulos o componentes organizados en otros directorios.&lt;/p&gt;

&lt;p&gt;Es muy probable que tengas en al menos un componente o módulo de TypeScript algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&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;../../../../../components/myComponent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;helperOne&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;helperTwo&lt;/span&gt; &lt;span class="p"&gt;}&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;../../../../../helpers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;En primera instancia, quizá no lo veas tan mal, pero honestamente, ¿podría deducirse de manera rápida dónde están ubicados estos módulos importados? y más allá: cuando debes importar un modulo ¿debes ir saltando entre directorios hasta llegar al que necesitas?&lt;/p&gt;

&lt;p&gt;Propongo algo mejor: &lt;strong&gt;absolute imports de TypeScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Con esto, podemos pasar del ejemplo anterior al esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&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;@components/myComponent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;helperOne&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;helperTwo&lt;/span&gt; &lt;span class="p"&gt;}&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;@helpers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Lo cual mejora un montón la experiencia de desarrollo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Comenzando
&lt;/h1&gt;

&lt;p&gt;Lo primero es inicializar y/o configurar el proyecto con Next.js y TypeScript. Para ello se creará un proyecto nuevo (en caso de no tenerlo ya) ejecutando los siguientes comandos y siguiendo los pasos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;# Con YARN&lt;/span&gt;
yarn create next-app

&lt;span class="c"&gt;# Con NPM&lt;/span&gt;
npm init next-app

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Esto configurará todo lo necesario para el proyecto, sin embargo, para agregar el soporte para TypeScript, se necesitan unos pasos adicionales, tal y como lo mencionan en su &lt;a href="https://nextjs.org/docs/basic-features/typescript"&gt;documentación oficial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Lo primero es ingresar al directorio raíz del proyecto y crear el archivo &lt;code&gt;tsconfig.json&lt;/code&gt; vacío:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;tsconfig.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Una vez creado este archivo, deben instalarse algunas dependencias adicionales necesarias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Con Yarn&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; typescript @types/react @types/node

&lt;span class="c"&gt;# Con NPM&lt;/span&gt;
npm i &lt;span class="nt"&gt;--dev&lt;/span&gt; typescript @types/react @types/node
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Se cambian las extensiones de archivo &lt;code&gt;.js&lt;/code&gt; a &lt;code&gt;.tsx&lt;/code&gt;/&lt;code&gt;.ts&lt;/code&gt; y finalmente se ejecuta el comando &lt;code&gt;npm run dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esto agregará la configuración necesaria al archivo &lt;code&gt;tsconfig.json&lt;/code&gt; y todo lo demás (como el archivo &lt;code&gt;next-env.d.ts&lt;/code&gt;) de manera automática.&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuración de TypeScript
&lt;/h1&gt;

&lt;p&gt;Ahora bien, para comenzar con nuestra configuración, necesitamos agregar la siguiente configuración al archivo &lt;code&gt;tsconfig.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// archivo tsconfig.json&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;compilerOptions&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;baseUrl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Aquí&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;paths&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="c1"&gt;// Aquí&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@helpers/*&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;helpers/*&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@components/*&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;components/*&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;La explicación de configuración les bastante simple e intuitiva:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;baseUrl&lt;/code&gt;: Directorio base para resolver nombres de módulos no relativos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;paths&lt;/code&gt;: Lista de entradas de asignación de ruta para nombres de módulos a ubicaciones relativas a la &lt;code&gt;baseUrl&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luego de hacer esto editores de texto como VS-Code automáticamente reconocerían los &lt;em&gt;alias&lt;/em&gt; configurados bajo la key &lt;code&gt;compilerOptions.paths&lt;/code&gt; en el archivo &lt;code&gt;tsconfig.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gcs7bZ-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qwfy8rkqth5rwzybon0g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gcs7bZ-2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qwfy8rkqth5rwzybon0g.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sin embargo, si intentamos compilar el código, arrojará el siguiente error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ error ] ./pages/api/index.ts
Module not found: Can't resolve '@helpers/router' ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Esto debido a que &lt;code&gt;WebPack&lt;/code&gt; no reconoce estas rutas al momento de compilar y empaquetar el código, así que es el siguiente paso.&lt;/p&gt;

&lt;h1&gt;
  
  
  Configuración de WebPack
&lt;/h1&gt;

&lt;p&gt;Para acceder a la configuración de WebPack en NextJs, debe hacerse desde el archivo de configuración de Next.js &lt;code&gt;next.config.js&lt;/code&gt;, para este caso especifico, hay una vía fácil: instalar el &lt;a href="https://github.com/dividab/tsconfig-paths-webpack-plugin"&gt;plugin&lt;/a&gt; &lt;code&gt;tsconfig-paths-webpack-plugin&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Con Yarn&lt;/span&gt;
yarn add &lt;span class="nt"&gt;--dev&lt;/span&gt; tsconfig-paths-webpack-plugin

&lt;span class="c"&gt;# Con NPM&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; tsconfig-paths-webpack-plugin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Y para configurarlo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// archivo next.config.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TsconfigPathsPlugin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tsconfig-paths-webpack-plugin&lt;/span&gt;&lt;span class="dl"&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;webpack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt; &lt;span class="o"&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;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;TsconfigPathsPlugin&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;config&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;Para saber más sobre cómo acceder a la configuración de WebPack desde Next.Js puedes hacerlo desde &lt;a href="https://nextjs.org/docs/api-reference/next.config.js/custom-webpack-config"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Con esto ya debería funcionar todo &lt;em&gt;like a charm&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Espero les sirva y mejoren sus &lt;code&gt;imports&lt;/code&gt; y sean coders más felices. Cualquier duda, opinión o critica es bien recibida en los comentarios.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Easy code, easy life ~&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>typescript</category>
      <category>tips</category>
      <category>react</category>
    </item>
    <item>
      <title>How do you store large forms in database?</title>
      <dc:creator>Lew Yuburi</dc:creator>
      <pubDate>Fri, 19 Jul 2019 14:33:31 +0000</pubDate>
      <link>https://dev.to/lewisyuburi/how-do-you-store-large-forms-in-database-4jj7</link>
      <guid>https://dev.to/lewisyuburi/how-do-you-store-large-forms-in-database-4jj7</guid>
      <description>&lt;p&gt;Hi, I have a huge form (for diagnosis, a lot of questions) and I need to store the answers into database, what's the best way for do this? Thanks in advance&lt;/p&gt;

&lt;p&gt;Edit: I'm using a SQL database, PostgreSQL&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
  </channel>
</rss>
