<?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>Forem: ulysses316</title>
    <description>The latest articles on Forem by ulysses316 (@ulysses316).</description>
    <link>https://forem.com/ulysses316</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%2F387175%2F2d5530a5-2ae1-4b6f-9b75-2361d3fec802.jpeg</url>
      <title>Forem: ulysses316</title>
      <link>https://forem.com/ulysses316</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ulysses316"/>
    <language>en</language>
    <item>
      <title>Migrando a Tailwind 4 en Next.js 15</title>
      <dc:creator>ulysses316</dc:creator>
      <pubDate>Fri, 24 Jan 2025 05:35:36 +0000</pubDate>
      <link>https://forem.com/ulysses316/migrando-a-tailwind-4-en-nextjs-15-446g</link>
      <guid>https://forem.com/ulysses316/migrando-a-tailwind-4-en-nextjs-15-446g</guid>
      <description>&lt;h2&gt;
  
  
  Lanzamiento de TailwindCSS 4.0
&lt;/h2&gt;

&lt;p&gt;El día de ayer (22 de enero del 2025) salió oficialmente la versión 4.0 de TailwindCSS. Esta versión trae consigo varias mejoras, una de ellas es que ya no será necesario tener un archivo de configuración &lt;em&gt;tailwind.config.js&lt;/em&gt;. Si bien este puede seguir existiendo, lo mejor es aprovechar la nueva integración directamente en el archivo CSS principal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto de la migración
&lt;/h2&gt;

&lt;p&gt;Este artículo no hablará de todos los cambios en Tailwind, sino que se centrará en algunos problemas que encontré al migrar un proyecto que había iniciado recientemente. Pensé que sería una buena idea probar la nueva versión de Tailwind, así que decidí actualizar directamente.&lt;/p&gt;

&lt;p&gt;La página oficial ya ofrece una &lt;a href="https://tailwindcss.com/docs/upgrade-guide" rel="noopener noreferrer"&gt;guía&lt;/a&gt; bastante completa para realizar la migración. Incluye un script para hacer el upgrade automáticamente, y en mi caso funcionó bastante bien, salvo algunos pequeños inconvenientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuración del proyecto
&lt;/h2&gt;

&lt;p&gt;En mi proyecto utilizo las siguientes herramientas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tailwind Typography&lt;/li&gt;
&lt;li&gt;Next Themes&lt;/li&gt;
&lt;li&gt;Fuentes de Google directamente con next/font/google&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Problemas encontrados tras la migración
&lt;/h2&gt;

&lt;p&gt;Una vez que ejecuté el script de migración y corrí el proyecto, casi todo funcionó correctamente, excepto dos aspectos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mis colores personalizados definidos en el archivo de configuración de Tailwind.&lt;/li&gt;
&lt;li&gt;Las fuentes definidas en el layout de Next.js.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En los componentes donde definía los colores y las propiedades de manera explícita, todo funcionaba bien. Sin embargo, suelo agregar clases generales en el body para el color de fondo y las letras del tema claro y oscuro, y esto era lo que fallaba.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfh8x439u2nrkeraays9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzfh8x439u2nrkeraays9.png" alt="Extracto de codigo TSX" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El script de migración trasladó toda mi configuración de Tailwind al archivo CSS y actualizó los nombres de las clases que debían cambiar, incluyendo el plugin de Tailwind Typography. Incluso las clases personalizadas que creé para expandir Tailwind funcionaban correctamente. Sin embargo, ignoraba mis directrices generales.&lt;/p&gt;

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

&lt;p&gt;El problema estaba en que mi archivo CSS sobrescribía los estilos del body.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftwuhvzsgfv4kokzex6xh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftwuhvzsgfv4kokzex6xh.png" alt="Extracto de codigo CSS" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta clase se agrega por defecto al crear un proyecto en Next.js, y olvidé quitarla. Normalmente, con Tailwind puedes sobrescribir esto, pero no había revisado el archivo CSS.&lt;/p&gt;

&lt;p&gt;Además, mi archivo CSS contenía variables que no utilizaba:&lt;/p&gt;

&lt;p&gt;Aunque estas variables no afectaron mi flujo porque todos mis estilos están definidos con Tailwind, es buena práctica eliminarlas si no se van a usar.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Problema con las fuentes
&lt;/h3&gt;

&lt;p&gt;Mis fuentes no se respetaban en ningún lugar donde utilizaba la clase generada por Tailwind. Esto se debía a que en Next.js declaraba las variables de fuentes con un nombre diferente al utilizado en el archivo de configuración de Tailwind.&lt;/p&gt;

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

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

&lt;p&gt;En esta versión de Tailwind, que trabaja a nivel CSS, es necesario ser más explícito y usar el mismo nombre tanto en el archivo CSS como en el layout de Next.js. De lo contrario, el navegador no encontrará la variable definida.&lt;/p&gt;

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

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

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

&lt;p&gt;Migrar a TailwindCSS 4.0 ofrece muchas ventajas, pero también requiere atención a detalles que muchas veces se dejan de lado, ya que Tailwind se encargaba de ellos. Revisar y ajustar los estilos generales y las variables puede evitar problemas comunes. Espero que esta experiencia te sea útil si decides dar el salto a esta nueva versión.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Foto de portada de:&lt;/em&gt; &lt;a href="https://www.pexels.com/es-es/foto/foto-de-pintura-abstracta-rosa-y-azul-2471235/" rel="noopener noreferrer"&gt;Luis Quintero&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>nextjs</category>
      <category>tailwindcss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Acelera tu desarrollo con TailwindCSS.</title>
      <dc:creator>ulysses316</dc:creator>
      <pubDate>Fri, 15 Mar 2024 05:52:06 +0000</pubDate>
      <link>https://forem.com/ulysses316/acelera-tu-desarrollo-con-tailwindcss-pt-1-3dhk</link>
      <guid>https://forem.com/ulysses316/acelera-tu-desarrollo-con-tailwindcss-pt-1-3dhk</guid>
      <description>&lt;p&gt;Hablemos de &lt;strong&gt;TailwindCSS&lt;/strong&gt;, seguramente si eres desarrollador web y estás empezando con frameworks CSS, hayas escuchado hablar de &lt;strong&gt;Tailwind&lt;/strong&gt;, pero al momento de buscarlo puede que te hayas llevado una mala impresión. No te preocupes, en este artículo vamos a hablar de sus fundamentos y porque es que es tan popular en la industria.&lt;/p&gt;

&lt;p&gt;En este artículo te quiero llevar en tus primeros pasos con este framework, para que puedas conocer qué cosas son las que me enamoraron de él.&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Qué vamos a ver en este artículo?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Instalación&lt;/li&gt;
&lt;li&gt;Configuración&lt;/li&gt;
&lt;li&gt;Fundamentos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cabe mencionar, que vamos a ver cosas que puedes encontrar en la &lt;a href="https://tailwindcss.com" rel="noopener noreferrer"&gt;documentación&lt;/a&gt;, pero de una manera super resumida, así que te invito a echarle el ojo después de terminar de leer este artículo. 👀&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalación
&lt;/h1&gt;

&lt;p&gt;Vamos a hacer un proyecto sencillo, con puro HTML, CSS y JS.&lt;br&gt;
A mí me gusta trabajar en Debian, así que todos los comandos que utilizaré seran de esta distribución y también utilizaré PNPM, para instalar los paquetes, pero sin problemas se puede hacer con el manejador de paquetes más te guste.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;tailwind-example &lt;span class="c"&gt;# Creamos una carpeta llamada tailwind-example para nuestro proyecto&lt;/span&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;tailwind-example &lt;span class="c"&gt;# Ingresamos a la carpeta&lt;/span&gt;

pnpm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; tailwindcss &lt;span class="c"&gt;# Instalamos tailwind como dependencia de desarrollo&lt;/span&gt;

pnpm tailwindcss init &lt;span class="c"&gt;# Inicializamos nuestro archivo de configuración de tailwind&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Una vez que ya tenemos instalado tailwind en nuestro proyecto, lo primero que tenemos que hacer es asegurarnos de que tengamos la configuración adecuada para leer nuestros archivos y podamos compilar correctamente el CSS que necesitemos.&lt;/p&gt;

&lt;p&gt;El último comando que utilizamos nos crea el archivo de configuración de tailwind, en él lo primero que tenemos que hacer es decirle a qué archivos tiene que observar, buscando cambios en las clases para poder aplicarlo.&lt;/p&gt;

&lt;p&gt;El archivo que vamos a tener al iniciar nuestro proyecto será el siguiente.&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="cm"&gt;/** @type {import('tailwindcss').Config} */&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;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro de nuestra sección de &lt;strong&gt;&lt;em&gt;content&lt;/em&gt;&lt;/strong&gt; es donde definimos donde se encontraran nuestros archivos HTML (o js, jsx, tsx, según sea el proyecto que estemos creando.) para hacerlo hay dos patrones importantes que nos servirán.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;*&lt;/code&gt; Para que busque cualquier cosa (archivos principalmente) excepto a los que se encuentren en sub-carpetas y archivos ocultos.&lt;br&gt;
&lt;code&gt;**&lt;/code&gt; Para que busque en el directorio actual, o subdirectorios.&lt;/p&gt;

&lt;p&gt;Veamos algunos ejemplos.&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="nx"&gt;content&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="s1"&gt;./pages/**/*.{html,js}&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="s1"&gt;./components/*.{html,js}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el primer ejemplo de este código, le estamos diciendo, que busque cualquier archivo con terminación .html o .js, que se encuentre en cualquier subdirectorio o en el mismo directorio de pages.&lt;br&gt;
El segundo ejemplo, es casi igual, con la diferencia, de que al no tener &lt;code&gt;**&lt;/code&gt; no buscara archivos en subdirectorios, únicamente buscara archivos .html o .js, dentro de esta carpeta.&lt;/p&gt;

&lt;p&gt;Para este proyecto que haremos, utilizaré la siguiente estructura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczc8wuosi8t5xlcyiaxh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fczc8wuosi8t5xlcyiaxh.png" alt="Image description" width="745" height="497"&gt;&lt;/a&gt;&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="cm"&gt;/** @type {import('tailwindcss').Config} */&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;content&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;./*.{html,js}&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;index.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por ultimo, te dejo como advertencia no usar una instrucción tan amplia como la siguiente &lt;code&gt;./**/*.{html,js}&lt;/code&gt; ya que esto tambien buscaria dentro de nuestra carpeta node_modules, y traeria problemas de rendimiento.&lt;/p&gt;

&lt;p&gt;Bien, ya casi podemos comenzar con nuestro codigo.&lt;br&gt;
Unicamente nos hacen falta 3 pasos más, pero te prometo que despues de esto veras un verdadero cambio en la velocidad en la que haces paginas web.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creando archivos CSS
&lt;/h2&gt;

&lt;p&gt;Seguramente te estas preguntando porque estamos creando archivos CSS, si se supone que tailwind es una super libreria que nos ayuda con eso.&lt;br&gt;
Bueno, esto es porque tailwind no trabaja como otros frameworks que tenemos en el mercado, tailwind no te mete todos los estilos de su libreria en tu proyecto, lo que hace es crearte un archivo CSS, unicamente con las clases que utilizaste, esto ayudando enormemente en el tamaño final de tu aplicación.&lt;/p&gt;

&lt;p&gt;Bien, pues entonces te invito a crear una carpeta styles (o como gustes llamarle) en tu proyecto y crees dos archivos, uno que sera el base, en el cual escribiremos las siguientes 3 lineas de codigo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@tailwind&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y el otro archivo lo dejaremos tal cual.&lt;/p&gt;

&lt;p&gt;¿Lo tienes? perfecto, entonces ahora podemos ir a la terminal y escribir el siguiente comando en la raiz de nuestro proyecto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm tailwind &lt;span class="nt"&gt;-i&lt;/span&gt; styles/base.css &lt;span class="nt"&gt;-o&lt;/span&gt; styles/master.css &lt;span class="nt"&gt;--watch&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este comando le estamos diciendo que ejecute el comando &lt;strong&gt;tailwind&lt;/strong&gt; con la instruccion &lt;code&gt;-i&lt;/code&gt; le decimos que le vamos a pasar un archivo de entrada, el cual tiene que ser el archivo al cual le agregamos las 3 lineas de codigo.&lt;br&gt;
Con la instrucción &lt;code&gt;-o&lt;/code&gt; le decimos que ese archivo sera su archivo de salida, en el cual vaciara todas los estilos que vayamos ocupando, ademas de un barrido a los estilos predeterminados de las etiquetas.&lt;br&gt;
Y por ultimo, la instruccion &lt;code&gt;--watch&lt;/code&gt; le decimos que se mantenga atento a cualquier cambio que haya dentro de estos archivos.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creando nuestro archivo HTML.
&lt;/h2&gt;

&lt;p&gt;Finalmente tenemos todo nuestro ambiente creado para poder trabajar con este famoso framework.&lt;br&gt;
Vamos a crear nuestro archivo html, y lo unico que tenemos que hacer es importar el archivo de salida que le indicamos en el comando anterior, en mi caso, quedaria asi.&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="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&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;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&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, initial-scale=1.0"&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;href=&lt;/span&gt;&lt;span class="s"&gt;"./styles/master.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Document&lt;span class="nt"&gt;&amp;lt;/title&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;body&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;Muchos pasos para utilizar un framework, ¿no?, ¿porque no usar Bootstrap, Materialize, UIKit, o cualquier otro framework que hay alla afuera?&lt;/p&gt;

&lt;p&gt;Bueno, ahora si podemos hablar de los fundamentos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fundamentos
&lt;/h1&gt;

&lt;p&gt;Emepecemos viendo como seria crear un componente con HTML y CSS tradicional y despues veamos como seria utilizando Tailwind&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhth22983c3e9np61vc2q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhth22983c3e9np61vc2q.png" alt="Image description" width="800" height="278"&gt;&lt;/a&gt;&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"chat-notification"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"chat-notification-logo-wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"chat-notification-logo"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/img/logo.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"ChitChat Logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"chat-notification-content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h4&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"chat-notification-title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;ChitChat&lt;span class="nt"&gt;&amp;lt;/h4&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"chat-notification-message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;You have a new message!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora veamos el codigo que usariamos en tailwind.&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"p-6 max-w-sm mx-auto bg-white rounded-xl shadow-lg flex items-center space-x-4"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"shrink-0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"h-12 w-12"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/img/logo.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"ChitChat Logo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-xl font-medium text-black"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;ChitChat&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-slate-500"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;You have a new message!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De primera instancia se ve bastante feo, vemos muchas clases en una misma etiqueta, expliquemos un poco las clases que tenemos en este elemento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;p-6 - padding: 1.5rem; /* 24px */&lt;/li&gt;
&lt;li&gt;max-w-sm - max-width: 24rem; /* 384px */&lt;/li&gt;
&lt;li&gt;mx-auto - margin-left: auto; / margin-right: auto;&lt;/li&gt;
&lt;li&gt;bg-white - background-color: rgb(255 255 255);&lt;/li&gt;
&lt;li&gt;rounded-xl - border-radius: 0.75rem; /* 12px */&lt;/li&gt;
&lt;li&gt;shadow-lg - box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);&lt;/li&gt;
&lt;li&gt;flex - display: flex;&lt;/li&gt;
&lt;li&gt;items-center - align-items: center;&lt;/li&gt;
&lt;li&gt;space-x-4 - margin-left: 1rem; /* 16px */&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Creo que ya te puedes dar una idea de que va tailwind, ¿no?&lt;br&gt;
es antintuitivo hacer algo asi en CSS, tener tantas clases para cosas tan sencillas es raro, hemos aprendido que tenemos que crear clases que contengan las instrucciones especificas para cada elemento, pero hablemos de las ventajas de hacer esto.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. No estás desperdiciando energía inventando nombres de clases.
&lt;/h2&gt;

&lt;p&gt;Este punto se explica bastante bien solo, jaja.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Tu CSS deja de crecer.
&lt;/h2&gt;

&lt;p&gt;Siempre que estamos creando paginas web, es normal que nuestro CSS siga creciendo y creciendo, por cada cosa nueva que añadimos, y al final tenemos un archivo CSS enorme, el cual es bastante dificil de mantener.&lt;/p&gt;

&lt;p&gt;Prueba esta en el CSS que se utiilza para crear el componente que vimos anteriormente, te mostre el HTML, pero no el CSS, el cual es el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;  &lt;span class="nc"&gt;.chat-notification&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="m"&gt;25px&lt;/span&gt; &lt;span class="m"&gt;-5px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;-5px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.chat-notification-logo-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.chat-notification-logo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.chat-notification-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.chat-notification-title&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="m"&gt;#1a202c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.chat-notification-message&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="m"&gt;#718096&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.5&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;Y con Tailwind no tenemos ni una sola linea de CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Hacer cambios se siente más seguro.
&lt;/h2&gt;

&lt;p&gt;Cuando creamos CSS, muchas veces queremos optimizar y creamos clases que creemos que podemos utilizar en varias partes de nuestra pagina, pero esto aveces no nos sale de la mejor forma, y resulta que en una seccion esa clase no nos sirvio y tenemos que cambiarla o crear otra con una pequeña diferencia.&lt;br&gt;
Y si tomamos la desición de cambiarla corremos el riesgo de descuadrar la pagina.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. ¿Que hay de otros frameworks?
&lt;/h2&gt;

&lt;p&gt;Otros frameworks tambien nos dan mucha libertad de personalizacion, pero siempre partimos de un diseño inicial el cual nos marcan los desarrolladores, y algunas cosas que no podamos cambiar con sus propias clases tenemos que hacerlas de manera manual, y terminamos creando mas CSS.&lt;/p&gt;

&lt;p&gt;¿Ahora ves que ventajas tiene tailwind sobre la programacion tradicional o sobre otros frameworks?&lt;/p&gt;

&lt;h1&gt;
  
  
  ¿Porque no utilizar estilos en linea?
&lt;/h1&gt;

&lt;p&gt;Esa es una pregunta que se hacen muchos cuando ven tailwind por primera vez.&lt;br&gt;
Si ya estoy creando una linea super larga con clases especificas para cada acción que quiero realizar, ¿porque no simplemente pongo mis estilos directamente en cada una?&lt;br&gt;
Veamos la respuesta de esto en tres puntos.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Constancia en los estilos.
&lt;/h2&gt;

&lt;p&gt;Tailwind tiene bien definidas sus clases, tiene una amplia gama de valores, pero al fin y al cabo tenemos una guia.&lt;br&gt;
Crear nuestros estilos en linea hace que cada etiqueta sea un mundo por si mismo, y que para cada modificacion nos veamos en la necesidad de leer toda la linea para entender como funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Responsive design.
&lt;/h2&gt;

&lt;p&gt;Aqui viene la primer cosa que cuando escuche me volo la cabeza, con tailwind podemos usar mediaqueries directamente en nuestras clases, sin la necesidad de ir a especificarlo nosotros en nuestro CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Hover, focus y otros estados
&lt;/h2&gt;

&lt;p&gt;Al igual que con las media queries, podemos hacer uso de estados como hover, focus, active y pseudoclases como after, before, y muchas mas.&lt;/p&gt;

&lt;p&gt;Espero que con esta pequeña introducción te haya convencido un poco de darle una oportunidad a tailwind, si es asi, te invito a que me dejes algun comentario, para ver si escribimos una segunda parte, con un poco de codigo de tailwind en accion.&lt;/p&gt;

&lt;p&gt;Cualquier duda, sugerencia u opinión son bien recibidas en la sección de comentarios 😁&lt;br&gt;&lt;br&gt;
Pueden encontrarme en &lt;a href="https://twitter.com/ulysses_316" rel="noopener noreferrer"&gt;&lt;em&gt;Twitter&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://github.com/ulysses316" rel="noopener noreferrer"&gt;&lt;em&gt;Github&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/ulysses316/" rel="noopener noreferrer"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://www.instagram.com/ulysses.316/" rel="noopener noreferrer"&gt;&lt;em&gt;Instagram&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Foto de portada de &lt;a href="https://www.pexels.com/es-es/foto/cuadro-abstracto-multicolor-1509534/" rel="noopener noreferrer"&gt;Steve Johnson&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>tailwindcss</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Hello World- Deno 1.0 [Articulo de 2020]</title>
      <dc:creator>ulysses316</dc:creator>
      <pubDate>Mon, 17 Jul 2023 07:07:05 +0000</pubDate>
      <link>https://forem.com/ulysses316/hello-world-deno-10-articulo-de-2020-5gdk</link>
      <guid>https://forem.com/ulysses316/hello-world-deno-10-articulo-de-2020-5gdk</guid>
      <description>&lt;p&gt;En este articulo solo haremos una breve introducción a Deno, pero les recomendamos el articulo de &lt;a href="https://blog.logrocket.com/author/davidelse/" rel="noopener noreferrer"&gt;&lt;strong&gt;David Else&lt;/strong&gt;&lt;/a&gt; que pueden encontrar &lt;a href="https://blog.logrocket.com/deno-1-0-what-you-need-to-know/" rel="noopener noreferrer"&gt;&lt;strong&gt;aquí&lt;/strong&gt;&lt;/a&gt;, el articulo de &lt;a href="https://dev.to/aralroca"&gt;&lt;strong&gt;Aral Roca&lt;/strong&gt;&lt;/a&gt; que les dejamos &lt;a href="https://dev.to/aralroca/learn-deno-chat-app-37f0"&gt;&lt;strong&gt;aquí&lt;/strong&gt;&lt;/a&gt; y de la documentación de &lt;a href="https://deno.land/" rel="noopener noreferrer"&gt;&lt;strong&gt;Deno&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Un poco de historia
&lt;/h1&gt;

&lt;p&gt;Deno fue anunciado en la JSConf EU del 2018 por &lt;a href="https://tinyclouds.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;Ryan Dahl&lt;/strong&gt;&lt;/a&gt; quien fue la persona la cual inicio el proyecto &lt;a href="https://nodejs.org/es/" rel="noopener noreferrer"&gt;&lt;strong&gt;Node&lt;/strong&gt;&lt;/a&gt; hace ya casi 11 años.&lt;br&gt;&lt;br&gt;
En la JSConf Ryan Dahl nos contó lo que seria el proyecto Deno en el cual estaba trabajando, a través de su charla &lt;strong&gt;“&lt;/strong&gt;&lt;a href="https://www.youtube.com/watch?v=M3BM9TB-8yA" rel="noopener noreferrer"&gt;&lt;strong&gt;10 Things I Regret About Node.js&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;”&lt;/strong&gt; donde podemos resaltar los siguientes puntos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Lenguajes dinámicos:Estos son fabulosos para ciertas cosas, sin embargo, en un servidor uno desearía que las cosas fueran estáticas.&lt;/li&gt;
&lt;li&gt;  Seguridad: Node puede acceder a todas las funciones del sistema sin restricción alguna y a funciones de la red. Esto es principalmente peligroso al momento de instalar paquetes desconocidos a través de npm&lt;/li&gt;
&lt;li&gt;  API asíncronas: Las promesas fueron agregadas en 2009 y eliminadas en 2010, esto provoca que muchas librerías tengan código obsoleto en su núcleo.&lt;/li&gt;
&lt;li&gt;  El sistema de compilación: Anteriormente cuando escribías o tenias un complemento de Node, que no son nadamas que módulos nativos de Node escritos en C o C++, donde tenias que correrlos en tu maquina primero, para que una vez compilados se utilizara una herramienta como &lt;em&gt;node-gyp&lt;/em&gt; para poder acceder a los datos de esta, lo cual se volvía un verdadero fastidio.
La compatibilidad de JSON entre Node y python se vuelve verdaderamente tedioso, por todo el diseño adicional que tiene Node.&lt;/li&gt;
&lt;li&gt;  Node modules y package.json: Aqui el principal problema es que nuestros modulos no son compatibles con los navegadores, por lo que no podemos tener una aplicacion uniforme.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  ¿Que es Deno y como trabaja?
&lt;/h1&gt;

&lt;p&gt;Deno es un entorno de ejecución de javascript y de typescript, al igual que su entorno hermano Node usa el motor V8 como núcleo para compilar javascript. Otra gran diferencia entre estos dos entornos es el lenguaje con el cual fueron escritos, Siendo este escrito en rust, y &lt;em&gt;Node&lt;/em&gt; en C y C++&lt;br&gt;&lt;br&gt;
Este asume el papel tanto de entorno de ejecución como el de administrador de paquetes, haciendo innecesaria una segunda instalación de algún distribuidor como seria npm.&lt;/p&gt;

&lt;p&gt;Este busca ser un entorno de scripting productivo y seguro, buscando enfatizar en la arquitectura basada en eventos.&lt;br&gt;&lt;br&gt;
También nos proporciona un núcleo de utilidades síncronas y asíncronas, donde puede ser usado para crear servidores web, realizar cálculos científicos, entre otras cosas.&lt;/p&gt;
&lt;h1&gt;
  
  
  Instalación
&lt;/h1&gt;

&lt;p&gt;Tenemos varias formas de instalación, las cuales podemos ver con mas detalle en la &lt;a href="https://deno.land/" rel="noopener noreferrer"&gt;&lt;strong&gt;documentación&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Shell
&lt;code&gt;curl -fsSL https://deno.land/x/install/install.sh | sh&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  PowerShell
&lt;code&gt;iwr https://deno.land/x/install/install.ps1 -useb | iex&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Homebrew (MacOS y/o Linux)
&lt;code&gt;brew install deno&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Chocolatey (Windows)
&lt;code&gt;choco install deno&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para asegurarnos que todo se instalo correctamente podemos usar el siguiente comando para ver la versión de Deno que tenemos instalada.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deno --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Y esto nos regresara lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deno 1.0.0-rc1&lt;br&gt;
v8 8.2.308  &lt;br&gt;
typescript 3.8.3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Si queremos inspeccionar el resto de comandos que tenemos a nuestra disposición podemos correr lo siguiente.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deno help&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Y esto nos visualizara los siguientes comandos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;USAGE:  
    deno &lt;span class="se"&gt;\[&lt;/span&gt;OPTIONS&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;SUBCOMMAND&lt;span class="se"&gt;\]&lt;/span&gt;  

OPTIONS:  
    &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;                     Prints &lt;span class="nb"&gt;help &lt;/span&gt;information  
    &lt;span class="nt"&gt;-L&lt;/span&gt;, &lt;span class="nt"&gt;--log-level&lt;/span&gt; &amp;lt;log-level&amp;gt;    Set log level &lt;span class="se"&gt;\[&lt;/span&gt;possible values: debug, info&lt;span class="se"&gt;\]&lt;/span&gt;  
    &lt;span class="nt"&gt;-q&lt;/span&gt;, &lt;span class="nt"&gt;--quiet&lt;/span&gt;                    Suppress diagnostic output  
    &lt;span class="nt"&gt;-V&lt;/span&gt;, &lt;span class="nt"&gt;--version&lt;/span&gt;                  Prints version information  

SUBCOMMANDS:  
    bundle         Bundle module and dependencies into single file  
    cache          Cache the dependencies  
    completions    Generate shell completions  
    doc            Show documentation &lt;span class="k"&gt;for &lt;/span&gt;a module  
    &lt;span class="nb"&gt;eval           &lt;/span&gt;Eval script  
    &lt;span class="nb"&gt;fmt            &lt;/span&gt;Format &lt;span class="nb"&gt;source &lt;/span&gt;files  
    &lt;span class="nb"&gt;help           &lt;/span&gt;Prints this message or the &lt;span class="nb"&gt;help &lt;/span&gt;of the given subcommand&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;  
    info           Show info about cache or info related to &lt;span class="nb"&gt;source &lt;/span&gt;file  
    &lt;span class="nb"&gt;install        &lt;/span&gt;Install script as an executable  
    repl           Read Eval Print Loop  
    run            Run a program given a filename or url to the module  
    &lt;span class="nb"&gt;test           &lt;/span&gt;Run tests  
    types          Print runtime TypeScript declarations  
    upgrade        Upgrade deno executable to newest version  

ENVIRONMENT VARIABLES:  
    DENO&lt;span class="se"&gt;\_&lt;/span&gt;DIR             Set deno&lt;span class="s1"&gt;'s base directory (defaults to $HOME/.deno)  
    DENO\_INSTALL\_ROOT    Set deno install'&lt;/span&gt;s output directory  
                         &lt;span class="o"&gt;(&lt;/span&gt;defaults to &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.deno/bin&lt;span class="o"&gt;)&lt;/span&gt;  
    NO&lt;span class="se"&gt;\_&lt;/span&gt;COLOR             Set to disable color  
    HTTP&lt;span class="se"&gt;\_&lt;/span&gt;PROXY           Proxy address &lt;span class="k"&gt;for &lt;/span&gt;HTTP requests  
                         &lt;span class="o"&gt;(&lt;/span&gt;module downloads, fetch&lt;span class="o"&gt;)&lt;/span&gt;  
    HTTPS&lt;span class="se"&gt;\_&lt;/span&gt;PROXY          Same but &lt;span class="k"&gt;for &lt;/span&gt;HTTPS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Hello world
&lt;/h1&gt;

&lt;p&gt;Como lo hemos estado diciendo durante todo el articulo, Deno nació para poder mejorar muchas de las “malas practicas” que Node venia arrastrando desde hace años por ser un proyecto demasiado grande, que difícilmente podía reestructurar todo su núcleo.&lt;br&gt;&lt;br&gt;
Sin embargo ya desde un inicio podemos ver algunos cambios a la hora de correr un programa desde este entorno.&lt;/p&gt;

&lt;p&gt;Ahora para crear nuestro hello world podemos hacer uso de un archivo de extensión javascript o de uno de extensión de typescript y Deno se encargara de correr ambos automáticamente.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;hello.ts&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;console.log('Hello world from Deno');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Lo que tenemos que hacer para poder correr nuestro archivo es usar el siguiente comando.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deno run hello.ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;En el caso de nuestro archivo .ts Deno se encargara internamente de compilarlo y correrlo en nuestro programa, ya que este viene con configuraciones iniciales que nos permitirá probar typescript desde un inicio, pero también nos brinda la posibilidad de crear un archivo de configuración con el cual podamos adaptar typescript a nuestro proyecto.&lt;/p&gt;

&lt;p&gt;Cabe mencionar que Deno trata de seguir estándares tanto como es posible, por lo que podremos usar fetch, Window, Worker, entre otros. Nuestro código debe de ser compatible tanto con Deno como con el navegador.&lt;/p&gt;

&lt;p&gt;Tambien nos permite correr programas remotamente, como viene explicado en la documentación, por lo que otra manera de correr nuestro hello world es de la siguiente manera.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deno run https://deno.land/std/examples/welcome.ts&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Serve an index.html
&lt;/h1&gt;

&lt;p&gt;En esta parte del post uso un ejemplo de &lt;a href="https://dev.to/aralroca"&gt;&lt;strong&gt;Aral Roca&lt;/strong&gt;&lt;/a&gt; por lo que los invito a darse una vuelta por su &lt;a href="https://dev.to/aralroca/learn-deno-chat-app-37f0"&gt;&lt;strong&gt;articulo&lt;/strong&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deno tiene su propia librería y para usarla debemos de importar directamente la url de esta en nuestro código como lo veremos en unos momentos.&lt;br&gt;&lt;br&gt;
Lo primero que tenemos que hacer es crear nuestro archivo html y el archivo que se encargara de levantar nuestro servidor, este puede ser .ts o .js&lt;/p&gt;

&lt;p&gt;&lt;em&gt;index.html&lt;/em&gt;&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="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;  
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&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;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, initial-scale=1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;  
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Example using Deno&lt;span class="nt"&gt;&amp;lt;/title&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;body&amp;gt;&lt;/span&gt;index.html served correctly&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;&lt;em&gt;server.ts&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;listenAndServe&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="s2"&gt;https://deno.land/std/http/server.ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="nf"&gt;listenAndServe&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&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="p"&gt;{&lt;/span&gt;  
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;  
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
      &lt;span class="na"&gt;headers&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;Headers&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;  
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&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;text/html&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;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./index.html&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on localhost:3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora hablemos de dos de las grandes mejoras que este entorno tiene.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Como mencionamos al principio uno de los objetivos de Deno fue erradicar los node_modules y el package.json ¿y como es que hace esto? simplemente permitiendo agregar la url de los paquetes que necesitemos directamente en nuestro código. La primera vez que corramos nuestro programa instalara todas las dependencias que hayamos declarado en nuestro código y las guardara en el cache para que esto no se tenga que repetir cada vez que volvamos a iniciar nuestro programa y para limpiar este cache únicamente necesitaremos usar el comando&lt;code&gt;--reload&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; También hablamos de los problemas de seguridad de Node los cuales eran el permitir la lectura de archivos desde cualquier punto de nuestro programa o de terceros y el acceso a la red sin ningún tipo de restricción.
Si tratamos de correr nuestro programa sin mas Deno nos dira lo siguiente:&lt;code&gt;Uncaught PermissionDenied: network access to "127.0.0.1:3000", run again with the --allow-net flag&lt;/code&gt;. Este no nos permitirá acceder a la red ni leer archivos sin que nosotros no otorguemos los permisos para hacerlo, esto incluye también a librerías de teceros, ya que muchos CLI podían hacer muchas cosas aun sin nuestro consentimiento. Con Deno es posible únicamente otorgar permisos de lectura a determinada carpeta o archivo, por ejemplo &lt;code&gt;deno --allow-read=/etc&lt;/code&gt;.
Para poder ver todos los permisos que podemos otorgar o denegar con Deno podemos usar el siguiente comando &lt;code&gt;deno run -h&lt;/code&gt; .&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Finalmente, para poder correr nuestro nuestro programa usaremos el siguiente comando.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deno run --allow-net --allow-read server.ts&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;En este caso use la bandera — reload para que se volvieran a instalar las dependencias.&lt;/p&gt;

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

&lt;p&gt;Espero que esta breve intro les motive a seguir investigando de Deno. Les dejo el link a la documentación y a algunos artículos de interés acerca del tema:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://deno.land/" rel="noopener noreferrer"&gt;Documentación de deno&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://dev.to/aralroca/learn-deno-chat-app-37f0"&gt;Learn Deno: Chat app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://blog.logrocket.com/deno-1-0-what-you-need-to-know/" rel="noopener noreferrer"&gt;Deno 1.0: What you need to know&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://medium.com/lean-mind/deno-node-js-killer-718c8969770b" rel="noopener noreferrer"&gt;Deno is the new Node?&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://deepu.tech/deno-runtime-for-typescript/#webassembly-support" rel="noopener noreferrer"&gt;Forget NodeJS! Build native TypeScript applications with Deno 🦖 (WebAssembly support)&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cualquier duda, sugerencia u opinión son bien recibidas en la sección de comentarios 😁&lt;br&gt;&lt;br&gt;
Pueden encontrarme en &lt;a href="https://twitter.com/ulysses_316" rel="noopener noreferrer"&gt;&lt;em&gt;Twitter&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://github.com/ulysses316" rel="noopener noreferrer"&gt;&lt;em&gt;Github&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/ulysses316/" rel="noopener noreferrer"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://www.instagram.com/ulysses.316/" rel="noopener noreferrer"&gt;&lt;em&gt;Instagram&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Foto de portada de &lt;a href="https://www.pexels.com/es-es/foto/foto-en-escala-de-grises-de-un-arbol-sin-hojas-3721374/" rel="noopener noreferrer"&gt;Magda Ehlers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spanish</category>
      <category>deno</category>
    </item>
  </channel>
</rss>
