¿Qué es PNPM? El gestor que revoluciona JavaScript

Mi descubrimiento del año: PNPM
¿Sabes esa sensación cuando tu disco duro se llena de carpetas node_modules que ocupan más espacio que toda tu colección de música? Yo vivía eso todos los días hasta que descubrí PNPM. De una pensé que era solo otro gestor de paquetes más, pero cuando vi los números... quede loco.
Te voy a contar algo que me sorprendio: PNPM puede reducir el espacio que ocupan tus dependencias hasta en un 80%. Sí, asi mismo. Y no solo eso, también es hasta 2 veces más rápido que npm y Yarn. Cuando lo probé por primera vez, literalmente me quedé mirando la terminal pensando que algo había salido mal.
En mi experiencia, una vez que pruebas PNPM, es muy difícil volver atrás. Te cuento todo lo que necesitas saber.
¿Qué rayos es PNPM?
PNPM (Performant NPM) es ese gestor de paquetes que Zoltan Kochan creó en 2016 porque, como muchos de nosotros, estaba harto de los problemas de npm y Yarn. La diferencia principal es que PNPM es más inteligente con el almacenamiento.
Mientras que npm y Yarn duplican los paquetes en cada proyecto (como si fueras a comprar la misma película en DVD para cada habitación de tu casa), PNPM usa un almacén centralizado y enlaces simbólicos. Es como tener una biblioteca central y solo llevar referencias a los libros que necesitas.
Esto significa:
- Ahorrar espacio de disco: Un solo paquete se almacena una vez, independientemente de cuántos proyectos lo utilicen.
- Acelerar las instalaciones: Al aprovechar los paquetes ya descargados.
- Mantener la correcta estructura de dependencias: Evitando el problema de "dependencias fantasma".
Instalando PNPM: más fácil de lo que piensas
La instalación es súper directa. Te doy varias opciones:
Instalación global con NPM
Si ya tienes npm instalado, puedes usar:
npm install -g pnpm
Instalación mediante scripts oficiales
Para Linux y macOS:
curl -fsSL https://get.pnpm.io/install.sh | sh -
Para Windows (PowerShell):
iwr https://get.pnpm.io/install.ps1 -useb | iex
Verificación de la instalación
Una vez instalado, comprueba que todo está correcto:
pnpm --version
Comandos básicos: igual que NPM pero mejor
Una de las cosas que más me gusta de PNPM es que los comandos son prácticamente iguales a npm. La transición es súper suave.
Instalando dependencias
Para instalar todas las dependencias definidas en tu package.json:
pnpm install
Para añadir un nuevo paquete:
pnpm add nombre-del-paquete
Para dependencias de desarrollo:
pnpm add -D nombre-del-paquete
Otras operaciones comunes
Ejecutar scripts:
pnpm run dev
pnpm start
Actualizar paquetes:
pnpm update
Desinstalar paquetes:
pnpm remove nombre-del-paquete
PNPM vs NPM: la diferencia es abismal
Aquí es donde PNPM realmente brilla. La diferencia principal está en cómo manejan las dependencias:
Estructura de node_modules
- NPM: Crea una estructura plana donde todas las dependencias (incluso las transitivas) están en el primer nivel, lo que puede provocar el problema de "dependencias fantasma".
- PNPM: Utiliza una estructura estricta basada en enlaces simbólicos que respeta la jerarquía real de dependencias.
Eficiencia en disco
- NPM: Duplica los paquetes en cada proyecto.
- PNPM: Mantiene un único almacén centralizado y crea enlaces simbólicos, ahorrando hasta un 80% de espacio.
Velocidad de instalación
- NPM: Más lento, especialmente en proyectos grandes.
- PNPM: Significativamente más rápido gracias a su almacén centralizado.
Seguridad
- NPM: Permite que los paquetes accedan a dependencias que no han declarado explícitamente.
- PNPM: Más estricto, solo permite acceder a dependencias declaradas correctamente.
PNPM vs Yarn: el duelo de titanes
Yarn fue la primera alternativa seria a npm, pero PNPM va un paso más allá:
Yarn Classic vs PNPM
- Yarn Classic: Mejora la velocidad respecto a npm y ofrece bloqueo de versiones, pero sigue duplicando paquetes.
- PNPM: Más rápido que Yarn Classic y con un uso de disco mucho más eficiente.
Yarn Berry (Yarn 2+) vs PNPM
- Yarn Berry: Implementa Plug'n'Play (PnP) para mejorar rendimiento, pero cambia radicalmente el comportamiento estándar de Node.js.
- PNPM: Mantiene la compatibilidad tradicional con Node.js mientras ofrece mejoras de rendimiento.
Los números no mienten: benchmarks reales
Aquí tienes los datos que me convencieron:
Tiempo de instalación (proyecto con 1000 dependencias)
Gestor | Instalación inicial | Instalación con caché |
---|---|---|
npm | 164s | 151s |
Yarn | 126s | 112s |
pnpm | 59s | 29s |
Uso de disco (múltiples proyectos con dependencias comunes)
Gestor | 1 proyecto | 5 proyectos | 10 proyectos |
---|---|---|---|
npm | 1GB | 5GB | 10GB |
Yarn | 1GB | 5GB | 10GB |
pnpm | 1GB | ~1.2GB | ~1.5GB |
¿Ves la diferencia? Con 10 proyectos, npm y Yarn ocupan 10GB mientras que PNPM solo 1.5GB. Esto cambió mi vida.
PNPM Workspace: para monorepos que funcionan
Una de las características que más me gusta de PNPM es lo fácil que es configurar monorepos:
¿Qué es un monorepo?
Un monorepo es básicamente tener varios proyectos relacionados en un solo repositorio. Imagina que tienes una app de Next.js y una API de Node.js - con PNPM workspace puedes tener todo en un solo lugar y hacer un solo pnpm install para todo.
Configuración básica
Para configurar un workspace, crea un archivo pnpm-workspace.yaml en la raíz:
packages:
- 'packages/*'
- 'apps/*'
- 'libs/*'
Comandos útiles para workspaces
Instalar dependencias en todos los paquetes:
pnpm install
Ejecutar un script en todos los paquetes:
pnpm -r run build
Añadir una dependencia a un paquete específico:
pnpm --filter package-name add dependency-name
Crear referencias locales entre paquetes:
pnpm --filter package-a add package-b
Por qué PNPM me conquistó
Las ventajas son obvias una vez que lo pruebas:
Eficiencia
- Instalaciones más rápidas
- Menor uso de disco
- Mejor rendimiento en CI/CD
Seguridad
- Estructura de node_modules más estricta
- Prevención de acceso a dependencias no declaradas
- Menor riesgo de vulnerabilidades por "dependencias fantasma"
Simplicidad
- API compatible con npm
- Fácil migración desde npm o Yarn
- Excelente documentación
Los pocos inconvenientes (y cómo los resolví)
No todo es perfecto, pero los problemas son menores:
Compatibilidad con algunas herramientas
Algunos paquetes asumen una estructura plana de node_modules y pueden fallar. La solución es usar el modo node-linker: hoisted en .npmrc para casos problemáticos.
Curva de aprendizaje
Honestamente, es mínima. La mayoría de comandos son idénticos a npm, así que la transición es suave.
Adopción en proyectos grandes
Migrar proyectos grandes requiere planificación, pero comienza con proyectos pequeños y expande gradualmente.
Cómo hacer la migración (es más fácil de lo que piensas)
Migrar a PNPM es generalmente sencillo:
- Instala PNPM globalmente
- Elimina la carpeta node_modules y los archivos de bloqueo (package-lock.json o yarn.lock)
- Ejecuta pnpm install
Para proyectos más complejos, considera:
- Verificar la compatibilidad de tus paquetes
- Revisar scripts personalizados que puedan asumir npm o Yarn
- Ajustar configuraciones CI/CD
Mi reflexión final
PNPM cambió mi forma de trabajar con dependencias. Ver cómo mi disco duro pasó de estar siempre lleno a tener espacio libre solo por cambiar de gestor de paquetes fue revelador. Además, esperar menos tiempo en las instalaciones significa más tiempo para programar.
Actualmente pienso que es la mejor opción para manejar dependencias, aunque siempre van surgiendo cosas nuevas. Lo que sí sé es que empresas como Microsoft y Vercel ya lo adoptaron, lo que dice mucho sobre su futuro.
Si buscas:
- Ahorrar espacio en disco
- Acelerar tus procesos de desarrollo
- Mejorar la seguridad de tus dependencias
- Gestionar eficientemente proyectos monorepo
PNPM merece definitivamente una oportunidad en tu próximo proyecto. ¿Qué esperas para probarlo?
Recursos adicionales
Comentarios
Posts relacionados

NPM: Guía Completa para Desarrolladores JavaScript
Aprende qué es npm, cómo instalarlo y los comandos más importantes como npm install, npm run dev, npm ci y más para optimizar tu flujo de trabajo.

Instalar Google Analytics con NextJS
Guía paso a paso para instalar Google Analytics en tu proyecto NextJS.