Nota: todos los enlaces externos refieren a documentación en inglés.

Yarn es un nuevo gestor de paquetes JavaScript construido por Facebook, Google, Exponent y Tilde. Como se puede leer en el anuncio oficial, su propósito es resolver algunos problemas que los equipos de estas empresas enfrentaron al usar NPM, como que la Instalación de paquetes no fue rápida o lo suficientemente consistente, o los problemas de seguridad surgidos a raíz de la manera en que NPM permite ejecutar paquetes de código en la instalación.

Sin embargo, esto no es un intento de sustituir por completo a NPM. Yarn es solamente un nuevo cliente CLI que obtiene módulos del registro de NPM. Nada va a cambiar sobre los propios registros; es decir, todavía serás capaz de invocar y publicar paquetes de forma normal.

¿Esto quiere decir que habría que adoptar Yarn inmediatamente? Tampoco así, porque lo más probable es que nunca te hayas encontrado con estos problemas usando NPM. En este artículo, vamos a comparar NPM y Yarn, para que puedas decidir cuál es el mejor para tí.

Yarn vs NPM: Diferencias Funcionales

En un primer vistazo, Yarn y NPM parecen similares. Sin embargo, cuando miramos con más detenimiento, podemos apreciar en que es diferente Yarn.

El archivo yarn.lock

En package.json, el archivo donde tanto NPM como Yarn hacen un seguimiento de las dependencias del proyecto, los números de versión no siempre son exactos. En su lugar, se puede definir una gama de versiones. De esta manera se puede elegir una versión mayor y menor específica de un paquete y permite que NPM pueda instalar el último parche que corrige algunos errores.

En un mundo ideal de control de versiones semántico, los comunicados de parcheado no deberían incluir ningún cambio de ruptura. Esto, por desgracia, no siempre es cierto. La estrategia empleada por NPM puede resultar tal que en dos máquinas con el mismo archivo package.json que tienen diferentes versiones de un paquete instalado, tengan la posibilidad de introducir errores.

Para evitar desajustes en la versión del paquete, una versión exacta instalada está inmovilizada en un archivo de bloqueo. Cada vez que se añade un módulo, Yarn crea (o actualiza) un archivo yarn.lock. De esta manera se puede garantizar que en otra máquina se pueda instalar exactamente el mismo paquete, sin dejar de tener una gama de versiones permitidas definidas en package.json.

En NPM, el comando NPM shrinkwrap genera un archivo de bloqueo y NPM install lee ese archivo antes de leer package.json, al igual que Yarn lee primero yarn.lock.

La diferencia importante aquí es que Yarn siempre crea y actualiza yarn.lock, mientras que NPM no crea uno por defecto y sólo actualiza NPM-shrinkwrap.json cuando existe.

documentación sobre yarn.lock

Instalación paralela

Siempre que NPM o Yarn tienen que instalar un paquete, llevan a cabo una serie de tareas. En NPM, estas tareas son ejecutadas por paquete y de forma secuencial, lo que significa que se esperará a que un paquete esté completamente instalado antes de pasar al siguiente. Yarn ejecuta estas tareas en paralelo, aumentando el rendimiento.

Haciendo una comparativa mediante la instalación del paquete «express» utilizando tanto NPM como Yarn sin un archivo shrinkwrap bloqueado y con una caché limpia, lo cual instala 42 paquetes en total, NPM tardó 9 segundos y Yarn, 1,37 segundos. Instalando el paquete «Gulp», que tiene 195 dependencias, NPM tardó 11 segundos y Yarn, 7,81 segundos

Parece que la diferencia depende estrechamente de la cantidad de paquetes que se están instalando. De cualquier manera, Yarn es constantemente más rápido.

Limpiador de salida

Por defecto NPM es muy detallado. Por ejemplo, de forma recursiva enumera todos los paquetes instalados cuando se ejecuta, NPM install .

Yarn por otra parte, no es detallado en absoluto. Cuando los detalles se pueden obtener a través de otros comandos, enumera significativamente menos información con los emoji apropiados (a menos que estés en Windows).

Yarn vs NPM: Diferencias de la CLI

Aparte de algunas diferencias funcionales, Yarn también tiene diferentes comandos. Algunos de NPM se quitaron, otros se modificaron y también se añadieron un par de comandos interesantes.

Yarn global

A diferencia de NPM, donde las operaciones globales se realizan utilizando el -g o la bandera –global, los comandos de Yarn tienen que llevar el prefijo «global». Al igual que NPM, las dependencias específicas de un proyecto no deben ser instaladas globalmente.

El prefijo global sólo funciona para yarn add, yarn bin, yarn ls y yarn remove. Con la excepción de yarn add, estos comandos son idénticos a sus equivalentes en NPM.

Yarn documentación global

Yarn install

El comando NPM install instala las dependencias del archivo package.json y permite añadir nuevos paquetes. Yarn install sólo instala las dependencias enumeradas en yarn.lock o package.json, en ese orden.

Yarn install documentación
NPM install documentación

Yarn add [-dev]

Al igual que en NPM install , Yarn add permite añadir e instalar una dependencia. Como el nombre del comando indica, se añade una dependencia, lo que significa que automáticamente guarda una referencia al paquete en el archivo package.json, al igual que lo hace la bandera de NPM –save. La bandera –dev de Yarn agrega el paquete como una dependencia de desarrolladores, como la bandera –save-dev de NPM.

documentación Yarn add
documentación NPM install

Licencias de yarn [ls|generate-disclaimer]

En el momento de redactar esta nota no está disponible una equivalencia en NPM.

Yarn licences ls lista las licencias de todos los paquetes instalados. Yarn licenses generate-disclaimer genera licencias de descargo de responsabilidad con una advertencia que contiene todas las licencias de todos los paquetes. Algunas licencias afirman que se deben incluir en los proyectos, haciendo de ésta una herramienta bastante útil para hacerlo.

Documentación de licencias de Yarn

Yarn Why

Este comando se ve en el gráfico de dependencias y da cuenta de qué paquete se ha instalado en el proyecto. Tal vez se haya añadido explícitamente, tal vez es una dependencia de un paquete que has instalado. Yarn te ayuda a darte cuenta de eso.

Documentación de Yarn Why

Yarn Upgrade [paquete]

Este comando actualiza el paquete a la última versión conforme a las reglas establecidas en la versión presente en package.json y recrea yarn.lock. Esto es similar a la actualización en NPM.

Curiosamente, cuando se especifica un paquete, se actualiza el paquete a la última versión y se actualiza la etiqueta que se define en el archivo package.json. Esto significa que este comando puede actualizar paquetes a una nueva versión principal.

documentación de Yarn Upgrade

Yarn generate-lock-entry

El comando Yarn generate-lock-entry genera un archivo yarn.lock basado en las dependencias establecidas en package.json. Esto es similar a shrinkwrap NPM. Este comando debe utilizarse con precaución, ya que se genera el archivo de bloqueo y se actualiza automáticamente al añadir y actualizar las dependencias a través del Yarn y añade la actualización de Yarn.

documentación Yarn generate-lock-entry
documentación shrinkwrap NPM

Estabilidad y Fiabilidad

Aunque se recibieron una gran cantidad de reportes el primer día en que se liberó al público, la tasa de problemas resueltos también es asombrosa.

Esto indica que la comunidad está trabajando duro para encontrar y eliminar errores. En cuanto a la cantidad y el tipo de cuestiones, Yarn parece estable para la mayoría de usuarios, pero todavía no podría ser adecuado para casos extremos.

Ten en cuenta que aunque un gestor de paquetes es probablemente vital para tu proyecto, es sólo un gestor de paquetes. Si algo va mal, la re-instalación de paquetes no debería ser difícil y tampoco hay que volver nuevamente a NPM.

El futuro

No se que tan consciente eres de la historia entre Node.js e io.js. Para recapitular: io.js fue un fork de Node.js creado por algunos colaboradores después de un desacuerdo sobre la gobernabilidad del proyecto. io.js eligió un gobierno abierto. En menos de un año, ambos equipos llegaron a un acuerdo, io.js se fusionó de nuevo en Node.js y el primero (io.js) se suspendió. Independientemente de lo correcto o incorrecto que esto haya sido, introdujo un montón de nuevas características y mejoras a Node.js.

Hay patrones similares entre NPM y Yarn. A pesar de que Yarn no es un fork, mejora varios defectos que tiene NPM. ¿No sería genial si NPM aprendiera de esto y pidiera a Facebook, Google y los otros colaboradores de Yarn contribuir en la mejora de su herramienta CLI? Aunque es demasiado pronto para decir si esto va a pasar, personalmente espero que pase.

De cualquier manera, el futuro de Yarn se ve brillante. La comunidad parece llena de una productiva excitación y está recibiendo de esta manera a este nuevo gestor de paquetes.

Desafortunadamente, no hay ninguna hoja de ruta disponible, así que no estoy seguro de las sorpresas que Yarn tiene reservadas para nosotros los desarroladores.

Conclusión

Yarn se anota puntos al mejorar la manera de usar los valores predeterminados en comparación con NPM.

Tenemos un archivo de bloqueo de forma gratuita, la instalación de paquetes es veloz y se almacenan automáticamente en package.json.

El impacto de la instalación y el uso de Yarn es también mínimo. Puedes probarlo en un solo proyecto, y ver si funciona para tí o no. Esto hace de Yarn un sustituto perfecto para NPM.

Sin duda, recomendaría tratar el uso de Yarn en un solo proyecto, tarde o temprano. Si deseas tomar precauciones acerca de la instalación y el uso de un nuevo software, dale un par de meses. Después de todo, NPM está probado en combate y sin duda vale la pena tener algo parecido al mundo del desarrollo de software.

Si por casualidad te encuentras esperando usar NPM para instalar paquetes, podría ser el momento perfecto para leer la guía de migración.