Hasta ahora Yarn había sido una alternativa a instalar paquetes de Node.js mediante npm, la herramienta oficial. Siempre he favorecido Yarn por su rapidez para hacer el mismo trabajo que npm a pesar de que en recientes versiones npm ha ganado mucho en eficiencia a la hora de hacer su trabajo.

Recientemente Yarn lanzó su versión 2, lo que supone un cambio radical en la forma en que usualmente trabajamos con el infame problema del folder node_modules. En forma muy resumida, esta nueva versión de Yarn no se instala ya como un módulo global, ahora se instala a nivel de directorio (proyecto), por lo que se podrá manejar de manera más granular la configuración de cada proyecto en vez de intentar ser un repositorio global para cualquier proyecto que utilice la instalación existente. Esto tiene razones muy puntuales, puesto que el equipo detrás de Yarn está intentando alejarse del ineficiente esquema del folder node_modules a una solución verdaderamente eficiente que se puede resumir en lo siguiente:

  • npm siempre hará una búsqueda recursiva dentro del folder node_modules al momento de instanciar una librería hasta encontrar el folder solicitado. Para quienes conocen el tamaño que puede alcanzar este folder se imaginarán lo ineficiente y lento que es este proceso. Esta es la principal razón por la que los aplicativos que utilizan este tipo de instalaciones son muy tardados en iniciar, puesto que deben hacer una resolución de todas las librerías solicitadas en un folder que usualmente es un barril sin fondo.
  • Debido a que node_modules es una ubicación centralizada en cualquier proyecto sin ninguna optimización de ningún tipo, cualquier paquete nuevo que se instala en dicha ubicación en vez de validar si ya existen dependencias copia nuevamente cualquier cantidad de dependencias que necesite y eso hace que el tamaño del proyecto crezca exponencialmente y por si fuera poco, causando ambigüedades al momento de que nuestro aplicativo intenta ejecutarse puesto que será común encontrar versiones distintas de la misma dependencia regadas como dependencias de otras librerías que hacen uso de las mismas.
  • Empezando como el comportamiento default en la versión 2, Yarn creará un archivo .pnp.js en vez de agregar un nuevo folder a node_modules. Este archivo, en vez de contener los fuentes de la librería que se instala apunta hacia una única ubicación en disco que contiene los fuentes. Adicionalmente Yarn mantiene un segundo mapeo que indica qué librerías utilizan qué paquetes y en qué versiones, para asegurar aún más la resolución exacta de versiones.

Si bien es un esquema que tiene mucho sentido, es un tanto riesgoso para proyectos que ya se encuentran estables y hacer un cambio de esta naturaleza abre la puerta para muchas pesadillas de mantenimiento. Pero si estamos en la posibilidad de hacerlo en alguno de nuestros proyectos considero que es un experimento que apunta a una mejor estabilidad y menores dolores de cabeza al momento de actualizar liberías a versiones más recientes.

¿Cómo instalar Yarn versión 2 en un proyecto existente?

Si ya contamos con un proyecto que utiliza Yarn pero aún se encuentra en una versión anterior a la 2, necesitamos hacer un acondicionamiento previo a hacer la migración. Para asegurarnos de la versión que tenemos actualmente basta con ubicarnos en línea de comando en la raíz del proyecto y utilizar la siguiente instrucción:

yarn --version

Veremos algo parecido a esto:

Acto seguido usamos la siguiente instrucción dependiendo de la versión que tengamos actualmente instalada:

# Versiones anteriores a 1.22
yarn policies set-version berry

# Versiones posteriores a 1.22
yarn set version berry

Finalmente utilizamos el siguiente comando para completar la migración hacia la versión 2 de Yarn en nuestro proyecto. Este proceso se debe realizar de forma individual en cada proyecto que deseemos migrar hacia esta versión.

yarn set version from sources

El proceso demorará un par de minutos, por lo que no hay razón de alarmarse si el comando pareciera no estar haciendo nada. Incluso con un procesador Intel Core i7 de octava generación y 32GB de memoria RAM el proceso demoró casi 3 minutos.

Instalar Yarn 2 en un proyecto nuevo

Puesto que Yarn 2 no se instala globalmente, la documentación oficial recomienda instalar de forma global aún la versión 1.x y luego partir de allí para migrar hacia la versión 2 de forma individual en cada proyecto:

# Ubicarse en el folder raíz del proyecto
cd ~/ubicacion/de/mi/proyecto

# Versiones anteriores a 1.22
yarn policies set-version berry

# Versiones iguales o posteriores a 1.22
yarn set version berry

# Instalar desde las fuentes mas recientes
yarn set version from source

Finalmente, la documentación oficial recomienda incluir los archivos .yarn y .yarn.yml en nuestro control de versiones.