npm vs yarn vs pnpm: La Comparación Honesta
Los tres instalan paquetes del registro npm. Los tres usan package.json. Las diferencias están en velocidad, uso de disco y cómo manejan la carpeta node_modules.
Comparación Rápida
| Feature | npm | Yarn (v4) | pnpm |
|---|---|---|---|
| Velocidad (cold install) | Más lento | Rápido | Más rápido |
| Uso de disco | Duplica paquetes | Plug'n'Play (sin node_modules) | Store direccionable por contenido (compartido) |
| Monorepo | Workspaces | Workspaces (mejor) | Workspaces (el mejor) |
| Rigidez | Hoistea todo | Estricto por defecto (PnP) | Estricto (sin phantom deps) |
| Viene con Node.js | Sí | Vía Corepack | Instalación separada |
| Lock file | package-lock.json | yarn.lock | pnpm-lock.yaml |
Comandos de Instalación
# Instalar todas las dependencias
npm install yarn install pnpm install
# Agregar un paquete
npm install express yarn add express pnpm add express
# Agregar dev dependency
npm install -D jest yarn add -D jest pnpm add -D jest
# Eliminar un paquete
npm uninstall lodash yarn remove lodash pnpm remove lodash
# Ejecutar un script
npm run dev yarn dev pnpm dev
# Ejecutar un binario
npx create-next-app yarn dlx create-next-app pnpm dlx create-next-app
# Actualizar paquetes
npm update yarn up pnpm updatePor Qué pnpm Es Rápido
pnpm usa un store direccionable por contenido. Cuando instalas lodash@4.17.21 en el proyecto A, se descarga una vez a un store global. El proyecto B que necesita la misma versión recibe un hard link — sin duplicación:
- Installs más rápidos: Paquetes ya en el store no se descargan de nuevo
- Menos espacio en disco: 100 proyectos usando React no significan 100 copias
- node_modules estricto: Paquetes solo pueden acceder a sus dependencias declaradas
Por Qué Yarn PnP (Plug'n'Play)
Yarn puede eliminar node_modules completamente. En vez, crea un archivo .pnp.cjs que mapea imports a archivos zip en .yarn/cache/:
- Zero installs: Commitea el cache en git, CI no necesita instalar
- Installs instantáneos: Sin operaciones de file system
- Salvedad: Algunas herramientas no soportan PnP y necesitan plugins de compatibilidad
Phantom Dependencies
npm y yarn classic "hoistean" dependencias, permitiendo que tu código importe paquetes que no declaraste en package.json.
// Nunca instalaste 'glob' — es dep de otro paquete
import glob from 'glob'; // Funciona con npm (hoisted)
// Falla con pnpm (modo estricto) — te fuerza a declarar correctamenteCuál Elegir
- npm: Elección por defecto, funciona en todas partes, suficiente para la mayoría
- pnpm: Mejor para monorepos, CI con disco limitado, equipos que quieren deps estrictas
- yarn: Si quieres PnP/zero-installs o tu equipo ya lo usa
¿Honestamente? Elige cualquiera y mantenlo. Las diferencias de velocidad son segundos, no minutos. Consistencia en el equipo importa más que benchmarks.
Gestiona tus paquetes: Formateador JSON — formatea y valida tus archivos package.json.