Skip to content

PNPM - Guía Esencial

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ísticaDescripción
Almacén globalLos paquetes se guardan una sola vez en disco
Hard linksLos proyectos enlazan al almacén en vez de copiar
VelocidadHasta 2x más rápido que NPM
Ahorro de espacioReduce significativamente el uso de disco
EstrictoPreviene 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

Instalar PNPM
# Usando NPM (más común)
npm install -g pnpm
# Usando Corepack (Node.js 16.13+)
corepack enable
corepack prepare pnpm@latest --activate
# Windows (PowerShell)
iwr https://get.pnpm.io/install.ps1 -useb | iex
# macOS/Linux (curl)
curl -fsSL https://get.pnpm.io/install.sh | sh -
Verificar instalación
# Verificar versión
pnpm --version
# 8.15.0
# Ver ayuda
pnpm --help
Actualizar PNPM
# Actualizar a la última versión
pnpm add -g pnpm
# O usando npm
npm install -g pnpm@latest

Inicializar proyecto
# Crear package.json interactivo
pnpm init
# Crear con valores por defecto
pnpm init -y
Migrar desde NPM
# Si ya tienes un proyecto con NPM
# Simplemente elimina node_modules y el lock file
rm -rf node_modules
rm package-lock.json
# Instalar con PNPM
pnpm install
# Esto crea pnpm-lock.yaml

Comando PNPMEquivalente NPMDescripción
pnpm add paquetenpm install paqueteDependencia de producción
pnpm add -D paquetenpm install -D paqueteDependencia de desarrollo
pnpm add -g paquetenpm install -g paqueteInstalación global
pnpm installnpm installInstalar todas las dependencias
Instalar paquetes
# Instalar dependencia de producción
pnpm add express
# Instalar múltiples paquetes
pnpm add express mongoose dotenv
# Instalar como dependencia de desarrollo
pnpm add -D typescript @types/node jest
# Instalar globalmente
pnpm add -g typescript
# Instalar versión específica
pnpm add express@4.18.2
# Instalar desde GitHub
pnpm add github:user/repo
Instalar dependencias
# Instalar todas las dependencias del package.json
pnpm install
# Atajo
pnpm i
# Instalación limpia (como npm ci)
pnpm install --frozen-lockfile
# Solo producción
pnpm install --prod

Desinstalar
# Desinstalar un paquete
pnpm remove express
# Atajo
pnpm rm express
# Desinstalar múltiples
pnpm remove express mongoose
# Desinstalar global
pnpm remove -g typescript
Actualizar
# Ver paquetes desactualizados
pnpm outdated
# Actualizar un paquete
pnpm update express
# Actualizar todos los paquetes
pnpm update
# Actualizar a última versión (interactivo)
pnpm update --interactive
# Actualizar a latest (puede romper)
pnpm update --latest

Ejecutar scripts
# Ejecutar script
pnpm run dev
pnpm run build
pnpm run test
# Scripts especiales (sin 'run')
pnpm start
pnpm test
# Ver todos los scripts disponibles
pnpm run
# Ejecutar con argumentos
pnpm run test -- --coverage

Usa pnpm create o pnpm dlx para iniciar proyectos con frameworks populares:

Crear proyectos
# React (con Vite - recomendado)
pnpm create vite mi-app-react --template react
pnpm create vite mi-app-react-ts --template react-ts
# Vue
pnpm create vue@latest mi-app-vue
# Next.js
pnpm create next-app mi-app-next
# Nuxt
pnpm dlx nuxi init mi-app-nuxt
# Astro
pnpm create astro@latest
# SvelteKit
pnpm create svelte@latest mi-app-svelte
# Angular
pnpm dlx @angular/cli new mi-app-angular
# Express (API básica)
pnpm dlx express-generator mi-api
Ejecutar binarios
# Ejecutar binario instalado localmente
pnpm exec eslint src/
# Atajo con pnpx (similar a npx)
pnpx eslint src/
# Ejecutar paquete sin instalar
pnpm dlx create-react-app mi-app
pnpm dlx degit user/repo mi-proyecto
ComandoDescripción
pnpm execEjecuta binario instalado en el proyecto
pnpm dlxDescarga y ejecuta paquete temporalmente (como npx)
pnpxAlias 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
Almacén global
# Ver ubicación del store
pnpm store path
# ~/.local/share/pnpm/store/v3 (Linux/macOS)
# %LOCALAPPDATA%/pnpm/store/v3 (Windows)
# Ver estado del store
pnpm store status
# Limpiar paquetes no usados del store
pnpm store prune
Sin PNPM (NPM):
├── proyecto-1/node_modules/react (5MB)
├── proyecto-2/node_modules/react (5MB)
├── proyecto-3/node_modules/react (5MB)
Total: 15MB
Con PNPM:
├── ~/.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
Total: 5MB

PNPM usa una estructura no plana que previene el acceso a dependencias no declaradas.

Estructura node_modules
node_modules/
├── .pnpm/ # Paquetes reales (hard links)
│ ├── express@4.18.2/
│ │ └── node_modules/
│ │ └── express/
│ └── lodash@4.17.21/
│ └── node_modules/
│ └── lodash/
├── express -> .pnpm/express@4.18.2/node_modules/express
└── lodash -> .pnpm/lodash@4.17.21/node_modules/lodash
BeneficioDescripción
SeguridadNo puedes importar paquetes no declarados
ClaridadSabes exactamente qué dependencias usas
Menos bugsEvita errores por dependencias fantasma

Permiten gestionar múltiples paquetes en un solo repositorio (monorepo).

pnpm-workspace.yaml
# pnpm-workspace.yaml (en la raíz)
packages:
- 'packages/*'
- 'apps/*'
- '!**/test/**'
mi-monorepo/
├── package.json
├── pnpm-workspace.yaml
├── pnpm-lock.yaml
├── packages/
│ ├── ui/
│ │ └── package.json
│ └── utils/
│ └── package.json
└── apps/
├── web/
│ └── package.json
└── api/
└── package.json
Comandos workspaces
# Instalar dependencias en todos los workspaces
pnpm install
# Ejecutar script en todos los workspaces
pnpm -r run build
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 store
# Limpiar paquetes no usados del store
pnpm store prune
# Ver tamaño del store
pnpm store path
du -sh $(pnpm store path)
# Verificar integridad
pnpm store status
Solucionar problemas
# Reinstalar todo desde cero
rm -rf node_modules
pnpm install
# Instalación estricta (como npm ci)
pnpm install --frozen-lockfile
# Si hay problemas de compatibilidad
pnpm install --shamefully-hoist
# Verificar vulnerabilidades
pnpm audit
# Corregir vulnerabilidades
pnpm audit --fix

EscenarioNPMPNPM
Primera instalación~60s~45s
Con caché~30s~10s
node_modules existe~15s~5s
EscenarioNPMPNPM
1 proyecto con React200MB200MB
10 proyectos con React2GB200MB
50 proyectos con React10GB200MB
NPMPNPM
npm installpnpm install
npm install paquetepnpm add paquete
npm install -D paquetepnpm add -D paquete
npm uninstall paquetepnpm remove paquete
npm run scriptpnpm run script
npm cipnpm install --frozen-lockfile
npx comandopnpm dlx comando
npm updatepnpm update
npm auditpnpm audit

ComandoDescripción
pnpm initCrear proyecto nuevo
pnpm installInstalar dependencias
pnpm add paqueteAñadir paquete
pnpm add -D paqueteAñadir como dev dependency
pnpm remove paqueteEliminar paquete
pnpm updateActualizar paquetes
pnpm update -iActualizar interactivamente
pnpm run scriptEjecutar script
pnpm dlx comandoEjecutar sin instalar
pnpm --filter pkg comandoEjecutar en workspace
pnpm store pruneLimpiar store
pnpm outdatedVer desactualizados
🐝