npm vs yarn vs pnpm: Quale Package Manager Usare?
npm vs yarn vs pnpm: confronto package manager 2025. Performance, lockfile, workspace e monorepo. Quale scegliere per i tuoi progetti JavaScript e Node.js.
Introduzione ai Package Manager
npm, Yarn e pnpm sono i tre principali package manager per l'ecosistema JavaScript e Node.js. Gestiscono le dipendenze dei progetti, eseguono script e pubblicano pacchetti. Ognuno ha filosofie e caratteristiche diverse che lo rendono ideale per specifici casi d'uso. Questa guida confronta i tre strumenti per aiutarti a scegliere quello giusto per il tuo progetto.
npm (Node Package Manager)
Caratteristiche
- Default: Incluso con Node.js, nessuna installazione aggiuntiva
- Registry: npmjs.com, il più grande repository di pacchetti
- Maturità: Il più vecchio e stabile
- Workspaces: Supporto nativo per monorepo
Comandi Principali
# Installazione dipendenze
npm install # Installa da package.json
npm install lodash # Aggiungi pacchetto
npm install -D jest # Aggiungi come devDependency
npm install -g typescript # Installa globalmente
# Esecuzione script
npm run build
npm test # Shortcut per npm run test
npm start # Shortcut per npm run start
# Gestione pacchetti
npm update # Aggiorna tutti
npm update lodash # Aggiorna specifico
npm uninstall lodash # Rimuovi
npm outdated # Mostra versioni obsolete
# Informazioni
npm list # Lista dipendenze
npm list --depth=0 # Solo primo livello
npm info lodash # Info su pacchetto
package-lock.json
# Lock file per versioni esatte
# SEMPRE committare nel repository
# Contiene:
# - Versioni esatte di tutte le dipendenze
# - URL di download
# - Hash di integrità
# Reinstalla esattamente le stesse versioni
npm ci # Clean install, più veloce e riproducibile
Yarn (Classic e Berry)
Caratteristiche
- Performance: Installazione parallela, più veloce di npm classico
- Plug'n'Play: Zero-installs con Yarn Berry (v2+)
- Workspaces: Supporto maturo per monorepo
- Offline mode: Cache locale efficiente
Installazione
# Yarn Classic (v1)
npm install -g yarn
# Yarn Berry (v2+) - consigliato per nuovi progetti
corepack enable
yarn set version stable
# Verifica versione
yarn --version
Comandi Principali
# Equivalenti npm → yarn
npm install → yarn install
npm install lodash → yarn add lodash
npm install -D jest → yarn add -D jest
npm install -g pkg → yarn global add pkg
npm uninstall lodash → yarn remove lodash
npm run build → yarn build
npm test → yarn test
# Comandi specifici yarn
yarn why lodash # Perché è installato?
yarn upgrade-interactive # Aggiorna interattivamente
yarn dlx create-react-app my-app # Esegui senza installare
Yarn Berry (v2+)
# Plug'n'Play - no node_modules!
# Dipendenze in .yarn/cache come zip
# .yarnrc.yml
nodeLinker: pnp
# Zero-installs: committa la cache
# Nessun npm install necessario dopo git clone
# Vantaggi:
# - Installazione istantanea
# - Meno spazio disco
# - Riproducibilità perfetta
# Svantaggi:
# - Alcuni pacchetti non compatibili
# - Curva di apprendimento
pnpm (Performant npm)
Caratteristiche
- Efficienza disco: Un singolo store, hardlink ai progetti
- Velocità: Il più veloce dei tre
- Strictness: node_modules più sicuro e corretto
- Monorepo: Eccellente supporto workspaces
Installazione
# Via npm
npm install -g pnpm
# Via corepack (Node.js 16.13+)
corepack enable
corepack prepare pnpm@latest --activate
# Standalone (Windows)
iwr https://get.pnpm.io/install.ps1 -useb | iex
# Standalone (Unix)
curl -fsSL https://get.pnpm.io/install.sh | sh -
Comandi Principali
# Equivalenti
npm install → pnpm install
npm install lodash → pnpm add lodash
npm install -D jest → pnpm add -D jest
npm install -g pkg → pnpm add -g pkg
npm run build → pnpm build
npm test → pnpm test
# Comandi specifici
pnpm store path # Percorso store globale
pnpm store prune # Pulisci pacchetti non usati
pnpm why lodash # Perché installato
pnpm outdated # Versioni obsolete
Content-Addressable Store
# Come funziona pnpm
# 1. Scarica pacchetti in ~/.pnpm-store
# 2. Crea hardlink in node_modules
# 3. Stesso pacchetto usato da N progetti = 1 copia
# Esempio risparmio
# 10 progetti con React = 10 copie con npm
# 10 progetti con React = 1 copia con pnpm
# node_modules layout
node_modules/
├── .pnpm/ # Flat store delle dipendenze
│ ├── lodash@4.17.21/
│ └── express@4.18.2/
├── lodash -> .pnpm/lodash@4.17.21/node_modules/lodash
└── express -> .pnpm/express@4.18.2/node_modules/express
# Vantaggi:
# - Phantom dependencies impossibili
# - Disk usage ridotto 50-70%
Confronto Performance
Benchmark Tipico
# Installazione pulita (no cache, no lock)
npm: 45s
yarn: 35s
pnpm: 25s
# Installazione con cache (no node_modules)
npm: 20s
yarn: 10s
pnpm: 5s
# Reinstallazione (tutto cached)
npm: 12s
yarn: 3s
pnpm: 2s
# Spazio disco (10 progetti simili)
npm: 2.5 GB
yarn: 2.5 GB
pnpm: 500 MB
Tabella Confronto
| Feature | npm | Yarn | pnpm |
|---|---|---|---|
| Velocità | ★★☆ | ★★★ | ★★★ |
| Disk usage | ★★☆ | ★★☆ | ★★★ |
| Monorepo | ★★☆ | ★★★ | ★★★ |
| Compatibilità | ★★★ | ★★☆ | ★★★ |
| Sicurezza | ★★☆ | ★★★ | ★★★ |
| Curva apprendimento | ★★★ | ★★☆ | ★★★ |
Workspaces (Monorepo)
npm Workspaces
// package.json root
{
"name": "my-monorepo",
"workspaces": [
"packages/*"
]
}
// Comandi
npm install # Installa tutto
npm run build -w pkg-a # Build solo pkg-a
npm run test --workspaces # Test tutti
Yarn Workspaces
// package.json root
{
"name": "my-monorepo",
"private": true,
"workspaces": [
"packages/*",
"apps/*"
]
}
// Comandi
yarn install
yarn workspace pkg-a build
yarn workspaces foreach run build
pnpm Workspaces
# pnpm-workspace.yaml
packages:
- 'packages/*'
- 'apps/*'
# Comandi
pnpm install
pnpm --filter pkg-a build
pnpm -r run build # Tutti ricorsivamente
pnpm --filter "./apps/*" build
Quando Usare Cosa
Scegli npm quando:
- Progetti semplici senza requisiti particolari
- Team che preferisce lo standard
- Nessuna necessità di ottimizzazione
- Compatibilità massima con documentazione
Scegli Yarn quando:
- Progetti enterprise con esigenze specifiche
- Vuoi Plug'n'Play per zero-installs
- Monorepo con tooling avanzato
- Già familiari con Yarn
Scegli pnpm quando:
- Spazio disco è un problema (molti progetti)
- CI/CD dove velocità è critica
- Monorepo grandi
- Vuoi strictness sulle dipendenze
Migrazione
# Da npm a pnpm
rm -rf node_modules package-lock.json
pnpm import # Importa da package-lock.json
pnpm install
# Da npm a yarn
rm -rf node_modules package-lock.json
yarn install
# Da yarn a pnpm
rm -rf node_modules yarn.lock
pnpm import # Importa da yarn.lock
pnpm install
Strumenti Correlati
Per gestire progetti JavaScript:
- JSON Formatter - Formatta package.json
- Diff Checker - Confronta lock file
- Regex Tester - Pattern per scripts
Conclusione
La scelta del package manager dipende dalle tue priorità:
- npm: Standard, compatibilità, semplicità
- Yarn: Features avanzate, PnP, enterprise
- pnpm: Performance, disk efficiency, strictness
Per nuovi progetti nel 2025, pnpm è spesso la scelta migliore per performance e efficienza. Yarn Berry è ideale se vuoi zero-installs. npm rimane solido per chi preferisce lo standard.
Per altri strumenti utili, esplora i nostri tool online gratuiti. Per documentazione ufficiale: npm docs, Yarn, pnpm.