Learn

pnpm en la práctica

El gestor que ahorra gigabytes con un store global y hardlinks.

pnpm (Performant npm) es un reemplazo directo de npm con dos ideas clave: un store global en disco que solo guarda una copia de cada paquete, y una resolución estricta que evita las dependencias fantasma.

Por qué pnpm ahorra tanto espacio

Cuando haces npm install react, npm copia los archivos en tu-proyecto/node_modules/react/. Si tienes diez proyectos que usan React, tienes diez copias idénticas en el disco.

pnpm funciona de otra manera:

  1. Descarga React una sola vez en un store global (~/.local/share/pnpm/store en Linux/macOS, %LOCALAPPDATA%\pnpm\store en Windows).
  2. En cada proyecto, node_modules/react/ es un hardlink que apunta a los archivos del store. Un solo archivo físico, diez proyectos que acceden a él.

En concreto: en una máquina con diez proyectos React, npm ocupa ~400 MB por proyecto. pnpm ocupa ~40 MB (el store compartido) sin importar cuántos proyectos haya.

Instalar pnpm

Via npm (una sola vez):

shell
npm install -g pnpm

Via corepack (incluido en Node desde v16):

shell
corepack enable
shell
corepack prepare pnpm@latest --activate

Verifica:

shell
pnpm --version

Comandos habituales

Instalar todas las dependencias de un proyecto existente:

shell
pnpm install

Añadir un paquete:

shell
pnpm add react

Añadir una devDependency:

shell
pnpm add -D typescript

Lanzar un script definido en package.json:

shell
pnpm run dev

Atajo (sin run) para scripts habituales:

shell
pnpm dev
shell
pnpm build
shell
pnpm test

Ejecutar un comando puntual sin instalar globalmente:

shell
pnpm dlx create-next-app my-app

Actualizar todas las dependencias:

shell
pnpm update

Eliminar un paquete:

shell
pnpm remove lodash

Resolución estricta: adiós a las dependencias fantasma

pnpm crea una estructura node_modules/ no aplanada. Cada paquete solo puede ver sus propias dependencias declaradas. Tu código no puede acceder a lodash si no has añadido lodash explícitamente a tu package.json.

Puede parecer restrictivo, pero es una garantía: tu build es reproducible y no depende de las dependencias transitivas de tus dependencias.

pnpm y los monorepos

pnpm tiene el mejor soporte de monorepos entre los tres gestores. Un archivo pnpm-workspace.yaml en la raíz es suficiente para declarar varios paquetes:

yaml
packages:
  - "packages/*"
  - "apps/*"

Los paquetes del workspace pueden referenciarse entre sí con workspace:* como versión:

json
{
  "dependencies": {
    "@mi-proyecto/shared": "workspace:*"
  }
}
Documentación oficial de pnpm pnpm Workspaces

Marca los pasos para desbloquear lo siguiente

Volver al curso