<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Matias Hernandez - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Matias Hernandez - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 22 May 2026 20:03:00 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/matias-hernandez/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es Prettier? ]]>
                </title>
                <description>
                    <![CDATA[ Cuarto artículo de esta serie sobre herramientas orientadas a la experiencia de desarrollador revisamos Prettier. Puedes encontrar los artículos previos en:  * ¿Qué es Linting y ESLint? [/espanol/news/que-es-linting-y-eslint/]  * ¿Qué es npm? [/espanol/news/que-es-npm/]  * ¿Qué es Babel? [/espanol/news/que-es-babel/] ¿Qué es Prettier? En resumen y muy acotado, Prettier ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-prettier/</link>
                <guid isPermaLink="false">61d1ac990a738c094c2db2d9</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Tue, 04 Jan 2022 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/01/Prettier.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Cuarto artículo de esta serie sobre herramientas orientadas a la experiencia de desarrollador revisamos <strong>Prettier<strong>.</strong></strong></p><p>Puedes encontrar los artículos previos en:</p><ul><li><a href="https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/">¿Qué es Linting y ESLint?</a></li><li><a href="https://www.freecodecamp.org/espanol/news/que-es-npm/">¿Qué es npm?</a></li><li><a href="https://www.freecodecamp.org/espanol/news/que-es-babel/">¿Qué es Babel?</a></li></ul><h2 id="-qu-es-prettier">¿Qué es Prettier?</h2><p>En resumen y muy acotado, Prettier es un formateador automático de código. ¿Qué quiere decir esto?</p><p>Escribir código es una acción humana y como tal hay opiniones sobre como se debe escribir este código y no solamente desde el punto de vista algorítmico o técnico, si no, incluso se crean discusiones sobre estilos de "escritura" (Famosa es la "guerra sagrada" sobre si usar o no <code>;</code> es JavaScript o tabs vs espacios).</p><p>Al trabajar en un proyecto de código que incluya a más de una persona estas discusiones sobre como debería escribirse o no el código (guía de estilo) pueden mermar la productividad del equipo enfrascándose en nimiedades que pueden tornarse bastante molestas, por ejemplo, al revisar un pull-request. Las diferencias de estilo se mostrarán como cambios que en efecto no son parte del real desarrollo que se intenta lograr.</p><p>Prettier busca solucionar esto otorgando una serie de configuraciones y opiniones sobre esta guía de estilo.</p><p>Prettier ofrece soporte para múltiples lenguajes y frameworks.</p><ul><li>Javascript</li><li>JSX</li><li>Angular</li><li>Vue</li><li>Typescript</li><li>CSS</li><li>HTML</li><li>JSON</li><li>Graphql</li><li>Markdown</li><li>YAML</li></ul><p>Lo que ofrece Prettier es tomar tu código y "re-formatearlo" en base a las configuraciones definidas manteniendo así un estilo consistente.</p><p>Uno de los casos más comunes que podemos usar como ejemplo es el largo de la definición de una función:</p><pre><code class="language-javascript">function calcularMuchosArgumentos(unaVariableMuyLarga, otraVariableConUnNombreDeclarativo) </code></pre><p>Prettier tomará este trozo de código y automáticamente lo re-escribirá como</p><pre><code class="language-javascript">function calcularMuchosArgumentos(
    unaVariableMuyLarga,
    otraVariableConUnNombreDeclarativo
)</code></pre><p>Haciéndolo mucho más legible y sin intervención nuestra ni preocupación de como lo escribes inicialmente.</p><p>Finalmente, lo que Prettier otorga es una forma sencilla y automatizada de definir un <strong>estilo de código</strong> en todo tu proyecto ya que simplemente desecha el estilo original (el que fue escrito por un desarrollador) al re-escribirlo bajo las reglas y configuraciones definidas.</p><p></p><h2 id="-por-qu-querr-as-usar-prettier">¿Por qué querrías usar Prettier?</h2><p>Algo dejé entrever en el párrafo anterior. Definir una guía de estilo única en el proyecto que permita evitar discusiones innecesarias sobre cómo escribir código y evite conflictos a la hora de revisar cambios en el código.</p><p>Pero hay algunas otras ventajas como por ejemplo:</p><ul><li><strong>Ayudar a los nuevos desarrolladores del equipo</strong>. Quienes llegan a unirse a un equipo que ya lleva un tiempo trabajando no tendrán que aprender las reglas de estilo del equipo y acostumbrarse a nuevas formas de escribir su trabajo, evitando así gastar tiempo en tomar nuevos hábitos.</li><li><strong>Enfoque</strong>: Al usar una herramienta como prettier es fácil notar que tendrás un poco más de tiempo para enfocarte en lo que realmente importa en tu trabajo: <strong>escribir código</strong> sin preocuparte de formatear o estilizar lo que escribiste. Prettier tiene integraciones con la gran mayoría de editores de texto por lo que el formateo es completamente no-intrusivo y automático.</li><li><strong>Fácil adopción</strong>: Integrar Prettier en tu proyecto es sencillo y no generará cambios bruscos que debas tener en cuenta.</li></ul><h2 id="-qu-diferencia-hay-entre-prettier-y-un-linter-c-mo-eslint">¿Qué diferencia hay entre Prettier y un linter cómo ESLint?</h2><p>Es fácil asociar el trabajo de Prettier y ESLint, pero en realidad difieren en su objetivo</p><blockquote>Si quieres saber más sobre que es ESLint, como funciona y como instalarlo <a href="https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/">revisa este artículo de la serie.</a></blockquote><p>En pocas palabras, el trabajo de un linter como ESLint es encontrar bugs y el de Prettier formatear el código.</p><p>Por ejemplo, ESLint tiene reglas para mejorar la calidad del código cómo: <a href="https://eslint.org/docs/rules/no-unused-vars">no-unused-vars</a>, <a href="https://eslint.org/docs/rules/no-await-in-loop">no-await-in-loop</a>, <a href="https://eslint.org/docs/rules/no-dupe-args">no-dupe-args</a>, etc. Prettier no tiene nada que hacer con este tipo de reglas, ya que están relacionadas a una tarea diferente.</p><h2 id="-c-mo-instalar-prettier">¿Cómo instalar Prettier?</h2><p>Prettier es un paquete que puedes encontrar en npm </p><blockquote>Para saber más sobre que es NPM te invito <a href="https://www.freecodecamp.org/espanol/news/que-es-npm/">a revisar este artículo de la serie</a></blockquote><p>Comienza por abrir tu terminal e instalar Prettier localmente en tu proyecto</p><pre><code class="language-bash">npm install --save-dev --save-exact prettier</code></pre><p>Luego deberás crear un archivo de configuración para que así el editor de texto que utilizas sepa que Prettier está disponible.</p><pre><code class="language-bash">echo {} &gt; .prettierrc.json</code></pre><p>Además, es buena idea configurar un archivo <code>.prettierignore</code> que te permitirá indicarle a Prettier que archivos no formatear.</p><pre><code># Ignore artifacts:
build
coverage
static</code></pre><blockquote>Este archivo es muy parecido e incluso a veces idéntico a tu archivo <code>.gitignore</code> o <code>.eslintignore</code></blockquote><p>Con esto Prettier ya está disponible para su uso, puedes comenzar por formatear todos tus archivos utilizando, nuevamente la terminal</p><pre><code class="language-bash">npx prettier --write .</code></pre><p>Si tienes muchos archivos esto puede tomar un tiempo, ahora es buen momento para configurar tu editor de texto favorito para que trabaje con Prettier &nbsp;momento de guardar los archivos o mediante alguna combinación de teclas.</p><p>Puedes revisar la documentación de cada editor o este listado en el sitio oficial de Prettier sobre la <a href="https://prettier.io/docs/en/editors.html">Integración con Editores</a></p><h2 id="tips">Tips</h2><p>Es común tener varias herramientas trabajando en tu proyecto, por lo que es importante configurar todo para que "jueguen bien", una de esas configuraciones es permitir que ESLint y Prettier trabajen en conjunto sin interponerse (algunas reglas pueden sobreponerse). Para ello existe un plugin <a href="https://github.com/prettier/eslint-config-prettier#installation"><code>eslint-config-prettier</code></a> que permite que ESLint deshabilite las reglas que pueden chocar con Prettier</p><p>Puedes instalarlo utilizando la terminal</p><pre><code>npm install --save-dev eslint-config-prettier</code></pre><p>Luego tendrás que añadir algunas configuraciones a tu configuración es ESLint.</p><pre><code class="language-json">{
    "extends": [
    	"prettier"
    ]
}</code></pre><p>También es buena idea permitir que Prettier funcione con tus acciones relacionadas con Git</p><p>Una forma de reforzar el uso de Prettier en el equipo es que se ejecute automáticamente al momento de "guardar" tu código en tu repositorio (hacer commit). La idea es asegurarte que todos los archivos que fueron modificados sean formateados por Prettier. Para esto debes instalar algunas herramientas y configurar tu archivo <code>package.json</code></p><pre><code>npm install --save-dev husky lint-staged
npx husky install
npm set-script prepare "husky install"
npx husky add .husky/pre-commit "npx lint-staged"</code></pre><p>Finalmente, edita tu archivo <code>package.json</code> y agrega</p><pre><code class="language-json">{
    "lint-staged": {
        "**/*": "prettier --write --ignore-unknown"
    }
}</code></pre><p>En resumen, en este artículo hemos revisado que es y como funciona Prettier, también el razonamiento de porque querrías utilizarlo para evitar problemas de guías de estilo.</p><p>También revisamos como instalar localmente Prettier en tu proyecto, configurar <code>.prettierrc.json</code> y el archivo `.prettierigore`. </p><p>Finalmente, vimos como configurar para que ESLint y Prettier funcionen en conjunto.</p><!--kg-card-begin: html--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/Footer-Social-Card.jpg" class="kg-image" alt="Footer-Social-Card" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/Footer-Social-Card.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/03/Footer-Social-Card.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/03/Footer-Social-Card.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/03/Footer-Social-Card.jpg 2400w" sizes="(min-width: 720px) 720px" width="2000" height="533" loading="lazy"></figure>
<div style="display: grid; grid-template-columns: repeat(3,1fr);font-size: 18px;width: 100%;">
    <div>✉️ <a href="https://microbytes.dev">Únete a Micro-bytes</a> <br> newsletter de micro cursos </div>
<div>
    ? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a> &nbsp; </div>
<div>❤️ <a href="https://buymeacoffee.com/matiasfha">Apoya mi trabajo</a> 
    </div>
</div><!--kg-card-end: html--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es JamStack? ]]>
                </title>
                <description>
                    <![CDATA[  > TLDR; Puedes escuchar la versión en audio de este artículo en este episodio de Café con Tech [https://www.cafecon.tech/1081172/6400075-que-es-jamstack] JAMStack es un término genérico para referirse a una forma de desarrollar aplicaciones web. Es una arquitectura, modelo y filosofía que determina una forma de desarrollar una aplicación que cumple ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-jamstack/</link>
                <guid isPermaLink="false">6099669e43d3ed076418183b</guid>
                
                    <category>
                        <![CDATA[ Jamstack ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Wed, 12 May 2021 05:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/05/English-Header-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><blockquote>TLDR; Puedes escuchar la versión en audio de este artículo <a href="https://www.cafecon.tech/1081172/6400075-que-es-jamstack">en este episodio de Café con Tech</a></blockquote><p>JAMStack es un término genérico para referirse a una forma de desarrollar aplicaciones web. Es una arquitectura, modelo y filosofía que determina una forma de desarrollar una aplicación que cumple con los 5 pilares de una aplicación o framework bien "diseñado" según AWS.</p><ul><li>Excelencia Operacional</li><li>Seguridad</li><li>Fiabilidad</li><li>Eficiencia</li><li>Optimización de Costo</li></ul><p>Tradicionalmente una webapp está compuesta de un servidor, un programa que ejecuta una serie de operaciones para retornar una página web. Esto ocurre cientos de veces con cada visita al sitio web.</p><p>Un ejemplo de app tradicional es una app hecha con algún framework que se encarga no solo de obtener los datos, sino también de construir y servir el contenido hacia el browser. Rails, Django, Laravel, ExpressJs, etc. son ejemplos de una app tradicional.</p><h2 id="historia">Historia</h2><p>Pero, demos un poco de contexto que siempre es adecuado saber de donde proviene una idea.</p><p>La web comenzó de manos de Sir Tim Bernes Lee proveyendo de una forma de mostrar contenido estático por medio del uso de un lenguaje de marcado HTML. Hasta aquí todo bien, el desarrollo de sitios web fue por años simplemente para mostrar contenido.</p><p>Luego se le agregó dinamismo al utilizar lenguajes que de forma dinámica construían el contenido, como Perl y PHP y esto sigue así hasta que al rededor del año 2015 los sitios estáticos vuelven a popularizarse gracias al uso de herramientas de generación de sitios estáticos como Jekyll que permitían desarrollar rápidamente un sitio web directamente en github.</p><p>El 2016 el término JAMStack es acuñado por un grupo de desarrolladores que sintieron que "Sitio estático" no hacia correcta referencia a lo que se estaba desarrollando.</p><p>el 2016 crece la revolución de la "Web moderna" en donde se prioriza la performance, escalabilidad y experiencia de desarrollo. El término JAMStack comienza a ser adoptado por grandes grupos de desarrolladores.</p><ul><li>2018 es el año de la explosión de JAMStack, herramientas como Netlify, Gatsby y Contentful crecen rápidamente popularizando aún más el término. Ese mismo año nace la JAMStack Conf.</li></ul><p>El resto es historia.</p><h2 id="entonces-qu-es-jamstack">Entonces, ¿Qué es JAMStack?</h2><p>JAMStack es un approach diferente pero a la vez conocido. Es una <strong>app estática</strong>. ¿Cómo?</p><p>Es estática en el sentido de que el contenido es servido como archivos estáticos (Markup) pero los datos utilizados pueden ser dinámicos (API)</p><p>Por ejemplo tu ya tradicional aplicación escrita con React, cuando la pones en producción, lo que realmente tienes es un conjunto de archivos estáticos que es distribuido por algún servicio como Amazon S3 o Netlify y eso esencialmente es JAMStack.</p><p>Entonces de que se compone una app JAMStack</p><p>Por lo general son 3 componentes</p><h3 id="javascript">JavaScript</h3><p>Javascript permite proveer de dinamismo e interacción a esos archivos estáticos. Aquí es donde frameworks y librerías como React, Angular, Svelte y Vue entran en juego.</p><p>Estas herramientas hacen que crear un sitio web sea más "simple" (no más fácil en particular) ofreciendo diversas opciones para agregar dinamismo, junto con ofrecer un set de herramientas que finalmente generan un grupo de archivos estáticos que son servidor por tu CDN favorito.</p><h3 id="apis">APIs</h3><p>Utilizar la versatilidad de las API es esencial para ofrecer funcionalidades a tu app JAMStack, la idea aquí es que tu aplicación puede consumir funcionalidades y datos de múltiples fuentes, algo completamente distinto al enfoque tradicional en donde los datos provenían del propio servidor.</p><p>El uso de Javascript para consumir datos sobre HTTP ha permitido el crecimiento de una miríada de servicios que proveen diversas funcionalidades, como autentificación, contenido, búsqueda, almacén de datos, etc.</p><p>Gatsby aquí hizo un gran trabajo definiendo el concepto "Content Mesh" para describir la red de apis que se utilizan en una app JAMStack.</p><p>Al mismo tiempo gatsby fue pionero, o al menos de los primeros frameworks, en ofrecer una clara interfaz entre todas estas fuentes de datos por medio del uso de Graphql como centralizador.</p><p>Personalmente creo que la popularización de Graphql incentivo el crecimiento de JAMStack y viceversa.</p><h3 id="markup">Markup</h3><p>Este componente es esencial, es finalmente la parte visible al usuario, es lo que el browser consume, aquí lo importante no es en particular como se crea, puede ser a mano o por medio de herramientas de autogeneración, si no, es importante como se distribuye.</p><p>Para ser considerado JAMStack el contenido debe ser distribuido de forma estática, lo que implica que no debe ser renderizado de forma "dinámica" por el servidor.</p><p>Si estás creando una app o sitio web y este es construido en el momento por el motor PHP (por ejemplo), no estamos hablando entonces una app JAMStack, pero si estás sirviendo un archivo HTML desde algún servicio de storage como S3, entonces suena como JAMStack.</p><p>Una forma popular de crear el componente Markup es el uso de framework de Static Site Generators como Gatsby, Jekyll, Hugo, etc.</p><p>Frameworks que permiten consumir datos desde alguna o varias API durante el tiempo de "compilación" para recrear los archivos estáticos utilizando esos datos.</p><p>Por ejemplo, piensa en que tienes una serie de posts escritos en archivos markdown hosteados en algún servicio de Cloud que ofrece una api, es posible, utilizar esa api para obtener todos los archivos que tienes y utilizar su contenido para crear una página HTML para cada uno de ellos. Esto implica que finalmente lo que subirás a tu servicio de storage es una versión "pre-compilada" que será servido directamente al browser, lo que usualmente significa una experiencia de uso mucho más rápida para tus usuarios.</p><h2 id="beneficios">Beneficios</h2><p>¿Entonces, que hace que JAMStack sea tan bueno y un término tan popular?</p><p>Primero, markting, yes. JAMStack es un término bastante marketero, muchos más que aplicación estática no?, pero obviamente si tiene beneficios reales como:</p><ul><li><strong>Mejor performance: </strong>Servir contenido previamente construido utilizando un CDN indica que ya no dependes de la capacidad de tu servidor para construir las páginas que serán servidas en donde en ocasiones de muchos usuarios (requests) el servidor sufría e incluso podía simplemente caerse y dejar sin servicio tu maravilloso e-commerce.</li><li><strong>Más seguro </strong>No necesitas preocuparte de sobre vulnerabilidades del servidor o tu base de datos por lo que puedes enfocar tus esfuerzos en definir permisos de acceso para la información privada utilizando alguna api de autorización como Auth0.</li><li><strong>Menor Costo: </strong>Hostear contenido estático es barato o incluso gratuito.</li><li><strong>Mejor experiencia de desarrollo: </strong>Frontend Devs se pueden enfocar en lo que mejor hacen, el desarrollo frontend, sin estar atados a una estructura monolítica. Esto usualmente significa un mejor y más rápido desarrollo.</li><li><strong>Escalabilidad </strong>Si tu producto se vuelve viral de la noche a la mañana y de pronto tienes miles de usuarios activos, tu CDN lo compensará sin mayor dificultad. El CDN te dará escalabilidad "infinita" o al menos gigantesca.</li></ul><h2 id="workflow">Workflow</h2><p>Obviamente la forma de desarrollar puede variar en cada uno, pero por lo general hay un flujo de trabajo mínimo ideal y bastante sencillo.</p><blockquote>Desarrolla -&gt; Sistema de control de versiones -&gt; CI/CD -&gt; Assets estáticos -&gt; Deploy atómico -&gt; Actualizar CDN.</blockquote><p>Obviamente depende de tus herramientas, pero por ejemplo mi blog y todos mis otros sitios están construidos con este flow, pero quizá· un poco más simplificado dado los servicios.</p><p>Desarrollo el sitio en mi editor favorito y utilizo git para guardar mis cambios y subirlos a github, todos los commit hechos a master son "escuchados" por netlify que automáticamente genera un nuevo build y directamente actualiza su CDN interno.</p><h2 id="-qu-herramientas-puedo-utilizar">¿Qué herramientas puedo utilizar?</h2><p>Ya sabes que es JAMStack ahora la parte divertida, construir tu propia app JAMStack.</p><p>Puedes elegir un framework que te permite seleccionar casi cualquier tecnología web.</p><ul><li>Gatsby: React y Graphql (mi sitio web y el de control remoto están hechos con Gatsby)</li><li>11ty Diferentes lenguajes de Template como Markdown, Handlebars, liquid, etc.</li><li>Hugo. Escrito en GO. Mi sitio de notas está hecho con HUGO.</li><li>Nift. Escrito en C++ y Language Agnostic.</li><li>Scully: Angular.js</li></ul><p>y muchos más que puedes ver en <a href="https://jamstack.org/generators/">https://jamstack.org/generators/</a></p><p><strong>¿Dónde servir o almacenar tu app? Aquí hay mucho donde elegir.</strong></p><ul><li>Netlify (mi elección)</li><li>Vercel</li><li>AWS (AWS Amplify es una buena elección)</li><li>Github Pages</li></ul><p><strong>¿Que servicios o api hay disponibles?</strong></p><ul><li>Auth0 es un gran servicio de autenticación y autorización.</li><li>Cloudinary como servicio para hostear imágenes, las social cards de mis sitios es generada utilizando cloudinary.</li><li>Sanity, Contenful o incluso Wordpress como CMS</li><li>Stripe o MercadoPago como plataforma de pagos &nbsp; ¿Y Como le doy dinamismo?</li></ul><p>Como ya hemos comentado, un sitio JAMStack provee de contenido estático en términos de que los archivos utilizados son estáticos, pero su contenido puede ser tan dinámico como se requiera. Hay varias formas de ofrecer este dinamismo como también muchos servicios que utilizar</p><ul><li>Puedes Utilizar React, Vue, Angular, o casi cualquier otro framework</li><li>Puedes utilizar funciones serverless como lo que ofrece AWS lambda, Netlify functions o Vercel</li><li>Utilizar bases de datos como FaunaDB</li><li>Formularios, comentarios, e-commerce, search, etc.</li></ul><p>En fin, aún hay mucho camino por recorrer</p><h2 id="recursos">Recursos</h2><p>Dada la pasión y emoción alrededor de JAMStack existen varias comunidades online que trabajan para proveer ambientes inclusivos para permitir que todos puedan aprender sobre este modelo y como hacer de la web un mejor lugar.</p><p>La principal conferencia sobre JAMStack es la jamstackconf. La conferencia líder y "oficial" sobre esta arquitectura, organizada por Netlify.</p><ul><li><strong>Meetups</strong>: Puedes encontrar varias y diferente meetups que buscan mantener el contenido vivo permitiendo que muchos puedan dar a conocer su trabajo en estas pequeñas comunidades. Puedes encontrar una lista de estas meetups en <a>jamstack.org/community</a></li><li><strong>Slack: </strong>También puedes unirte a algunas comunidades online como el Slack de JAMStack, the New Dynamic y Party Corgi Network.</li><li><strong>Newsletter: </strong>Puedes unirte a algún newsletter que te permitirán mantenerte al día sobre el desarrollo de JAMStack.</li><li><strong>Guías y tutoriales: </strong>En frontend masters puedes encontrar el curso de Jason Lengstorf sobre introducción a JAMstack. <a>Egghead.io</a> también tiene varias lecciones sobre Jamstack incluyendo videos sobre Netlify, Gatsby, Next y otros.</li></ul><p>Gracias especiales a <a href="https://www.freecodecamp.org/news/author/colbyfayock/">Colby Fayock</a> autor de <a href="https://jamstackhandbook.com">The Jamstack Hanbook</a>, cuyo ebook fue utilizado como parte de las referencias para este episodio.</p><!--kg-card-begin: html--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/Footer-Social-Card.jpg" class="kg-image" alt="Footer-Social-Card" width="2000" height="533" loading="lazy"></figure>

<div style="display:flex;flex-direction:row; align-items:flex-start; justify-content:space-between; width:100%; font-size:1.8rem">
<span style="margin-right:2rem">
    ? <a href="https://microbytes.matiashernandez.dev">Únete a MicroBytes! <br>newsletter de micro cursos</a>
    </span>
<span style="margin-right:2rem"> ? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a></span>
    <span> ☕️ <a href="https://buymeacoffee.com/matiasfha">Invitame un Café</a></span></div><!--kg-card-end: html--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es Inmutabilidad en JavaScript? ]]>
                </title>
                <description>
                    <![CDATA[ Photo by Fernando Reyes [https://unsplash.com/@nundo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText]  on Unsplash [https://unsplash.com/s/photos/rocks?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText]  Hoy revisaremos: ¿Qué es inmutabilidad? JavaScript es un lenguaje muy (quizá demasiado) flexible y ofrece varias opciones para manipular todo tipo de estructura de datos, algunas de estas opciones son Mutables y otros Inmutables. Pero ¿Qué es inmutabilidad?  ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-inmutabilidad-en-javascript/</link>
                <guid isPermaLink="false">60757e304c4d4208dfdb6e1c</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Fri, 23 Apr 2021 05:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/-Que-es-Inumtabilidad-en-Javascript-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <small style="text-align: left">Photo by <a href="https://unsplash.com/@nundo?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Fernando Reyes</a> on <a href="https://unsplash.com/s/photos/rocks?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></small>
  <!--kg-card-end: html--><p><strong>Hoy revisaremos: ¿Qué es inmutabilidad?</strong></p><p>JavaScript es un lenguaje muy (quizá demasiado) flexible y ofrece varias opciones para manipular todo tipo de estructura de datos, algunas de estas opciones son <strong>Mutables</strong> y otros <strong>Inmutables.</strong></p><h2 id="pero-qu-es-inmutabilidad">Pero ¿Qué es inmutabilidad?</h2><p>Este concepto comenzó &nbsp;a tener un auge importante en el desarrollo frontend gracias a que la programación funcional comenzó poco a poco a hacerse presente, siendo quizá el culpable la dupla React + Redux.</p><p>Una de las características más importantes de los lenguajes funcionales es que sus estructuras de datos son inmutables lo que ayuda a reducir la complejidad del software. Y si algo sabemos por la experiencia es que la complejidad es un “code smell”.</p><p>Es común que nuestras aplicaciones JavaScript incrementen de forma exponencial su complejidad dado el número de requerimientos de esta, el problema con esto es que llegado a un punto, es casi imposible mantener un modelo mental de todo lo que ocurre en la aplicación, y por sobre todo, poder seguir fielmente el flujo de datos o información y sus transformaciones.</p><p>El concepto de <strong>Inmutabilidad</strong> es sencillo y poderoso. Un valor inmutable es algo que no puede ser cambiado.</p><blockquote>La verdad es el constante cambio, la mutación oculta los cambios, los cambios se manifiestan en caos, por lo tanto, el sabio abraza la historia. — The Dao of Immutability</blockquote><blockquote><a href="https://medium.com/javascript-scene/the-dao-of-immutability-9f91a70c88cd#.b1cayh7g7">https://medium.com/javascript-scene/the-dao-of-immutability-9f91a70c88cd#.b1cayh7g7</a></blockquote><p>¿Entonces que hacer cuando necesitas un objeto o valor idéntico al original pero solo con algunos atributos diferentes?. Hasta ahora lo que hacíamos es mutar la variable original y continuar con nuestras vidas. Pero si consideramos esa variable inmutable entonces tendremos que hacer una copia y manipular la copia en vez del original.</p><p>Pero esta técnica siempre genera alarmas: ¿crear un objeto nuevo por cada cambio es costoso? y a la respuesta es: <strong>si, ya que se debe instanciar nuevamente en memoria.</strong></p><p>Dada esta situación, numerosas investigaciones se han realizado generando grandes avances en manejo de memoria y técnicas que optimizan las estructuras de datos para evitar el gigantesco consumo de memoria que significa recrear un objeto una y otra vez por un tiempo prolongado.</p><p><a href="https://www.youtube.com/watch?v=mS264h8KGwk">En esta charla de David Nolen</a> se explica como estas estructuras se implementan y funcionan.</p><blockquote>Inmutabilidad es trabajar con los hechos, dado que una variable inmutable no puede cambiar podemos decir entonces que estamos hablando de los hechos, la fuente de la verdad.</blockquote><p>En los lenguajes funcionales la inmutabilidad es algo que se da por sentado, pero en JavaScript es algo que debemos "forzar" mediante buenas prácticas, linting o el uso de librerías tipo “helper” que refuercen estas prácticas.</p><blockquote>Por cierto, si no sabes que es linting, escribí <a>un artículo sobre ello en freecodecamp</a></blockquote><h2 id="-por-qu-la-inmutabilidad-es-importante">¿Por qué la inmutabilidad es importante?</h2><p>Básicamente porque te permite representar estados de forma correcta y eliminar los "side effects". &nbsp;Es mucho más fácil seguir la lógica de un software que no modifica sus variables que uno que permite que sus variables cambien a diestra y siniestra.</p><p>Un ejemplo de la importancia de la inmutabilidad es el propio React. Un componente React es básicamente una función que a base de un estado (sus props y estado interno) retorna una interfaz.</p><p>Para manejar estado interno React ofrece una función (hook) llamado u<code>seState.</code> Esta función retorna una tupla [<code>estado, funcion actualizadora]</code> es decir, React nos indica que para modificar el estado debemos utilizar la función actualizadora, no podemos ir directamente y m<strong>utar</strong> el estado, debemos solicitar su cambio.</p><p>Cuando hacemos uso de la función actualizadora React crea una copia del estado y modifica solo lo que es necesario e<strong>n la copia.</strong></p><h2 id="trabajando-con-objetos-inmutables-">Trabajando con objetos inmutables.</h2><p>Entonces, queremos asegurarnos de que nuestros objetos no sean mutados. SI vamos a hacer uso de un método para actualizar el objeto este método debe retornar un nuevo objeto. En esencia lo que necesitamos es una <strong>función pura.</strong></p><p>Una función pura tiene dos propiedades esenciales:</p><ul><li>El valor que retorna depende <strong>sólo</strong> de los argumentos de entrada. O lo que es lo mismo, el valor de retorno no cambiará si los valores de entrada no cambian.</li><li>No puede modificar nada que este fuera de su ámbito.</li></ul><h2 id="-qu-herramientas-nos-ofrece-javascript">¿Qué herramientas nos ofrece JavaScript?</h2><p>En el caso de los objetos JavaScript nos ofrece a lo menos dos formas para mantener el principio de inmutabilidad.</p><h3 id="object-assign">Object.assign</h3><p><code>Object.assign</code> es un método del objeto <code>Object</code> que permite crear un nuevo objeto copiando los valores que le son pasados como parámetros.</p><pre><code class="language-javascript">Object.assign({}, data, { attribute: 'something' }
</code></pre><p>En este ejemplo lo que estamos haciendo es copiar todo el contenido del objeto <code>data</code> dentro del objeto vació que pasamos como primer argumento, además copiamos y en efecto sobreescribimos el valor del atributo <code>attribute</code> dentro del nuevo objeto. <code>Object.assign</code> retorna el valor del nuevo objeto.</p><h3 id="operador-spread">Operador spread</h3><p>Ya revisamos lo que podemos hacer con el operador spread en una lección anterior. En este caso utilizaremos el operador para efectuar lo mismo que con <code>Object.assign</code></p><p><code>{...data, attribute: 'something' }</code></p><h3 id="arreglos">Arreglos</h3><p>El objeto <code>Array</code> define algunas operaciones mutables, es decir, modifican el arreglo original al operar sobre el: <code>push</code>, <code>pop</code>, <code>splice</code>, <code>shift</code>,<code>unshift</code>, <code>reverse</code> y <code>sort</code>. Usar estos métodos implica la existencia de <em>side effects</em> y posibles bugs difíciles de rastrear.</p><p>Transformemos estos métodos para funcionar de forma inmutables, usaremos el siguiente arreglo como base en cada operación.</p><pre><code class="language-javascript">const usuarios = [
	{ 
		id: 1,
		name: "brad gibson",
		email: "brad.gibson@example.com"
	},
	{
		id: 2,
		name: "Kuzey Karaduman",
		email: "kuzey.karaduman@example.com"
	},
	{
		id: 3,
		name: "Heinz-Werner Konrad",
		email: "heinz-werner.konrad@example.com"
	}
]
</code></pre><h3 id="push-function push() { [native code] }1">Push</h3><p>La forma usual es utilizar</p><pre><code class="language-javascript">const newUser = {
	id:4,
	name: "Stephen Watkins",
	email: "stephen.watkings@example.com"
}
usuarios.push(newUser) // [{ id: 1}, {id:2}, {id: 3}, { id: 4} ]
</code></pre><p>Pero esto modifica el arreglo inicial, la forma inmutable de esta operación se obtiene al utilizar el operador spread.</p><pre><code class="language-javascript">const newUsuarios = [...usuarios, newUser ]
</code></pre><p>JavaScript</p><h3 id="unshift-function unshift() { [native code] }1">Unshift</h3><p>Este operador es similar a <code>push</code>, salvo que en vez de agregar un elemento al final del arreglo lo hace al principio (<code>prepend</code>).</p><pre><code class="language-javascript">čonst newUser = {
	id:4,
	name: "Stephen Watkins",
	email: "stephen.watkings@example.com"
}
usuarios.unshift(newUser) // // [{ id: 4}, {id:1}, {id: 2}, { id: 3} ]
</code></pre><p>Nuevamente podemos hacer uso del operador <code>spread</code> para conseguir la versión inmutable</p><pre><code class="language-javascript">const newUsuarios = [newUser, ...usuarios]
</code></pre><h3 id="pop-function pop() { [native code] }1">Pop</h3><p>Este operador remueve el último item del arreglo y lo retorna</p><pre><code class="language-javascript">const user = usuarios.pop(); // user = { id: 3 } y usuarios ahora tiene sólo dos elementos
</code></pre><p>Para lograr lo mismo de forma inmutable tenemos que hacer uso de otro método de arreglo a modo de "helper" y ejecutar algunos otros pasos:</p><pre><code class="language-javascript">const user = usuarios[usuarios.length - 1]; //Obtenemos una copia del ultimo usuario para replicar el comportamiento de `pop` de retornar el elemento
const newUsuarios = usuarios.slice(0, usuarios.length - 1)// el arreglo original sigue sin modificarse
</code></pre><p>Aquí utilizamos <code>slice</code> que revisaremos más adelante.</p><h3 id="shift-function shift() { [native code] }1">Shift</h3><p>Este operador actúa de forma similar a pop y es en efecto el acto contrario a <code>unshift</code>. Remueve un elemento del principio del arreglo y lo retorna.</p><pre><code class="language-javascript">const user = usuarios.shift(); // user = {id: 1} y usuarios ahora tiene solo 1 element
</code></pre><p>Nuestra solución inmutable nuevamente debe hacer uso de <code>slice</code> para replicar el comportamiento</p><pre><code class="language-javascript">const user = usuarios[0]; //Obtenemos una copia del primer usuario para replicar el comportamiento de `shift` de retornar el elemento
const newUsuarios = usuarios.slice(1) // el arreglo original sigue sin modificarse
</code></pre><h3 id="splice-function splice() { [native code] }1">Splice</h3><p>Este método es utilizado tanto para remover como para agregar elementos en cualquier posición de un arreglo</p><pre><code class="language-javascript">usuarios.splice(1,2, newUser);
</code></pre><p>Esta operación modifica el arreglo original, removiendo dos elementos desde la posición 1 y agregando en su lugar el <code>newUser</code></p><p>el resultado es</p><pre><code class="language-javascript">{
    id: 1,
    name: "brad gibson",
    email: "brad.gibson@example.com"
  },
	{
		id: 4,
	  name: "Stephen Watkins",
	  email: "stephen.watkings@example.com",
	}
</code></pre><p>Para transformar esta operación en inmutable nuevamente hacemos uso de <code>splice</code> y &nbsp;el operador &nbsp;<code>spread</code></p><pre><code class="language-javascript">const newUsuarios = [...usuarios.slice(0,1), newUser, ...usuarios.slice(3)]
</code></pre><p><code>slice</code> obtiene un trozo del arreglo original y luego con <code>spread</code> este trozo se expando para copiarse dentro del nuevo arreglo.</p><h3 id="sort-y-reverse">Sort y reverse</h3><p>Finalmente tenemos los métodos <code>sort</code> y <code>reverse</code> uno ordena el arreglo y otro lo invierte</p><p>Cabe destacar que <code>sort</code> puede recibir un parámetro que define como se deben comparar los elementos del arreglo para definir cuál va primero.</p><p>En nuestro caso estamos utilizando un arreglo de objetos, y para su ordenamiento lo haremos comparando los atributos <code>id</code></p><pre><code class="language-javascript">function compare(a, b) {
  if(a.id &gt; b.id) {
    return -1
  }
	if(a.id &lt; b.id) {
		return 1
	}
  return 0
}
</code></pre><p>Esta función indica que si el elemento <code>a</code> tiene un <code>id</code> mayor que el del elemento <code>b</code> entonces retorna un valor menor que 0 que significa que <code>a</code> debe posicionarse primero. En caso contrario se retorna un valor mayor que 0, entonces <code>b</code> debe posicionarse primero. Si retorna 0, entonces los elementos se dejan en la misma posición.</p><p>Ahora con esto en su lugar podemos ordenar e invertir nuestro arreglo</p><pre><code class="language-javascript">usuarios.sort(compare); // [{ id: 3}, {id: 2}, {id: 1}]
usuarios.revserse(); // [{ id: 1}, {id: 2}, {id: 3}]
</code></pre><p>Estos operadores son mutables por defecto y no tienen una contrapartida en el mundo de la inmutabilidad, por lo que para replicar su comportamiento lo que hacemos es la solución más sencilla (<a href="https://es.wikipedia.org/wiki/Navaja_de_Ockham">La navaja de Ockham</a>), es decir, obtenemos una copia del arreglo y operamos sobre esta copia.</p><pre><code class="language-javascript">const sorted = [...usuarios].sort(compare)
const inverted = [...usuarios].reverse()
const sortedAndInverted = [...sorted].reverse()
</code></pre><p>Como siempre te dejo el demo de <a href="https://jsitor.com/nl0cMEizV">todo este código aquí</a></p><h4 id="librer-as">Librerías</h4><p>Existe también la opción de utilizar alguna librería que te permita aplicar los principios de inmutabilidad de una forma más directa. Este tipo de librerías garantizan que el principio está siendo aplicado.</p><p>Una de estas librerías y quizá la más mencionada es <a href="https://immutable-js.github.io/immutable-js/">Immutable.js</a> que tuvo gran auge al ser usada junto con Redux.</p><h2 id="conclusi-n">Conclusión</h2><p>La inmutabilidad no es un tópico específico de JavaScript, puede ser aplicado a cualquier lenguaje y es muy recomendado que así sea. Lo importante aquí es entender por qué requieres utilizar inmutabilidad y como estás manejando tus datos para mantener un flujo de datos legible y un patrón de código mantenible.</p><!--kg-card-begin: html--><small>Este contenido es también parte de lo que puedes encontrar en <a href="https://microbytes.matiashernandez.dev">MicroBytes, un newsletter de microcursos.</a></small><!--kg-card-end: html--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/Footer-Social-Card.jpg" class="kg-image" alt="Footer-Social-Card" width="2000" height="533" loading="lazy"></figure><!--kg-card-begin: html--><div style="display:flex;flex-direction:row; align-items:flex-start; justify-content:space-between; width:100%; font-size:1.8rem">
<span style="margin-right:2rem">
    ? <a href="https://microbytes.matiashernandez.dev">Únete a MicroBytes! <br>newsletter de micro cursos</a>
    </span>
<span style="margin-right:2rem"> ? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a></span>
    <span> ☕️ <a href="https://buymeacoffee.com/matiasfha">Invitame un Café</a></span></div><!--kg-card-end: html--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es Babel? ]]>
                </title>
                <description>
                    <![CDATA[ En el tercer artículo de esta serie sobre herramientas orientadas a la experiencia de desarrollador revisamos Babel. Puedes encontrar los artículos previos en:  * ¿Qué es Linting y ESLint? [/espanol/news/que-es-linting-y-eslint/]  * ¿Qué es npm? [/espanol/news/que-es-npm/] ¿Qué es Babel? Babel es un "compilador" (o transpilador) para JavaScript. Básicamente permite ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-babel/</link>
                <guid isPermaLink="false">604606ddc2765408ef8dd9aa</guid>
                
                    <category>
                        <![CDATA[ Babel ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Tue, 09 Mar 2021 08:01:54 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/03/English-Header-2-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>En el tercer artículo de esta serie sobre herramientas orientadas a la experiencia de desarrollador revisamos <strong>Babel.</strong></p><p>Puedes encontrar los artículos previos en:</p><ul><li><a href="https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/">¿Qué es Linting y ESLint?</a></li><li><a href="https://www.freecodecamp.org/espanol/news/que-es-npm/">¿Qué es npm?</a></li></ul><h1 id="-qu-es-babel">¿Qué es Babel?</h1><p>Babel es un "<strong>compilador"</strong> (o transpilador) para JavaScript. Básicamente permite transformar código escrito con las últimas y novedosas características de JavaScript y transformarlo en un código que sea entendido por navegadores más antiguos.</p><h2 id="-por-qu-es-necesario-transformar-el-c-digo-javascript">¿Por qué es necesario transformar el código JavaScript?</h2><p>JavaScript es un lenguaje que no para de evolucionar y que cada año agrega nuevas características a su estándar. El estándar de JavaScript, conocido como ECMAScript.</p><p>ECMAScript (o abreviado ES) es la especificación en la que se basa JavaScript. ES nace de la organización ECMA International, cuyo objetivo es desarrollar estándares y reportes técnicos para facilitar el uso de tecnologías de la información.</p><p>Esta organización se constituye de varios equipos siendo el TC39 el equipo encargado de revisar, proponer y definir las características que el estándar tendrá cada año.</p><p>Lamentablemente la velocidad de actualización del estándar no es la misma que la velocidad de adopción de los navegadores, es decir, los navegadores no siempre pueden implementar las nuevas características en sus engine, ni tampoco hacerlo retrocompatible con versiones más antiguas. Además, tampoco es posible asegurar que todos los usuarios estén utilizando navegadores modernos o de última generación lo que imposibilita tener la seguridad de que podamos hacer uso de las nuevas características del lenguaje en todas partes.</p><h3 id="-qu-ventajas-tiene-el-utilizar-las-nuevas-caracter-sticas-propuestas-por-ecma">¿Qué ventajas tiene el utilizar las nuevas características propuestas por ECMA?</h3><p>Las nuevas características y "habilidades" que JavaScript provee cada año son sobre todo ventajas para ti como desarrollador, ya que te proporciona de herramientas más poderosas y expresivas para implementar soluciones a problemas complejos. Algunas de las características se han ido agregando con los años son:</p><ul><li>Funciones flechas (arrow functions)</li><li>Plantillas Literales (Template Literals)</li><li>Map y Set</li><li>Let y Const</li><li>Clases</li><li>Encadenamiento Opcional (Optional Chaining)</li><li>Operador Fusión Nula (Nullish Coalescing)</li><li>Métodos Privados (ES2021)</li><li>Operador de Asignación Local (ES2021)</li><li>Puedes ver más en la especificación actual de ECMA en: <a href="https://www.ecma-international.org/publications-and-standards/standards/ecma-262/">https://www.ecma-international.org/publications-and-standards/standards/ecma-262/</a></li></ul><h2 id="-entonces-como-puedo-usar-las-nuevas-versiones-de-javascript">¿Entonces como puedo usar las nuevas versiones de JavaScript?</h2><p>Ya que no todos los navegadores pueden interpretar o entender las nuevas características del lenguaje que estás o quieres usar es necesario buscar algunas soluciones, una de ellas es el uso de polyfills o librerías que implementan con código "antiguo" el mismo comportamiento que lo que intentas expresar con características nuevas, un ejemplo de esto es el polyfill para usar <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#polyfill">Object.keys</a></p><p>Pero si necesitas usar algo más que un par de operadores entonces entra en juego más requerimientos y aquí es donde <strong>Babel</strong> hace su aparición</p><p><strong>Babel</strong> permite transformar código de versiones nuevas de ES (ECMA2015+) a versiones retrocompatibles de JavaScript, esto lo realiza mediante:</p><ul><li>Transformaciones de sintaxis</li><li>Polyfills</li><li>Transformaciones de código fuente (codemods)</li><li>etc</li></ul><blockquote>Si lo que gustas es saber más sobre compiladores y como funciona babel en el alto nivel puedes revisar <a href="https://github.com/jamiebuilds/the-super-tiny-compiler">The super tiny compiler</a></blockquote><p>Babel es entonces una herramienta que lee tu código (archivo por archivo) y genera nuevo código que puedes usar en navegadores antiguos (o como entrada para algún bundler como webpack, rollup, etc)</p><p>Babel es casi omnipresente, utilizado por el 99.9% de los equipos que desarrolla software utilizando JavaScript, además Babel se alinea directamente a las discusiones del <a href="https://github.com/tc39/ecma262#ecmascript">TC39</a> proveyendo así implementaciones de propuestas que aún ni siquiera son aceptadas por el comité, lo que te permite tener dichas funcionalidades mucho antes incluso que los navegadores.</p><h2 id="-c-mo-funciona-babel">¿Cómo funciona Babel?</h2><p>Revisaremos de forma breve como babel funciona convirtiendo tu código de una versión a otra.</p><p>Considera este pequeño trozo de código JavaScript</p><pre><code class="language-jsx">const sum = (a, b) =&gt; a + b
</code></pre><p>Ahora considera que por alguna razón necesitas que este se ejecute en un navegador antiguo, entonces deberás transformarlo a</p><pre><code class="language-jsx">'use strict';
function sum(a,b) {
	return a + b;
}
</code></pre><p>¿Cómo se logra esto?</p><p>Es un proceso que se ejecuta en al menos 3 procesos</p><p>Parsing: Babel toma el código fuente, lo lee y lo convierte en una representación abstracta conocida como AST (Abstract Syntax Tree). Esta es una representación donde cada nodo del árbol representa una estructura del código fuente. Babel utiliza <a href="https://github.com/babel/babel/tree/master/packages/babel-parser">Babylon</a> para este trabajo.</p><p>Puedes ver el AST de nuestro ejemplo visitando <a href="https://astexplorer.net/#/gist/88e097f017a6b82f62dda743f91833da/latest">astexplorer.net</a></p><ol><li>Transformación: En esta etapa Babel trabaja sobre el AST generado en el proceso anterior y lo manipula para generar un nuevo AST que represente el código necesario para el soporte seleccionado.</li></ol><p>Este paso es realizado por una serie de "plugins" que permiten ejecutar varias transformaciones de forma sencilla y atómica. Aquí cada plugin toma el AST generado por el previo para aplicar una pequeña transformación.</p><blockquote>Puedes revisar como funciona el plugin <code>[babel-plugin-transform-arrow-function](&lt;https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-arrow-functions&gt;)</code> o leer el "<a href="https://github.com/thejameskyle/babel-handbook/blob/master/translations/en/plugin-handbook.md#introduction">libro de mano de los plugin de babel</a>" (en inglés) para saber como funcionan o como implementar tu propio plugin</blockquote><ol><li>Generación de código: En esta etapa, babel toma el AST generado y crea/escribe el código compatible, es decir, crea ese trozo de código soportado por navegadores más antiguos.</li></ol><pre><code class="language-jsx">'use strict';
function sum(a,b) {
	return a + b;
}
</code></pre><h1 id="instalar-y-configurar-babel">Instalar y configurar Babel</h1><p>Ya sabemos que hace y hasta cierto punto como funciona babel, es hora de hacer uso de su poder, para eso lo primero es instalarlo en nuestro equipo. Para eso necesitamos utilizar el manejador de dependencias de node <strong><a href="https://www.freecodecamp.org/espanol/news/que-es-npm/">npm</a></strong></p><pre><code class="language-jsx">npm install --save-dev @babel/core @babel/cli
</code></pre><blockquote>Si no tienes el archivo package.json creado, crea uno antes de instalar dependencias. <code>npm init</code> te ayudará.</blockquote><p>Una vez instalado esto, verás las nuevas dependencias de desarrollo en tu archivo <code>package.json</code></p><p>Ahora para ejecutar babel puedes intentarlo directamente en la consola accediendo al binario dentro de la carpeta de instalación o utilizar las bondades de npm y su archivo de configuración al crear algunos scripts que te permitan ejecutarlo fácilmente.</p><p>Simplemente agrega la sección <code>scripts</code> y define el comando <code>build.</code></p><pre><code class="language-jsx">"scripts": {
	"build": "babel src -d lib"
}
</code></pre><p>Este comando le indica a babel que lea todo el contenido del directorio <code>src</code> y que genere la salida en el directorio <code>lib</code>.</p><p>Ahora para ejecutar solo basta utilizar npm.</p><pre><code class="language-jsx">npm run build
</code></pre><p>Si ejecutas esto utilizando el breve código de ejemplo de este artículo verás que babel hizo absolutamente nada, esto es porque la configuración por defecto de babel no define qué se debe hacer. Como comenté más arriba, Babel utiliza un sistema de plugins para definir las transformaciones que necesitas realizar.</p><h2 id="configurando-babel">Configurando Babel</h2><p>La configuración de babel se realiza utilizando un archivo de configuración, nada nuevo bajo el sol, llamado <code>babel.config.js</code> Un archivo JavaScript que retornará un objeto con la configuración deseada. El hecho de ser un archivo JavaScript te permite "calcular" ciertos parámetros como por ejemplo, utilizando variables de entorno.</p><p>Babel distribuye un "set" de configuraciones pre-definidas llamadas <code>presets</code>. Estos son básicamente un conjunto de plugins comúnmente utilizados que te permiten iniciar rápidamente.</p><p>Primer instalamos el paquete</p><pre><code class="language-jsx"> npm install @babel/preset-env --save-dev
</code></pre><p>Y luego definimos su uso en el archivo de configuración</p><pre><code class="language-jsx">{
  "presets": ["@babel/preset-env"]
}
</code></pre><p>Este preset es "inteligente" y decide qué plugins se usarán (y por ende que transformaciones se aplicaran) en base a la configuración de ambientes que quieres soportar. Dado que no especificamos ningún ambiente objetivo, babel asumirá que queremos transformar todo el código de versiones ES2015 en adelante en código compatible con ES5. No se recomienda utilizar babel de esta manera ya que estarás transformando código que probablemente los navegadores de tus usuarios ya soportan.</p><p>En nuestro particular y sencillo ejemplo, la transformación para soportar ES5 es convertir la función flecha en una función normal, puedes ver el resultado <a href="https://babeljs.io/repl#?browsers=defaults&amp;build=&amp;builtIns=false&amp;spec=false&amp;loose=false&amp;code_lz=MYewdgzgLgBBCuBbGBeGAKAhgGhgIwEpUA-GTGAanwCgg&amp;debug=false&amp;forceAllTransforms=false&amp;shippedProposals=false&amp;circleciRepo=&amp;evaluate=false&amp;fileSize=false&amp;timeTravel=false&amp;sourceType=module&amp;lineWrap=true&amp;presets=env&amp;prettier=false&amp;targets=&amp;version=7.13.9&amp;externalPlugins=">aquí</a> pero, las funciones flechas ya son <a href="https://caniuse.com/arrow-functions">soportadas por la gran mayoría de navegadores actuales</a> por lo que no tiene sentido hacer la transformación</p><p>Para decirle a babel que queremos soportar navegadores un poco más modernos podemos pasar un nuevo parámetro de configuración.</p><p>Babel se integra con <a href="https://github.com/browserslist/browserslist">browserlist</a> que no es más que una nomenclatura de configuración para definir qué navegadores o ambientes de node deben ser soportados por distintas herramientas. Para su uso se recomienda crear un nuevo archivo llamado <code>.browserlistrc</code> en donde pues escribir la lista de navegadores soportados.</p><p>Creemos el archivo de configuración y digamos que queremos soportar una lista de navegadores bastante nuevos, por ejemplo, que considere las estadísticas de uso y soporte todos los navegadores que tengan una porción de uso superior al 2%.</p><pre><code class="language-jsx">&gt; 2%
</code></pre><p>Ahora al ejecutar <code>npm run build</code> nuevamente veremos que el resultado es que nuestra función flecha no fue modificada (Puedes ver el <a href="https://babeljs.io/repl#?browsers=%3E%202%25&amp;build=&amp;builtIns=false&amp;spec=false&amp;loose=false&amp;code_lz=MYewdgzgLgBBCuBbGBeGAKAhgGhgIwEpUA-GTGAanwCgg&amp;debug=false&amp;forceAllTransforms=false&amp;shippedProposals=false&amp;circleciRepo=&amp;evaluate=false&amp;fileSize=false&amp;timeTravel=false&amp;sourceType=module&amp;lineWrap=true&amp;presets=env&amp;prettier=false&amp;targets=&amp;version=7.13.9&amp;externalPlugins=">ejemplo aquí</a>)</p><h2 id="conclusi-n">Conclusión</h2><p>En resumen babel es una herramienta necesaria hoy en día para así poder aprovechar todo el poder de las nuevas versiones de JavaScript mientras desarrollas sin preocuparte si los navegadores soportan o no dicha característica.</p><p>Su configuración más común es sencilla, simplemente utilizas el plugin <code>preset-env</code> y configuras los navegadores que quieres soportar. Siempre puedes ir más allá e ir agregando plugins para, incluso, soportar características que aún son solo una propuesta.</p><p>Por lo general no ejecutas babel directamente si no, como parte de un sistema de transformación a producción más grande que incluye algún bundler como webpack, rollup, vite, etc.</p><h3 id="saber-m-s">Saber más</h3><ul><li>Puedes encontrar más información sobre que es ES6 y TC39 en este episodio de <a href="https://www.cafecon.tech/1081172/3872285-que-es-es6">Café con Tech Podcast</a></li><li>Encuentra más información sobre TC39 <a href="https://www.freecodecamp.org/news/tc39-and-its-contributions-to-ecmascript-c178b77f32e1/">en este artículo de Freecodecamp en inglés.</a></li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/Footer-Social-Card.jpg" class="kg-image" alt="Footer-Social-Card" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/Footer-Social-Card.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/03/Footer-Social-Card.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/03/Footer-Social-Card.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/03/Footer-Social-Card.jpg 2400w" sizes="(min-width: 720px) 720px" width="2000" height="533" loading="lazy"></figure><p>✉️ Únete a Micro-bytes &nbsp; &nbsp; &nbsp; &nbsp; 		? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ❤️ <a href="https://buymeacoffee.com/matiasfha">Apoya mi trabajo</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newsletter de micro cursos</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es NPM? ]]>
                </title>
                <description>
                    <![CDATA[ Foto por Sigmund [https://unsplash.com/@sigmund?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText]  on Unsplash [https://unsplash.com/s/photos/node?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText] En este segundo artículo de la serie sobre las distintas herramientas orientadas a la experiencia de desarrollo revisaremos que es npm. Puedes encontrar el primer artículo: ¿Qué es Linting y ESLint? en este enlace [/espanol/news/que-es-linting-y-eslint/]. ¿Qué es n ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-npm/</link>
                <guid isPermaLink="false">601b13c462984e09f60856a4</guid>
                
                    <category>
                        <![CDATA[ npm ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Mon, 08 Feb 2021 15:15:11 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/English-Header.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <small><span>Foto por <a href="https://unsplash.com/@sigmund?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Sigmund</a> on <a href="https://unsplash.com/s/photos/node?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></span></small><!--kg-card-end: html--><p>En este segundo artículo de la serie sobre las distintas herramientas orientadas a la experiencia de desarrollo revisaremos que es <strong>npm</strong>.</p><p>Puedes encontrar el primer artículo: <a href="https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/">¿Qué es Linting y ESLint? en este enlace</a>.</p><h2 id="-qu-es-npm">¿Qué es npm?</h2><p><strong>npm</strong> es parte esencial de Node.js, el entorno de ejecución de javaScript en el lado del servidor basado en el motor V8 de Google. Es muy seguramente la principal razón del gran éxito de Node permitiendo que cientos de desarrolladores puedan compartir paquetes de software entre distintos proyectos.</p><p>En este momento, se han publicado 1,493,231 paquetes por medio de su repositorio con más de 27 mil millones de descargas.</p><p><strong>npm</strong> responde a las siglas de <strong>Node Package Manager</strong> o manejador de paquetes de node, es la herramienta por defecto de JavaScript para la tarea de compartir e instalar paquetes.</p><p>Tal como reza su documentación, <strong>npm</strong> se compone de al menos dos partes principales.</p><ul><li>Un repositorio online para publicar paquetes de software libre para ser utilizados en proyectos Node.js</li><li>Una herramienta para la terminal (command line utility) para interactuar con dicho repositorio que te ayuda a la instalación de utilidades, manejo de dependencias y la publicación de paquetes.</li></ul><p>Es decir, en tu proyecto basado en Node — que actualmente incluye los proyectos de aplicaciones web que utilizan Node para su proceso de compilación y generación de archivos — utilizarás la utilidad de linea de comandos (cli) para consumir paquetes desde el repositorio online, un listado gigantesco de soluciones de software para distintos problemas disponibles públicamente en <a href="http://npmjs.com/">npmjs.com</a> y para manejar dependencias, y para ello necesitas un archivo de configuración que le diga a <strong>npm</strong> que este es un proyecto node.</p><h2 id="package-json">package.json</h2><p>Este archivo indica a npm que el directorio en el que se encuentra es en efecto un proyecto o paquete npm. Este archivo contiene la información del paquete incluyendo la descripción del mismo, versión, autor y más importante aún dependencias.</p><p>Este archivo es generado automáticamente mediante la ejecución de un script de <strong>npm:</strong> <code>npm init</code> este script es ejecutao para inicializar un proyecto JavaScript, al ejecutarlo la linea de comandos te hará algunas preguntas para crear el paquete:</p><pre><code class="language-jsx"> $ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install &lt;pkg&gt;` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (test)
</code></pre><blockquote>Esta utilidad te guiará en el proceso de crear un archivo package.json. Solo cubre los items más comunes y trata de adivinar algunos valores por defecto. Revisa <code>npm help init</code> para documentación más a fondo sobre estos campos y que hacen exactamente. Utiliza <code>npm install &lt;pkg&gt;</code> para instalar paquetes y guardarlos como dependencia en el archivo <code>package.json</code>. Presiona <code>^C</code> en cualquier momento para cancelar</blockquote><blockquote>nombre del paquete: (que-es-npm)</blockquote><p>Lo primero que verás al ejecutar <code>npm init</code> es un mensaje como el anterior y la primera pregunta: <code>nombre del paquete: (que-es-npm)</code> que entre paréntesis mostrará el nombre del directorio en el que se está ejecutando como nombre por defecto.</p><p>Luego veras lo siguiente.</p><pre><code class="language-bash">version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
author:
license (MIT):
private:
</code></pre><p>Puedes simplemente presionar <code>Enter</code> en cada una de estas opciones para dejar vació el campo o guardar el valor por defecto que se muestra entre paréntesis.</p><ul><li><strong>version</strong>: Corresponde a la versión de tu proyecto. Lo ideal es mantener este campo actualizado cuando modificas algo en tu proyecto o librería utilizando por ejemplo <a href="https://semver.org/lang/es/">semver</a>.</li><li><strong>description</strong>: Una breve descripción de tu proyecto. Particularmente importante si lo que estás creando es un paquete que publicarás vía npm.</li><li><strong>entry point:</strong> Define cuál será el punto de "entrada" de tu proyecto. Esto es, que archivo se ejecutará cuando se importe tu proyecto dentro de otro. Nuevamente, especialmente importante para paquetes de librerías.</li><li><strong>test command:</strong> Aquí puedes definir el comando que quieres ejecutar para realizar las pruebas de tu proyecto, este comando se ejecutará cuando escribas <code>npm run test</code> en tu terminal.</li><li><strong>git repository</strong>: Define la url del repositorio git en donde este proyecto está alojado, se utiliza para informar a los usuarios de tu paquete el repositorio en donde encontrar el código fuente del proyecto.</li><li><strong>author:</strong> El nombre e email de quien creó este proyecto.</li><li><strong>license</strong>: Identifica el tipo de licencia de uso de tu proyecto. Permite a las personas saber que y que no está permitido al usar tu código. Puedes encontrar la lista completa de licencias soportadas por este campo <a href="https://spdx.org/licenses/">aquí</a>.</li><li><strong>private:</strong> Es un valor boolean que te permite evitar que tu paquete se publique en el repositorio. Si lo que estás creando es un proyecto personal este valor será <strong>true.</strong></li></ul><p>Una vez contestadas todas las preguntas y terminado el proceso de inicialización tendrás un nuevo archivo dentro del directorio de tu proyecto: <code>project.json</code> cuyo contenido será similar a este</p><pre><code class="language-json">{
  "name": "que-es-npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \\"Error: no test specified\\" &amp;&amp; exit 1"
  },
  "author": "Matias Hernandez &lt;matiasfh@gmail.com&gt; (&lt;https://matiashernandez.dev&gt;)",
  "license": "ISC"
}
</code></pre><h2 id="npm-scripts">npm scripts</h2><p>Una importante sección de este archivo es <code>scripts</code>. Esta sección define un listado de propiedades que permiten ejecutar comandos dentro del contexto de tu proyecto incluyendo: comandos de otros paquetes listados como dependencias, scripts personalizados, scripts bash, etc.</p><p>Por defecto se crea un script para ejecutar el comando de <strong>test</strong> que, si no agregaste nada personalizado en el proceso de inicialización sólo tendrá una llamada al comando <strong>echo,</strong> es decir, ****al ejecutar en la terminal <code>npm run test</code> verás en la consola <code>Error: no test specified</code></p><p>Un ejemplo de producción de esta sección es:</p><pre><code class="language-json">{
		...
		...
    "scripts": {
        "start": "npm run generate &amp;&amp; PORT=5000 react-scripts start",
        "build": "react-scripts build",
        "storybook": "start-storybook -p 6006 -h localhost",
        "build-storybook": "build-storybook -s public",
        "test": "jest",
        "test:watch": "jest --watch --silent",
        "cypress": "cypress run",
        "eject": "react-scripts eject",
        "lint": "eslint src/**/*.{js,ts,tsx} --fix",
        "prettier": "npx prettier --write '**/*.tsx'",
        "generate": "graphql-codegen --config codegen.yml"
    },
    ...
		...
}
</code></pre><p>En este ejemplo podemos ver una lista de 11 scripts que cumplen diferentes tareas tales como:</p><ul><li><strong>start:</strong> Primero ejecuta el script <strong>generate</strong> y luego inicia la aplicación web. <code>react-scripts</code> es una dependencia del paquete y se encuentra disponible dentro del directorio <code>node_modules</code>.</li><li><strong>build:</strong> Ejecuta la compilación de la aplicación en modo producción.</li><li><strong>lint:</strong> Ejecuta el proceso de linting (revisión de formato y estilo de código) del proyecto (Puedes leer más sobre este proceso en el <a href="https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/">primer artículo</a> de esta colección)</li><li><strong>test:</strong> Ejecuta el script de pruebas basado en el paquete <strong>jest</strong> que también está instalado como dependencia.</li><li><strong>prettier</strong>: Ejecuta <strong>prettier</strong> mediante el uso de <strong>npx.</strong> Este es un paquete especial de npm que permite ejecutar binarios dentro del alcance de tu proyecto sin necesidad de especificar dicho comando como script dentro del archivo <code>package.json</code>.</li></ul><h2 id="dependencias-y-dependencias-de-desarrollo">Dependencias y dependencias de desarrollo</h2><p>La siguiente sección muy relevante dentro del archivo es el listado de dependencias y el listado de dependencias de desarrollo</p><pre><code class="language-json">{
   
    "dependencies": {
        "react": "^17.0.1",
        "react-dom": "^17.0.1",
        "react-hook-form": "6.14.1",
        "react-i18next": "11.8.5",
        "react-query": "^3.5.12",
        "react-router-dom": "5.2.0",
        "react-scripts": "4.0.1",
        "react-table": "^7.6.3",
        "react-virtual": "2.3.2",
        "yup": "0.32.8"
    },
		...
		...
    "devDependencies": {
        "@emotion/jest": "11.1.0",
        "@graphql-codegen/add": "2.0.2",
        "@graphql-codegen/cli": "1.20.1",
        "@graphql-codegen/introspection": "1.18.1",
        "@graphql-codegen/typescript": "1.20.2",
        "@graphql-codegen/typescript-graphql-request": "3.0.1",
        "@graphql-codegen/typescript-operations": "1.17.14",
        "@types/jest": "^26.0.20",
        "@types/node": "^12.0.0",
        "@types/react": "^16.9.53",
        "@types/react-dom": "^16.9.8",
        "@types/react-router-dom": "^5.1.7",
        "cypress": "^6.2.1",
        "eslint": "^7.17.0",
        "eslint-config-prettier": "^7.1.0",
        "eslint-plugin-prettier": "^3.3.1",
        "starwars-names": "1.6.0",
        "stylelint": "13.8.0",
        "stylelint-config-prettier": "8.0.2",
        "stylelint-prettier": "1.1.2",
        "ts-jest": "^26.4.4"
    }
}
</code></pre><p>Estas secciones, definen que paquetes disponibles en el repositorio de <strong>npm</strong> son requeridos por tu proyecto indicando también la versión necesaria. La versión mostrada aquí está en formato <strong>semver</strong> y corresponde al campo <strong>version</strong>mencionado antes.</p><p>Estas dependencias son instaladas al ejecutar <code>npm install &lt;pkg&gt; --save</code> y en el caso de las dependencias de desarrollo utilizando <code>npm install &lt;pkg&gt; --save-dev</code>.</p><p>La diferencia de estos listados es que <code>dependencies</code> está destinado a ser utilizando en producción y <code>devDependencies</code>define paquetes que son necesarios sólo durante el desarrollo de tu proyecto.</p><p>Es importante conocer cómo se definen las versiones a utilizar en estas dependencias. Cada una de ellas muestra un número basado en semver en la forma <strong>mayor.minor.patch.</strong></p><ul><li><strong>mayor:</strong> Representa una versión mayor que genera cambios en la API del producto.</li><li><strong>minor</strong>: Representa un valor que aumenta cuando se hacen cambios retro-compatibles.</li><li><strong>patch</strong>: Un valor que aumenta cada vez que se hacen reparaciones de errores o mejoras sutiles.</li></ul><p>También es posible encontrar algunos símbolos frente a la numeración de la versión, estos son:</p><ul><li><code>^</code>: latest minor release. Por ejemplo <code>^1.0.4</code> indica que 1.0.4 es la versión más "baja" que se puede instalar pero permite que se instale cualquier versión superior a esa pero que se encuentre dentro de la versión <code>1</code>.</li><li><code>~</code>: latest patch release. Esta es la forma contraria a &nbsp;<code>^</code>. Esta especificación &nbsp;<code>~1.0.4</code> puede instalar la versión <code>1.0.7</code> si es que esta es la ultima version del <strong>patch</strong>.</li></ul><p>Una vez instalados los paquetes de tus dependencias la información de las versiones instaladas queda almacenada en un archivo llamado <code>package-lock.json</code></p><h2 id="package-lock-json">package-lock.json</h2><p>Este archivo es auto generado por <code>npm install</code> y es una lista descriptiva y exacta de las versiones instaladas durante tu proceso. No esta destinado a ser leído ni manipulado por los desarrolladores, si no, para ser un insumo del proceso de manejo de dependencias.</p><h1 id="-c-mo-trabajar-con-npm">¿Cómo trabajar con npm?</h1><p>Lo más usual que harás con <code>npm</code> es la instalación de dependencias, esto se hace mediante <code>npm install</code> para instalar todas las dependencias listadas en el archivo <code>package.json</code> o utilizando <code>npm install &lt;pkg&gt;</code> para instalar algún paquete en particular.</p><h2 id="npm-install">npm install</h2><p>Este script nativo de <code>npm</code> tiene algunas otras opciones a la hora de hacer la instalación de paquetes.</p><p>Por defecto al ejecutar <code>npm install &lt;pkg&gt;</code> la última versión disponible en el repositorio agregando el símbolo <code>^</code> a la versión.</p><p>Al ejecutar <code>npm install &lt;pkg&gt;</code> el paquete se instalará dentro del directorio <code>node_modules</code> que está dentro de tu proyecto.</p><p>Puedes usar algunos parámetros tales como</p><ul><li><code>-g</code> para indicar que quieres que el paquete se instale globalmente</li><li><code>--production</code> indica que la ejecución de <code>npm install</code> solo instalará las dependencias listadas en el apartado <code>dependencies</code> dejando de lado las dependencias de desarrollo.</li></ul><h2 id="npm-audit">npm audit</h2><p><strong>npm</strong> tiene una miriada de paquetes disponibles lo que es una gran característica indicando lo saludable del ecosistema que es capaz de generar nuevas librerías a gran velocidad, pero también puede ser un problema. <strong>npm</strong> puede albergar paquetes maliciosos o con problema de seguridad.</p><p>La organización trás <strong>npm</strong> mantiene una lista de agujeros de seguridad y puedes utilizar este comando para revisar tus dependencias.</p><p><code>npm audit</code> te entregará información de las vulnerabilidades encontradas en tus dependencias junto con una breve descripción de como resolverlo indicando la versión que corrige el defecto.</p><h2 id="npm-publish">npm publish</h2><p>En el caso de que tu proyecto sea una librería de software libre que quieres compartir con otros, este comando será el que te permitirá publicar tu paquete en el repositorio, solo necesitas ejecutar:</p><ul><li><code>npm login</code> para ingresar a tu cuenta de npm</li><li><code>npm publish</code> para subir tu paquete al repositorio</li></ul><p>Ten en cuenta que necesitas tener bien configurados tu <strong>entry point</strong> y el script de <strong>build.</strong></p><p>También puedes hacer uso de los scripts del ciclo de vida. Una serie de scripts que se ejecutan en diferentes momentos del proceso de publicación:</p><ul><li><strong>prepare</strong> (desde <code>npm@4.0.0</code>): Se ejecuta antes de que el paquete se <em>empaquete</em> (packed) y antes de que se publique. También se ejecuta al correr <code>npm install</code> y <strong>después</strong> del script <code>prepublishOnly</code></li><li><strong>prepublishOnly:</strong> Se ejecuta <strong>antes</strong> de que el paquete sea preparado y empaquetado y solo cuando se ejecuta <code>npm publish</code></li><li><strong>prepack:</strong> Se ejecuta <strong>antes</strong> de empaquetar, es decir antes de <code>npm pack</code> y <code>npm publish</code></li><li><strong>postpack:</strong> Se ejecuta <strong>después</strong> de que el paquete fuese generado y ubicado en su destino final.</li></ul><h3 id="-cu-ndo-usar-estos-scripts">¿Cuándo usar estos scripts?</h3><p>Cuando necesitas que tu paquete ejecuta alguna acción antes de ser utilizado y que no dependa del sistema operativo en que está siendo instalado, por ejemplo: transpilar tu código Typescript a JavaScript, obtener datos remotos que tu paquete necesita, etc.</p><h3 id="-qu-scripts-se-ejecutan-al-publicar-un-paquete">¿Qué scripts se ejecutan al publicar un paquete?</h3><p>Cuando ejecutas <code>npm publish</code> una serie de scripts son ejecutados automáticamente por <strong>npm</strong> el orden de estos scripts es el siguiente:</p><ul><li><code>prepublishOnly</code></li><li><code>prepare</code></li><li><code>prepublish</code></li><li><code>publish</code></li><li><code>postpublish</code></li></ul><p>Es decir, si necesitas ejecutar algún comando antes de que se publique tu paquete debes configurar el script <code>prepublishOnly</code> ¿Cómo?</p><pre><code class="language-json">{
	"scripts": {
		"prepublishOnly": "compile-my-code src/"
	}
}
</code></pre><h2 id="conclusi-n">Conclusión</h2><p><strong>npm</strong> es la solución que ofrece el ecosistema de JavaScript para manejar dependencias, auditar paquetes y mantener un repositorio de paquetes disponible para todos los usuarios, es la herramienta central de todo proyecto JavaScript sea este backend o frontend.</p><p>El sistema de <strong>npm</strong> se basa en un archivo centralizado que describe los metadatos del proyecto, scripts y dependencias tanto de producción como de desarrollo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/02/Footer-Social-Card.jpg" class="kg-image" alt="Footer-Social-Card" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/02/Footer-Social-Card.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/02/Footer-Social-Card.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/02/Footer-Social-Card.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/02/Footer-Social-Card.jpg 2400w" sizes="(min-width: 720px) 720px" width="2000" height="533" loading="lazy"></figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es Linting y ESLint? ¿Cómo empezar? ]]>
                </title>
                <description>
                    <![CDATA[  En el mundo del desarrollo de aplicaciones web hay una miríada de herramientas que buscan, no sólo mejorar la experiencia de usuario y la performance de tu aplicación en general, si no también, mejorar la experiencia de desarrollo (DX). Si bien tener tantas herramientas y opciones a disposición puede ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/</link>
                <guid isPermaLink="false">600e2eb9a4e0700982aa07dc</guid>
                
                    <category>
                        <![CDATA[ ESLint ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Tue, 26 Jan 2021 14:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/English-Header.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h1></h1><p>En el mundo del desarrollo de aplicaciones web hay una miríada de herramientas que buscan, no sólo mejorar la experiencia de usuario y la performance de tu aplicación en general, si no también, mejorar la experiencia de desarrollo (DX). Si bien tener tantas herramientas y opciones a disposición puede ser algo bueno para la mejora intrínsica de estas herramientas, es también un problema para muchos que están comenzando en este proceso ya que puede ser muy confuso seguir indicaciones que presumen de cierto grado de conocimiento previo.</p><p>Si bien hay muchos "boilerplates" o "plantillas de proyectos" disponibles para cada tipo de framework, el uso de estas herramientas cae dentro de una "caja negra" donde pocas veces se entiende como funcionan cada una de ellas, o el por que las necesito.</p><p>En el caótico mundo del desarrollo web, es necesario tener una especie de guía para sobrevivir.</p><p>Esta serie de artículos busca cubrir esa area olvidada o perdida (<a href="https://missing.csail.mit.edu">the missing semester</a>) tanto en la educación formal como en los tutoriales disponibles en internet. Obtener conocimiento y proficiencia con las herramientas, enfocándonos en la experiencia de desarrollador.</p><p>¿Que herramientas estarán incluídas en la serie?</p><ul><li>npm</li><li>Linting (Eslint, stylelint)</li><li>Babel</li><li>Prettier</li><li>Bundlers (Webpack, Rollup, etc)</li><li>Git</li></ul><h1 id="-qu-es-linting">¿Qué es Linting?</h1><p>Es inevitable tener errores en el código que desarrollas para una aplicación, y todos sabemos que estos errores son malos, algunos causan problemas en la interfaz que generan incomodidad en los usuarios, otros comprometen la seguridad del sistema o simplemente rompen todo y la aplicación deja de funcionar.</p><p>Hay un cierto grupo de errores que pueden ser identificados y reparados antes de que tu código llegue a ser ejecutado, estos pueden ser:</p><ul><li>errores de sintaxis</li><li>Código poco intuitivo o dificil de mantener</li><li>Uso de "malas practicas"</li><li>O uso de estlios de codigo inconsistentes.</li></ul><p>Estos errores pueden ser incluso más comunes que otros más graves dado a que son menos evidentes.<br>Capturar errores antes de que tu código se ejecute puede salvarte, no sólo del error en si mismo, si no, también ahorrarte mucho tiempo en la cacería de esos errores.</p><blockquote>En la actualidad, se utiliza este término para designar a herramientas que realizan estas tareas de comprobación en cualquier lenguaje de programación. Las herramientas de tipo lint generalmente funcionan realizando un análisis estático del código fuente. - Wikipedia <a href="https://es.wikipedia.org/wiki/Lint">https://es.wikipedia.org/wiki/Lint</a></blockquote><p>En otras palabras, es una herramienta de software que revisa y "observa" tu código en busca de errores que puedan afectar tu código. Algunos "linteres" incluso pueden darte sugerencias de como arreglar el error o incluso arreglarlo ellos mismos.</p><p>Las herramientas de linting pertenecen a un grupo de programas conocidos como <strong>herramientas de análisis estático</strong> , un proceso de revisión de un programa sin ejecutar dicho programa, por lo general la revisión se realiza sobre el código fuente o alguna clase de código objeto. Visto de otra forma es como tener a un revisor de tu pull request pero automatizado y siempre observando lo que escribes.</p><p>Un ejemplo de herramienta de "linting", y el que usaremos en este artículo es <strong>ESLint</strong>.</p><h2 id="-qu-es-eslint">¿Qué es ESLint?</h2><p>ESLint es una herramienta de código abierto enfocada en el proceso de "lintig" para javascript (o más correctamente para <a href="https://www.ecma-international.org/publications-and-standards/standards/ecma-262/">ECMAScript</a>). ESLint es la herramienta predominante para la tarea de "limpiar" código javascript tanto en el servidor (node.js) como en el navegador.</p><p>Dado que javascript es un lenguaje dinámico y de tipado débil, es especialmente fácil caer en errores humanos a la hora de escribir código. ESLint utiliza un sistema de reglas que permiten definir que es y que no es posible dentro del código. ESLint está escrito en Nodejs y es posible instalarlo desde <a href="http://npmjs.com/">npm</a>.</p><h3 id="-qu-puede-hacer-eslint-por-mi">¿Qué puede hacer ESLint por mi?</h3><p>Bueno, ESLint es una herramienta de "linting", por lo que te puede ayudar a:</p><ul><li>Mostrarte errores de sintaxis.</li><li>Mostrarte errores cuando no se siguen buenas prácticas.</li><li>Proveer sugerencias para mejorar tu código.</li><li>Mantener un estilo consistente en tu código o reforzar reglas internas de tu propio equipo.</li></ul><p>Aquí ESLint es el motor que te ayudará a definir reglas y revisará tu código. ESLint está disponible a travez de <code>[npm](https://www.npmjs.com/package/eslint)</code>.</p><p>ESLint se compone de al menos 3 partes: el Parser, las Reglas y el Resultado.</p><h3 id="parser">Parser</h3><p>El parseador se encarga de convertir tu código, que es escrito para ser leído por un ser humano, a una representación o abstracción que permite que el computador pueda entender tu código. ESLint convierte tu código a un Árbol de Sintaxis Abstracto o AST (del inglés Abstract Syntax Tree). Es esta representación la utilizada por ESLint para aplicar las diferentes reglas necesarias.</p><p>Este árbol es básicamente un gran objeto json que representa cada parte de tu código (existen diferentes tipos de AST generados por diferentes parsers), esta representación es fácil de recorrer y consultar.</p><p>ESLint, recorre este árbol visitando cada uno de los nodos, en cada visita, recorre la lista de reglas y aplica las que corresponden al tipo de nodo visitado.</p><p>Puedes ver una representación de un AST utilizando <a href="https://astexplorer.net/">https://astexplorer.net</a></p><p>Un ejemplo de AST es</p><pre><code class="language-jsx">function setCount(v) {
    return v + 1;
}
</code></pre><p>y el AST correspondiente</p><pre><code class="language-jsx">{
  "type": "Program",
  "start": 0,
  "end": 41,
  "body": [
    {
      "type": "FunctionDeclaration",
      "start": 0,
      "end": 40,
      "id": {
        "type": "Identifier",
        "start": 9,
        "end": 17,
        "name": "setCount"
      },
      "expression": false,
      "generator": false,
      "async": false,
      "params": [
        {
          "type": "Identifier",
          "start": 18,
          "end": 19,
          "name": "v"
        }
      ],
      "body": {
        "type": "BlockStatement",
        "start": 21,
        "end": 40,
        "body": [
          {
            "type": "ReturnStatement",
            "start": 25,
            "end": 38,
            "argument": {
              "type": "BinaryExpression",
              "start": 32,
              "end": 37,
              "left": {
                "type": "Identifier",
                "start": 32,
                "end": 33,
                "name": "v"
              },
              "operator": "+",
              "right": {
                "type": "Literal",
                "start": 36,
                "end": 37,
                "value": 1,
                "raw": "1"
              }
            }
          }
        ]
      }
    }
  ],
  "sourceType": "module"
}
</code></pre><h3 id="las-reglas">Las Reglas</h3><p>El siguiente paso en el proceso es aplicar las reglas. Una regla es una colección de cierta lógica (función) que permite identificar un potencial problema en el código. El resultado de la aplicación de estas reglas puede contener un reporte del error encontrado incluyendo el nodo y otra información que permite arreglar el error.</p><p>Estas reglas son aplicadas por medio de un "transformador". El transformador es quien permite que las reglas (funciones) puedan consultar que nodo del AST esta siendo visitado.</p><p>Un ejemplo de definición de regla es:</p><pre><code class="language-jsx">export default function(context) {
  return {
    Identifier(node) {
      if(node.name === 'console'){
        context.report(node, 'Left in log statement');
      } 
    }
  };
};
</code></pre><p>Esta función es ejecutada cuando el Identificador del nodo es <code>console</code> y reporta que el código contiene el uso de <code>console.log</code>.</p><h3 id="el-resultado"><strong>El Resultado</strong></h3><p>Este es e último paso del proceso. Aquí es donde se define cómo se muestran los reportes de las reglas que se "infringieron". Por defecto la ejecución de ESLint será en consola pero los resultados también pueden ser desplegados en tu editor de texto favorito.</p><h2 id="-c-mo-comienzo">¿Cómo comienzo?</h2><p>La forma más simple de comenzar es primer, tener un proyecto javascript en el que utilizar ESLint.<br>Creemos entonces un simple proyecto al que agregar ESLInt, comienza por crear un directorio en donde almacenar tu proyecto, puedes hacer todo esto directamente en tu terminal.</p><pre><code class="language-jsx">mkdir linting
</code></pre><p>Ahora ingresa en el directorio para comenzar a trabajar</p><pre><code class="language-jsx">cd linting
</code></pre><p>Creemos nuestro primer archivo javascript, que para este ejemplo será muy simple</p><pre><code class="language-jsx">touch app.js
</code></pre><p>Ahora, agreguemos algo de código en este archivo, ábrelo en tu editor favorito y escribe</p><pre><code class="language-jsx">const nombre = 'Matias'

const persona = {nombre}

console.log(persona)

const saludar = (fNombre) =&gt; {
console.log(`Hola! ¿que tal, ${fNombre}?`);
};
const persona = { nombre: 'Otra persona' }
</code></pre><p>Es claro a simple vista algunos problemas de formato con este simple código además de un problema de sintaxis.</p><p>Ahora inicia este proyecto utilizando <code>npm</code></p><pre><code class="language-jsx">npm init
</code></pre><p>Este comando creará el archivo <code>package.json</code>, archivo que describe la configuración de tu proyecto y la lista de dependencias del mismo.</p><p>Ahora con el proyecto javascript preparado agreguemos eslint.</p><h3 id="configurando-eslint">Configurando ESLint</h3><p>Lo primero es instalar ESLint en nuestro proyecto, para ello volveremos a nuestra terminal y utilizaremos <code>npm</code> para instalar esta dependencia</p><pre><code class="language-jsx">npm install eslint --save-dev
</code></pre><p>Utilizamos el argumento &nbsp;<code>--save-dev</code> para indicarle a <code>npm</code> que queremos guardar esta dependencia para uso de desarrollo. ESLint es un paquete que solo necesitamos durante el proceso de desarrollo y no se necesita para ejecutar tu aplicación.</p><p>Una vez instalado, &nbsp;puede iniciar la configuración al ejecutar</p><pre><code class="language-jsx">npx eslint --init
</code></pre><p>este comando ( en particular el argumento<code>--init</code>) es el que activará ESLint en tu proyecto, esto se realiza mediante la creación de un archivo de configuración que vivirá en el directorio principal de tu proyecto.</p><p>El proceso de creación de este archivo se ejecutará en la consola y te hará algunas preguntas comenzando por: ¿Cómo te gustaría usar ESLint?</p><pre><code class="language-jsx">? How would you like to use ESLint? …
  To check syntax only
  To check syntax and find problems
❯ To check syntax, find problems, and enforce code style
</code></pre><p>Selecciona la última opción "Para revisar sintaxis, encontrar problemas y reforzar el estilo de código".</p><p>La siguiente pregunta será:</p><pre><code class="language-jsx">What type of modules does your project use? …
  JavaScript modules (import/export)
❯ CommonJS (require/exports)
  None of these
</code></pre><p>En este caso seleccionas <code>CommonJS</code> ya que no usaremos ninguna herramienta externa (bundlers) para manejar los módulos de nuestro proyecto.</p><p>La siguiente pregunta será:</p><pre><code class="language-jsx">? Which framework does your project use? …
  React
  Vue.js
❯ None of these
</code></pre><p><code>¿Qué framework usarás?</code> Por ahora seleccionarás "None of these"</p><p>Luego te preguntará si usas Typescript o no.</p><pre><code class="language-jsx">? Does your project use TypeScript? › No / Yes
</code></pre><p>Seleccionarás <code>No</code></p><p>La siguiente pregunta será sobre el estilo de código que quieres usar: <code>¿Cómo te gustaría definir un estilo para tu proyecto?</code></p><pre><code class="language-jsx">✔ How would you like to define a style for your project? …
❯ Use a popular style guide
  Answer questions about your style
  Inspect your JavaScript file(s)
</code></pre><p>Selecciona la primera opción: <code>Usar una guía de estilo popular</code> y en la siguiente pregunta selecciona <code>Airbnb</code></p><p>Luego se te preguntará por el tipo de archivo para la configuración cuyas opciones son <code>YAML</code>,<code>Javascript</code> y <code>JSON</code>.</p><p>Finalmente verás el mensaje de aviso que se instalarán algunas dependencias extras y la siguiente pregunta</p><pre><code class="language-jsx">? Would you like to install them now with npm? › No / Yes
</code></pre><p><code>¿Quieres instalar las dependencias ahora con npm?</code> Selecciona <code>Yes</code></p><p>Al terminar este proceso podrás notar que un nuevo archivo fue creado en el directorio raíz del proyecto <code>.eslintrc.json</code> (o <code>. js</code> o <code>.yaml</code> dependiendo de lo seleccionado).</p><p>Finalmente agreguemos algunas reglas simples en el archivo de configuración. Abre el archivo <code>.eslintrc.js</code> (Si elegiste el formato javascript) y verás lo siguiente:</p><pre><code class="language-jsx">module.exports = {
  env: {
    browser: true,
    commonjs: true,
    es2021: true,
  },
  extends: [
    'airbnb-base',
  ],
  parserOptions: {
    ecmaVersion: 12,
  },
  rules: {
  },
};
</code></pre><p>Ahora, agreguemos una nueva guía al arreglo <code>extends</code> y algunas reglas al objeto <code>rules</code></p><pre><code class="language-jsx">module.exports = {
  env: {
    browser: true,
    commonjs: true,
    es2021: true,
  },
  extends: [
    'airbnb-base',
    'eslint:recommended',
  ],
  parserOptions: {
    ecmaVersion: 12,
  },
  rules: {
    semi: ['error', 'always'],
    quotes: ['error', 'double'],
  },
};
</code></pre><p>Aquí agregamos <code>eslint:recommended</code> al arreglo &nbsp;<code>extends</code> indicando que también usaremos las reglas recomendadas de ESLint. Además agregamos dos nuevas reglas en el objeto <code>rules</code> indicando que utilizar punto y coma <code>semi</code> al final de cada linea de código es requerido y &nbsp;que se usaran comillas dobles en los strings.</p><h3 id="utilizar-eslint">Utilizar ESLint</h3><p>El uso más simple que puedes darle a ESLint es revisar tu código de forma manual ejecutando un script en la terminal, para esto puedes escribir <code>npx eslint &nbsp;. --ext .js</code> cada vez o configurar este comando como un script de npm.</p><p>Abre el archivo <code>package.json</code> en tu editor de texto favorito y agrega la sección <code>scripts</code></p><pre><code class="language-jsx">...
"scripts": {
  ...
  "lint": "eslint .  --ext .js"
  ...
},
...
</code></pre><p>Con este comando estarás ejecutando ESLint en todo los archivos con extensión <code>js</code> en tu proyecto.</p><p>Ahora vuelve a tu terminal y puedes ejecutar</p><pre><code class="language-jsx">npm run lint
</code></pre><p>y verás el resultado que mostrará los errores del código que tienes escrito en <code>app.js</code></p><pre><code class="language-jsx">/Users/matias/Development/linting/.eslintrc.js
   8:5   error  Strings must use doublequote  quotes
   9:5   error  Strings must use doublequote  quotes
  15:12  error  Strings must use doublequote  quotes
  15:21  error  Strings must use doublequote  quotes
  16:14  error  Strings must use doublequote  quotes
  16:23  error  Strings must use doublequote  quotes

/Users/matias/Development/linting/app.js
  10:7  error  Parsing error: Identifier 'persona' has already been declared

✖ 7 problems (7 errors, 0 warnings)
  6 errors and 0 warnings potentially fixable with the `--fix` option.
</code></pre><p><em> </em>Las primeras líneas indican: <em> error: los Strings deben usar dobles comillas</em></p><p>y luego: <em> 10:7 error de Parsing: El identificador persona ya fue declarado.</em></p><p>Podemos intentar que ESLint arregle algunos de estos problemas automáticamente utilizando el argumento <code>--fix</code>. Abre tu archivo <code>package.json</code> para agregar un nuevo script:</p><pre><code class="language-jsx">"lint-fix": "eslint . --ext .js --fix"
</code></pre><p>Y ahora en la terminal</p><pre><code class="language-jsx">npm run lint-fix
</code></pre><p>Y el resultado será</p><pre><code class="language-jsx">/Users/matias/Development/linting/app.js
  10:7  error  Parsing error: Identifier 'persona' has already been declared

✖ 1 problem (1 error, 0 warnings)
</code></pre><p><em> 10:7 &nbsp;error de Parsing: El Identificador persona ya ha sido declarado</em></p><h2 id="conclusi-n">Conclusión</h2><p>El proceso de <code>linting</code> se han convertido en una herramienta básica y necesaria en todo proyecto de software, sobre todo en el mundo del desarrollo web con javascript.</p><p>Sus beneficios van más allá de lo que ESLint hace técnicamente ya que ayuda a los desarrolladores a enfoncarse en lo más importante: desarrollar soluciones.<br>Este tutorial introduce algunas de las cosas que puedes lograr utilizando ESLint y una breve descripción de cómo ESLint funciona.</p><p>Si quieres leer más información sobre las reglas que puedes utilizar y cómo personalizar las reglas de ESLint puedes revisar la &nbsp;<a href="https://eslint.org/docs/rules/">documentación</a>.</p><h3 id="otras-herramientas-de-linting-que-vale-la-pena-conocer-"><strong>Otras herramientas de linting que vale la pena conocer.</strong></h3><ul><li><a href="https://jshint.com/">JSHint</a>: una alternativa a ESLint</li><li><a href="https://github.com/stylelint/stylelint">Stylelint</a>: una herramienta de linting para tu código CSS.</li><li><a href="https://github.com/dustinspecker/awesome-eslint">Awesome ESLint</a>: Una lista de configuraciones, parsers, plugins y otras herramientas para mejorar tu propia configuración de ESLint.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/01/Footer-Social-Card-1.jpg" class="kg-image" alt="Footer-Social-Card-1" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/01/Footer-Social-Card-1.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/01/Footer-Social-Card-1.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/01/Footer-Social-Card-1.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/01/Footer-Social-Card-1.jpg 2400w" sizes="(min-width: 720px) 720px" width="2000" height="533" loading="lazy"></figure><p>? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ✉️ <a href="https://matiashernandez.ck.page">Únete al newsletter</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;❤️ <a href="https://buymeacoffee.com/matiasfha">Apoya mi trabajo</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es un closure en Javascript? ]]>
                </title>
                <description>
                    <![CDATA[  Closure es un concepto confuso por que su uso es “invisible”. A diferencia de otros conceptos como funciones, variables u otros. Los closures no son siempre utilizados a conciencia y de forma directa. No dices: Oh aquí usaré un closure como solución. Pero al mismo tiempo, lo más probable ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-un-closure-en-javascript/</link>
                <guid isPermaLink="false">5ff3113a8c7cd154bb9840b9</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Wed, 06 Jan 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/Twitter-header---1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p></p><p><strong>Closure es un concepto confuso por que su uso es “invisible”.</strong></p><p>A diferencia de otros conceptos como funciones, variables u otros. Los closures no son siempre utilizados a conciencia y de forma directa. No dices: Oh aquí usaré un closure como solución.</p><p>Pero al mismo tiempo, lo más probable es que ya lo has usado cientos de veces. Aprender closure es más sobre identificar cuando lo estas utilizando que aprender un nuevo concepto en sí.</p><h3 id="tldr-">TLDR;</h3><p>Tienes una closure cuando una función cualquiera accede a una variable<strong> fuera de su contexto.</strong></p><pre><code class="language-javascript">const valor = 1
function obtenerModulo() {
    let datos = [1,2,3,4,5,6,7,8,9,10,11]
    return datos.filter(item =&gt; item % valor === 0)
}
</code></pre><p>Aqui la función `obtenerModulo` hace uso de `valor`. Pero también la función `item =&gt; item % valor === 0` que también puede ser escrita como</p><pre><code class="language-javascript">function(item){
    return item % valor === 0
}
</code></pre><p>utiliza el valor de la variable `value` que fue definida fuera de la función.</p><h2 id="las-funciones-pueden-acceder-valores-fuera-de-su-contexto">Las funciones pueden acceder valores fuera de su contexto</h2><p>Como en el ejemplo anterior, una función puede acceder y utilizar valores que están definidos fuera de su “cuerpo” o contexto, por ejemplo</p><pre><code>let count = 1
function contador() {
    console.log(count)
}
contador() // imprime 1
count = 2
contador() // imprime 2
</code></pre><p>Esto, permite que podamos modificar el valor de la variable `count` desde cualquier parte del módulo y, cuando la función contador sea llamada, sabrá usar el valor actual.</p><h2 id="-por-qu-usamos-funciones">¿Por qué usamos funciones?</h2><p>Pero, por que utilizamos funciones en nuestros programas?, Ciertamente es posible - dificil, pero posible - escribir un programa sin utilizar funciones definidas por nosotros mismos, entonces ¿por qué creamos funciones propias?</p><p>Imagina un trozo de código que hace <strong>algo maravilloso</strong> , lo que sea, y está compuesto por X número de lineas</p><pre><code>/* Mi trozo de codigo maravilloso */
</code></pre><p>Ahora, supón que debes utilizar este <strong>trozo de codigo maravilloso</strong> en varias partes de tu programa, ¿Qué harías?.<br>La opción<em> “natural”</em> es juntar este trozo de código en un conjunto que pueda ser reutilizable, y ese conjunto reutilizable es lo que llamamos <strong>función</strong>. Las funciones son la mejor forma de reutilizar y compartir código dentro de un programa.</p><p>Ahora, puedes utilizar tu función cuantas veces sean y - ignorando algunos casos particulares- llamar tu función <em>N </em>veces es lo mismo que escribir ese <strong>trozo de código maravilloso</strong> <em>N</em> veces. Es un simple reemplazo.</p><h2 id="-pero-d-nde-est-el-closure-aqu-">¿Pero dónde está el closure aquí?</h2><p>Usando el ejemplo del contador, consideremos ese como el <strong>trozo de código maravilloso</strong></p><pre><code>let count = 1
function contador() {
    console.log(count)
}
contador() // imprime 1
</code></pre><p>Ahora, queremos reutilizarlo en muchas partes, por lo que lo "envolveremos" en una función.</p><pre><code class="language-javascript">function miFuncion() {
    let count = 1
    function contador() {
        console.log(count)
    }
    contador() // imprime 1
}
</code></pre><p>ahora, que tenemos?<br><br>Una función: `contador` que utiliza un valor que fue declarado fuera de ella `count`. Y un valor: `count` que fue declarado en la función `miFuncion` pero que es usado dentro de la función `contador`.</p><p>Es decir, tenemos una función que utiliza un valor que fue declarado fuera de su contexto: <strong>un closure</strong>.</p><p>¿Simple no? Ahora, ¿qué pasa cuándo se ejecuta la función `miFuncion`?, ¿qué ocurre con la variable `count` y la función `contador`?<br>Una vez ejecutada la función <strong>padre</strong>, las variables y funciones declaradas en su cuerpo “desaparecen” (garbage collector).</p><p>Ahora, modifiquemos un poco el ejemplo:</p><pre><code class="language-Javascript">function miFuncion() {
    let count = 1
    function contador() {
        count++
        console.log(count)
    }
   setInterval(contador, 2000)
}
miFuncion()
</code></pre><p>¿Qué ocurrirá ahora con la variable y función declaradas dentro de `marvel`?<br>En este ejemplo, le decimos al browser que ejecute `contador` cada 2 segundos. Por lo que el engine de javascript debe mantener una referencia a la función y tambien a la variable que es utilizada por ella. Entonces, incluso una vez que la función padre `miFuncion` termine su ciclo de ejecución, la función `contador` y el valor `count` seguiran <em>“viviendo”</em>.</p><p>Este “efecto” de tener closures ocurre por qué javascript soporta la anidación de funciones, o en otras palabras: Las funciones son <strong>ciudadanos de primera clase</strong> en el lenguaje y pueden ser utilizadas como cualquier otro objeto: anidadas, pasadas como argumento, como valor de retorno, etc.</p><h2 id="-qu-puedo-hacer-con-closures">¿Qué puedo hacer con closures?</h2><h3 id="expresi-n-de-funci-n-inmediatamente-invocada-immediately-invoked-function-expression-iife-">Expresión de Función Inmediatamente invocada - Immediately-invoked Function Expression (IIFE)</h3><p>Es una ténica utilizada mucho en los días de ES5 para implementar el patrón de diseño de “modulo” (antes de que esto fuese soportado nativamente).<br>La idea es “envolver” tu módulo en una función que es inmediatamente ejecutada</p><pre><code class="language-javascript">(function(arg1, arg2){
...
...
})(arg1, arg2)
</code></pre><p>Esto permitía el uso de variables privadas que sólo podían ser utilizadas por el propio módulo dentro de la función, es decir, permitía emular los modificadores de acceso.</p><pre><code class="language-javascript">const modulo = (function(){
	function metodoPrivado () {
	}
	const valorPrivado = "algo"
	return {
	  get: valorPrivado,
	  set: function(v) { valorPrivador = v }
	}
})()

var x = modulo()
x.get() // "algo"
x.set("Otro valor")
x.get() // "otro valor"
x.valorPrivado //Error
</code></pre><h3 id="function-factory">Function Factory</h3><p>Otro patrón de diseño implementado gracias a los closures es la “Fábrica de Funciones” (Function Factory), &nbsp;funciones que crean funciones u objetos, por ejemplo, una función que te permite crear objetos usuarios.</p><pre><code class="language-javascript">
const crearUsuario = ({ userName, avatar }) =&gt; ({
      id: crearUnID(),
      userName,
      avatar,
      cambiarUserName (userName) {
        this.userName = userName;
        return this;
      },
      cambiarAvatar (url) {
        // ejecuta logica para obtener el avatar desde la url
        const nuevoAvatar = obtenerAvtarDesdeUrl(url)
        this.avatar = nuevoAvatar
        return this
      }
    });
    
        console.log(crearUsuario({ userName: 'Bender', avatar: 'bender.png' }));
    
    {
      "id":"17hakg9a7jas",
      "avatar": "bender.png",
      "userName": "Bender",
      "cambiarUsername": [Function cambiarUsername]
      "cambiarAvatar": [Function cambiarAvatar]
    
    }
    */</code></pre><p>Y utilizando este patrón, es posible implementar una idea proviniente de la programación funcional: <strong>Currying</strong></p><h3 id="currying">Currying</h3><p>Es un patrón de diseño ( y característica de algunos lenguajes ) en donde una función, es inmediatamente evaluada y retorna una segunda función.<br>Este patrón permite ejecutar especialización y composición.<br></p><p>Estas funciones “curried” son creadas utilizando closures, definiendo y retornando la función interna del closure.</p><pre><code>function multiplicar(a) {

    return function (b) {
        return function (c)  {
            return a * b * c
        }
    }
}
let mc1 = multiplicar(1);
let mc2 = mc1(2);
let res = mc2(3);
console.log(res);

let res2 = multiplicar(1)(2)(3);
console.log(res2);
</code></pre><p>Este tipo de funciones toman un solo valor o argumento y retornan otra función que también recibe un argumento. Es una aplicación parcial de los argumentos. También es posible reesscribir este ejemplo utilizando ES6.</p><pre><code class="language-javascript">let multiplicar = (a) =&gt; (b) =&gt; (c) =&gt; {

    return a * b * c;
}

let mc1 = multiplicar(1);
let mc2 = mc1(2);
let res = mc2(3);
console.log(res);

let res2 = multiplicar(1)(2)(3);
console.log(res2);
</code></pre><p>¿Dónde podemos aplicar el uso de currying?, en composición, digamos que tienes una función que crea elementos html.</p><pre><code class="language-javascript">function crearElemento(elemento){
    const el = document.createElement(elemento)
    return function(contenido) {
        return el.textNode = contenido
    }
}

const negrita = crearElemento('b')
const italica = createElemento('i')
const contenido = 'Mi contenido'
const miElemento  = negrita(italica(contenido)) // &lt;b&gt;&lt;i&gt;Mi contenido&lt;/i&gt;&lt;/b&gt;
</code></pre><h3 id="event-listeners">Event Listeners</h3><p>Otro lugar en donde puedes utilizar y aplicar closures es en los manejadores de eventos utilizando React.</p><p>Supongamos que estas utilizando una librería de terceros para renderizar los items de tu colección de datos, esta libraría expone un componente llamado `RenderItem` que tiene sólo una prop disponible `onClick`. Esta prop no recibe parámetro alguno y tampoco retorna un valor.</p><p>Ahora, en tu particular app, requieres que al hacer click en el item se muestre una alerta con el título del item, pero el evento onClick que tienes dispobile no acepta argumentos, que puedes hacer?<br>Closures al rescate:</p><pre><code class="language-javascript">// Esta es el closure
// en es5
function onItemClick(titulo) {
    return function() {
      alert("Click en " + titulo)
    }
}
// en es6
const onItemClick = titulo =&gt; () =&gt; alert(`Click en ${titulo}`)

return (
  &lt;Contenedor&gt;
{items.map(item =&gt; {
return (
   &lt;RenderItem onClick={onItemClick(item.titulo)}&gt;
    &lt;Titulo&gt;{item.titulo}&lt;/Titulo&gt;
  &lt;/RenderItem&gt;
)
})}
&lt;/Contenedor&gt;
)
</code></pre><p>En este simplificado ejemplo lo que hacemos es crear una función que recibe el titulo que quieres mostrar y retorna otra función que cumple con la definición de la función que <code>RenderItem</code> recibe como prop.</p><h2 id="conclusi-n">Conclusión</h2><p>Si bien puedes desarrollar una app sin siquiera saber que estás utilizando closures, el conocer su existencia, definición y uso desbloquea nuevas posibilidades a la hora de crear una solución. Closures es uno de esos conceptos que se complican en entender cuando estás empezando, pero hacer el intento de utilizarlos con conocimiento puede permitirte aumentar tus herramientas y avanzar en tu carrera.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/01/Footer-Social-Card.jpg" class="kg-image" alt="Footer-Social-Card" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/01/Footer-Social-Card.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/01/Footer-Social-Card.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/01/Footer-Social-Card.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/01/Footer-Social-Card.jpg 2400w" sizes="(min-width: 720px) 720px" width="2000" height="533" loading="lazy"></figure><p>? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ✉️ <a href="https://matiashernandez.ck.page">Únete al newsletter</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;❤️ <a href="https://buymeacoffee.com/matiasfha">Apoya mi trabajo</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué son React Server Components? ]]>
                </title>
                <description>
                    <![CDATA[ El equipo tras React no encontró mejor manera de terminar el año que dejando a la comunidad de desarrolladores con ansiedad por obtener una nueva característica en la ya prominente librería. El 21 de Diciembre se publicó la grabación de una charla [https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html]  en donde Dan Abramov [https://twitter.com/dan_abramov], Lauren ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-son-react-server-components/</link>
                <guid isPermaLink="false">5fed074a8c7cd154bb982104</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Thu, 31 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/Twitter-header---1-2.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>El equipo tras React no encontró mejor manera de terminar el año que dejando a la comunidad de desarrolladores con ansiedad por obtener una nueva característica en la ya prominente librería.</p><p>El 21 de Diciembre se publicó la grabación de una <a href="https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">charla</a> en donde <a href="https://twitter.com/dan_abramov">Dan Abramov</a>, <a href="https://twitter.com/sugarpirate_">Lauren Tan</a>, <a href="https://twitter.com/en_JS">Joseph Savona</a>, y <a href="https://twitter.com/sebmarkbage">Sebastian Markbåge</a>, explican el razonamiento trás esta característica y algunos casos de uso.</p><p>Cabe destacar que esta característica es aún completamente experimental y no tiene documentación más allá del <a>RFC publicado</a> por el equipo.</p><blockquote>Estamos compartiendo este trabajo en el espíritu de la transparencia y para obtener opiniones y comentarios de la comunidad de React. Tendremos mucho tiempo para ello, no te sientas precionado de hacerlo ahora mismo.</blockquote><!--kg-card-begin: html--><small>Versión original en ingles</small><!--kg-card-end: html--><blockquote>We are sharing this work in the spirit of transparency and to get initial feedback from the React community. There will be plenty of time for that, so don’t feel like you have to catch up right now!</blockquote><p></p><p><strong>Entonces ¿de que se trata?</strong></p><p>Comencemos por aclarar algunos términos y así diferenciar esta nueva propuesta de algunas técnicas que ya están disponibles hoy en día.</p><p>Es similar a <strong>server-side rendering </strong>(SSR renderizado en el lado del servidor) pero funciona diferente. SSR es tomar un componente React y hacer que el servidor renderice su contenido al recibir una petición generando así un <strong>string</strong> de HTML que se envía al navegador para que lo muestre, después se carga el javascript necesario y se vuelve al ciclo estándar de una aplicación <strong>Client Side Rendering</strong>.</p><p>Similar a lo que hace Next.js con <strong>getInitialProps</strong>, los <strong>Server Components</strong> pueden obtener datos y pasar esa información a los componentes del cliente, sin embargo, a diferencia de esta técnica de <strong>SSR</strong>, los <strong>Server Components</strong> son más "dinámicos". Es posible obtener un árbol de componentes desde el servidor e inyectarlo en la aplicación cliente sin perder el estado del cliente.</p><p>Otra diferencia es que con SSR, el código javascript genera y renderiza un string HTML en el servidor, creando así la parte visible del sitio web a modo de template HTML. Este template es enviado al cliente junto al código javascript necesario para habilitar interactividad, permitiendo una carga inicial muy veloz, pero con interactividad que puede tomar algo más de tiempo en el proceso de hidratación.</p><h2 id="server-components">Server Components</h2><p>La nueva técnica e implementación presentada complementa SSR habilitando el renderizado por medio de una abstracción intermedia sin la necesidad de agregar javascript al bundle inicial de tu aplicación.</p><p>Pero ten en cuenta que Server Componentes no buscan ser un reemplazo para SSR, sino más bien, para ser utilizados en conjunto. Utiliza SSR para los componentes del cliente, consiguiendo así una disminución significativa en el tamaño del bundle. Los primeros experimentos del equipo de React pudieron medir una disminución ente 18% y 29%.</p><blockquote>[RFC]: If we migrate the above example to a Server Component we can use the exact same code for our feature but avoid sending it to the client - a code savings of over 240K (uncompressed):</blockquote><p><strong>¿Será Next.js reemplazado por Server Components?</strong></p><p>No. Son implementaciones y soluciones diferentes. La adopción inicial de SC muy probablemente será inicialmente realizada por frameworks como Next y Gatsby.</p><ul><li>El código de SC nunca llega al cliente. Las implementaciones de SSR que utilizando React, el código del componente es enviado al cliente en el bundle aumentando la cantidad de código que el browser necesita parsear y ejecutar.</li><li>SC permiten acceder al backend en cualquier parte del árbol de componentes. Al utilizar soluciones cómo Next.js puedes acceder a datos del backend de forma limitada al utilizar el método getServerProps() que a su vez tiene la limitación de solo poder utilizarse en una página de primer nivel, no puedes obtener datos del servidor desde cualquier otro componente o incluso de algún paquete de npm.</li><li>SC pueden ser re-obtenidos mientras se mantiene el estado del cliente dentro del árbol. Esto es porque el mecanismo de transporte utilizado no es simple HTML, sino más bien un objeto similar a la definición de un node dentro del árbol de &nbsp;componentes.</li></ul><p><strong>¿Quieres saber más?</strong></p><p>Te recomiendo ver la <a href="https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">charla original</a>, leer el <a href="https://reactjs.org/blog/2020/12/21/data-fetching-with-react-server-components.html">RFC</a> y revisar el demo de la propuesta.</p><p>Y recuerda, <strong>no necesitas utilizar</strong> ni aprender esta propuesta ahora, y probablemente tampoco será pronto, pero si es adecuado mantener esta propuesta en tu visión periférica.</p><p></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/12/Footer-Social-Card.jpg" class="kg-image" alt="Social Card: Sígueme en Twitter" width="600" height="400" loading="lazy"></figure><p>? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ✉️ <a href="https://matiashernandez.ck.page">Únete al newsletter</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;❤️ <a href="https://buymeacoffee.com/matiasfha">Apoya mi trabajo</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
