yarn — un gestor de paquetes alternativo para Node.js, creado por Facebook junto con Exponent, Google y Tilde en 2016. yarn resolvió los problemas de velocidad y seguridad de npm 2-4: instalación paralela, archivo lock estricto y caché offline. Hoy yarn sigue siendo popular en React Native, Expo y monorepos. Más información en yarn Documentation.
Puntos clave
yarn (Yet Another Resource Negotiator) fue lanzado en octubre de 2016 como la respuesta de Facebook a los problemas de npm 2-4: instalación lenta, falta de un archivo lock y paquetes inseguros. yarn introdujo descargas paralelas de paquetes, yarn.lock determinista y verificación de integridad mediante sumas de comprobación. En 2020 yarn hizo la transición a la versión 2 (Berry) con Plug'n'Play y un enfoque TypeScript-first.
La arquitectura de yarn difiere de npm: yarn descarga paquetes en paralelo (npm antes de la versión 5 — secuencialmente), almacena en caché cada paquete en ~/.cache/yarn sin duplicación entre proyectos y verifica la integridad mediante sumas de comprobación. yarn siempre genera yarn.lock con cada instalación, mientras que package-lock.json en npm solo apareció en la versión 5.
A partir de yarn 2 (Berry, 2020), yarn fue reescrito completamente en TypeScript y soporta Plug'n'Play, workspaces, constraints para monorepos y protocolos de instalación desde diferentes fuentes (npm, git, tarball). yarn 3+ (2022) añadió Zero-Installs — almacenar la caché en el repositorio para una instalación instantánea sin conexión de red.
yarn install — el comando principal que lee package.json y yarn.lock e instala las dependencias. yarn descarga paquetes en paralelo, lo que acelera la instalación 2-3 veces en comparación con npm 4 y versiones anteriores. yarn utiliza una caché offline: si un paquete ya se ha descargado en otro proyecto, se copia desde la caché en lugar de descargarse de nuevo.
# Comandos básicos de yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Actualización interactiva
$ yarn upgrade-interactive
# Eliminar paquetes duplicados
$ yarn dedupe
yarn add — el comando para instalar un nuevo paquete. yarn add <package> añade a dependencies, yarn add --dev — a devDependencies. yarn actualiza automáticamente yarn.lock. yarn upgrade actualiza los paquetes a las últimas versiones dentro del rango semántico. yarn upgrade-interactive — un modo interactivo para seleccionar paquetes específicos para actualizar.
yarn cache — una caché global en ~/.cache/yarn/v6. Cada paquete se almacena una vez en un archivo ZIP con una suma de comprobación. La caché de yarn se limpia automáticamente, pero se puede ejecutar yarn cache clean manualmente. yarn cache dir muestra la ruta de la caché. yarn cache list — lista los paquetes en caché.
yarn.lock — un archivo de bloqueo que registra las versiones exactas de todas las dependencias y sus paquetes transitivos. A diferencia de package-lock.json (JSON), yarn.lock utiliza un formato YAML con una estructura plana. yarn.lock se genera siempre automáticamente durante yarn install o yarn add — esto garantiza que todos los desarrolladores y servidores CI obtengan un conjunto idéntico de paquetes.
# Estructura de ejemplo de yarn.lock
react@^18.3.0:
version: "18.3.1"
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "^1.1.0"
checksum: "abc123def456..."
react-native@^0.76.0:
version: "0.76.3"
resolution: "react-native@npm:0.76.3"
dependencies:
react: "18.3.1"
checksum: "def789ghi012..."
Campos de yarn.lock: version — versión exacta del paquete, resolution — fuente y versión, dependencies — sus dependencias, checksum — suma de comprobación para verificación. yarn.lock se confirma en el repositorio y es la única fuente de verdad para las dependencias. Si yarn.lock y package.json divergen, yarn emite una advertencia.
Yarn constraints — un sistema de reglas para monorepos que verifica y aplica versiones de dependencias en yarn.lock. Las restricciones se describen en el archivo yarn.constraints.js usando el Lenguaje de Restricciones de Yarn. Las constraints permiten garantizar que todos los paquetes en un monorepo usen la misma versión de React o TypeScript.
React Native ha estado tradicionalmente estrechamente vinculado a yarn. Expo CLI, React Native CLI y Create React Native App usaban yarn inicialmente. En proyectos React Native, yarn.lock fija las versiones de los módulos nativos, lo que es críticamente importante para la compilación estable a través de CocoaPods (iOS) y Gradle (Android). yarn workspaces son populares en monorepos React Native con código compartido.
yarn workspaces en monorepos React Native: el package.json raíz contiene "workspaces": ["packages/*", "mobile"]. yarn install crea una sola carpeta node_modules en el nivel raíz. Los paquetes se referencian entre sí mediante symlinks. npx pod-install se ejecuta después de cambiar las dependencias nativas para actualizar CocoaPods.
{
"private": true,
"workspaces": [
"packages/*",
"apps/mobile",
"apps/web"
],
"scripts": {
"mobile:start": "yarn workspace mobile start",
"mobile:ios": "yarn workspace mobile ios",
"lint": "yarn workspaces run lint"
}
}
Expo SDK 50+ recomienda oficialmente yarn para nuevos proyectos creados mediante npx create-expo-app. yarn garantiza la compatibilidad con módulos Expo y genera automáticamente el yarn.lock correcto. Zero-Installs en yarn 3+ permite confirmar la caché en el repositorio — los desarrolladores obtienen un entorno listo para usar sin instalar dependencias después de git clone.
npm y yarn resuelven el mismo problema — gestionar paquetes de Node.js. Con el lanzamiento de npm 5-7, la brecha funcional prácticamente ha desaparecido. npm 7+ incluye workspaces, npm ci (equivalente a yarn install --frozen-lockfile) e instalación paralela. Sin embargo, yarn conserva ventajas en escenarios específicos: Plug'n'Play, Zero-Installs y un sistema maduro de constraints.
| Característica | npm | yarn |
|---|---|---|
| Año de creación | 2010 | 2016 |
| Archivo lock | package-lock.json (JSON) | yarn.lock (YAML) |
| Instalación | Secuencial (npm 5+) | Paralela |
| Plug'n'Play | No | Sí (yarn 2+) |
| Workspaces | Sí (npm 7+) | Sí |
| Zero-Installs | No | Sí (yarn 3+) |
| Caché | node_modules con flattening | Global ~/.cache/yarn |
| Lenguaje de implementación | JavaScript | TypeScript (yarn 2+) |
Cuándo elegir yarn: proyectos en Expo SDK 50+, monorepos grandes (100+ paquetes), equipos que valoran Zero-Installs para una configuración rápida del entorno y proyectos heredados que ya usan yarn. Cuándo elegir npm: proyectos estándar de create-react-app, Next.js, Vite, equipos sin requisitos específicos de gestor de paquetes.
yarn 4 (2024) introdujo un rendimiento mejorado, soporte nativo de ESM y optimización para grandes monorepos. npm 10+ continúa evolucionando con un enfoque en seguridad y compatibilidad. La elección entre npm y yarn hoy es una cuestión de preferencias del equipo y requisitos específicos del proyecto, no de superioridad técnica de una herramienta sobre otra.
Preguntas frecuentes
yarn inicialmente superó a npm en velocidad gracias a la instalación paralela de paquetes y al almacenamiento agresivo en caché. yarn.lock se genera automáticamente con cada instalación, mientras que package-lock.json apareció en npm 5. yarn ofrece Plug'n'Play — una alternativa a node_modules con tiempo de instalación cero. Con npm 7+, la diferencia en velocidad y funcionalidad para escenarios básicos es mínima.
yarn workspaces — un mecanismo para gestionar múltiples paquetes en un solo repositorio. El package.json raíz contiene el campo "workspaces": ["packages/*"]. yarn install instala las dependencias compartidas en el nivel superior en un solo node_modules, crea symlinks entre paquetes locales y evita la duplicación. Los comandos se ejecutan para todos los workspaces mediante yarn workspaces run <script>.
Plug'n'Play (PnP) — una alternativa a la carpeta node_modules tradicional, introducida en yarn 2. En lugar de copiar archivos, yarn crea un mapa de dependencias en .pnp.cjs y almacena paquetes en archivos ZIP en una caché global. Ventajas de PnP: instalación en segundos, tiempo de inicio de Node.js reducido en un 30-50%, sin node_modules ni problemas de rutas asociados.
Instale yarn globalmente: npm install -g yarn. En la raíz del proyecto, ejecute yarn import — yarn lee package-lock.json y crea un yarn.lock equivalente. Elimine node_modules y package-lock.json, ejecute yarn install para verificar. Actualice la configuración de CI/CD reemplazando npm por yarn. yarn es totalmente compatible con package.json.
El error "Integrity check failed" ocurre cuando yarn.lock y node_modules no están sincronizados. Solución: elimine node_modules, yarn.lock y limpie la caché (yarn cache clean), luego ejecute yarn install de nuevo. Para conflictos de versiones, use yarn upgrade-interactive para seleccionar actualizaciones específicas. yarn dedupe eliminará paquetes duplicados.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también