PNPM (Performant NPM) es un gestor de paquetes alternativo a NPM que destaca por su velocidad y eficiencia en el uso de espacio en disco.
| Característica | Descripción |
|---|
| Almacén global | Los paquetes se guardan una sola vez en disco |
| Hard links | Los proyectos enlazan al almacén en vez de copiar |
| Velocidad | Hasta 2x más rápido que NPM |
| Ahorro de espacio | Reduce significativamente el uso de disco |
| Estricto | Previene acceso a dependencias no declaradas |
- Espacio en disco: Si tienes 10 proyectos con React, solo se descarga una vez
- Velocidad: Instalaciones más rápidas gracias al caché eficiente
- Seguridad: Solo puedes importar dependencias declaradas explícitamente
- Monorepos: Soporte nativo para workspaces
# Usando Corepack (Node.js 16.13+)
corepack prepare pnpm@latest --activate
iwr https://get.pnpm.io/install.ps1 -useb | iex
curl -fsSL https://get.pnpm.io/install.sh | sh -
# Actualizar a la última versión
npm install -g pnpm@latest
# Crear package.json interactivo
# Crear con valores por defecto
# Si ya tienes un proyecto con NPM
# Simplemente elimina node_modules y el lock file
# Esto crea pnpm-lock.yaml
| Comando PNPM | Equivalente NPM | Descripción |
|---|
pnpm add paquete | npm install paquete | Dependencia de producción |
pnpm add -D paquete | npm install -D paquete | Dependencia de desarrollo |
pnpm add -g paquete | npm install -g paquete | Instalación global |
pnpm install | npm install | Instalar todas las dependencias |
# Instalar dependencia de producción
# Instalar múltiples paquetes
pnpm add express mongoose dotenv
# Instalar como dependencia de desarrollo
pnpm add -D typescript @types/node jest
# Instalar versión específica
pnpm add github:user/repo
# Instalar todas las dependencias del package.json
# Instalación limpia (como npm ci)
pnpm install --frozen-lockfile
pnpm remove express mongoose
pnpm remove -g typescript
# Ver paquetes desactualizados
# Actualizar todos los paquetes
# Actualizar a última versión (interactivo)
pnpm update --interactive
# Actualizar a latest (puede romper)
# Scripts especiales (sin 'run')
# Ver todos los scripts disponibles
# Ejecutar con argumentos
pnpm run test -- --coverage
Usa pnpm create o pnpm dlx para iniciar proyectos con frameworks populares:
# React (con Vite - recomendado)
pnpm create vite mi-app-react --template react
pnpm create vite mi-app-react-ts --template react-ts
pnpm create vue@latest mi-app-vue
pnpm create next-app mi-app-next
pnpm dlx nuxi init mi-app-nuxt
pnpm create svelte@latest mi-app-svelte
pnpm dlx @angular/cli new mi-app-angular
pnpm dlx express-generator mi-api
# Ejecutar binario instalado localmente
# Atajo con pnpx (similar a npx)
# Ejecutar paquete sin instalar
pnpm dlx create-react-app mi-app
pnpm dlx degit user/repo mi-proyecto
| Comando | Descripción |
|---|
pnpm exec | Ejecuta binario instalado en el proyecto |
pnpm dlx | Descarga y ejecuta paquete temporalmente (como npx) |
pnpx | Alias de pnpm dlx |
PNPM guarda todos los paquetes en un almacén global y crea hard links a los proyectos. Esto significa:
- Un paquete se descarga una sola vez
- Todos los proyectos comparten el mismo archivo
- Ahorro masivo de espacio en disco
# Ver ubicación del store
# ~/.local/share/pnpm/store/v3 (Linux/macOS)
# %LOCALAPPDATA%/pnpm/store/v3 (Windows)
# Limpiar paquetes no usados del store
├── proyecto-1/node_modules/react (5MB)
├── proyecto-2/node_modules/react (5MB)
├── proyecto-3/node_modules/react (5MB)
├── ~/.pnpm-store/react (5MB) ← único archivo real
├── proyecto-1/node_modules/react → link
├── proyecto-2/node_modules/react → link
├── proyecto-3/node_modules/react → link
PNPM usa una estructura no plana que previene el acceso a dependencias no declaradas.
├── .pnpm/ # Paquetes reales (hard links)
├── express -> .pnpm/express@4.18.2/node_modules/express
└── lodash -> .pnpm/lodash@4.17.21/node_modules/lodash
| Beneficio | Descripción |
|---|
| Seguridad | No puedes importar paquetes no declarados |
| Claridad | Sabes exactamente qué dependencias usas |
| Menos bugs | Evita errores por dependencias fantasma |
Permiten gestionar múltiples paquetes en un solo repositorio (monorepo).
# pnpm-workspace.yaml (en la raíz)
# Instalar dependencias en todos los workspaces
# Ejecutar script en todos los workspaces
pnpm --recursive run test
# Ejecutar solo en un workspace específico
pnpm --filter web run dev
pnpm --filter @mi-org/ui run build
# Añadir dependencia a un workspace
pnpm add lodash --filter web
# Añadir dependencia local (otro workspace)
pnpm add @mi-org/utils --filter web --workspace
# Limpiar paquetes no usados del store
du -sh $(pnpm store path)
# Reinstalar todo desde cero
# Instalación estricta (como npm ci)
pnpm install --frozen-lockfile
# Si hay problemas de compatibilidad
pnpm install --shamefully-hoist
# Verificar vulnerabilidades
# Corregir vulnerabilidades
| Escenario | NPM | PNPM |
|---|
| Primera instalación | ~60s | ~45s |
| Con caché | ~30s | ~10s |
| node_modules existe | ~15s | ~5s |
| Escenario | NPM | PNPM |
|---|
| 1 proyecto con React | 200MB | 200MB |
| 10 proyectos con React | 2GB | 200MB |
| 50 proyectos con React | 10GB | 200MB |
| NPM | PNPM |
|---|
npm install | pnpm install |
npm install paquete | pnpm add paquete |
npm install -D paquete | pnpm add -D paquete |
npm uninstall paquete | pnpm remove paquete |
npm run script | pnpm run script |
npm ci | pnpm install --frozen-lockfile |
npx comando | pnpm dlx comando |
npm update | pnpm update |
npm audit | pnpm audit |
| Comando | Descripción |
|---|
pnpm init | Crear proyecto nuevo |
pnpm install | Instalar dependencias |
pnpm add paquete | Añadir paquete |
pnpm add -D paquete | Añadir como dev dependency |
pnpm remove paquete | Eliminar paquete |
pnpm update | Actualizar paquetes |
pnpm update -i | Actualizar interactivamente |
pnpm run script | Ejecutar script |
pnpm dlx comando | Ejecutar sin instalar |
pnpm --filter pkg comando | Ejecutar en workspace |
pnpm store prune | Limpiar store |
pnpm outdated | Ver desactualizados |