pnpm vs npm: storage, lockfile, workspace, mappa dei comandi | We.Inc
Come pnpm e npm salvano i pacchetti, bloccano le versioni e gestiscono i monorepo, un traduttore consultabile di comandi da npm a pnpm e i passaggi esatti per migrare un progetto in sicurezza.
npm copia ogni pacchetto nella node_modules di ciascun progetto e li porta tutti allo stesso livello (hoisting). pnpm mantiene un unico store content-addressable su disco, crea hard link ai file da lì e mette solo le tue dipendenze dirette al primo livello di node_modules. Così risparmia spazio su disco e impedisce al codice di importare pacchetti che non ha mai dichiarato. La maggior parte dei comandi ha un equivalente diretto.
Le differenze principali
Argomento
Dove si trovano i file dei pacchetti
Una copia dentro ogni progetto
Un unico store condiviso, collegato ai progetti con hard link
Struttura di node_modules
Piatta, tutto portato al primo livello
Solo le dipendenze dirette, il resto sotto node_modules/.pnpm
Lockfile
Workspace dichiarati in
Installazione rigorosa in CI
npm ci
pnpm install (in CI il frozen lockfile è il default)
Eseguire un pacchetto senza installarlo
pnpm dlx (anche pnx, pnpx)
Entrambi gli strumenti leggono lo stesso package.json e installano dallo stesso registry, quindi la scelta riguarda la struttura, la velocità delle installazioni ripetute, gli strumenti per i monorepo e il rigore. Qui sotto trovi come ciascuno salva i pacchetti, un traduttore per i comandi che conosci già e i passaggi per spostare un progetto esistente da npm a pnpm.
Scrivi un comando npm nel traduttore, o clicca uno degli esempi, per vedere l'equivalente pnpm.
Leggi la sezione sullo storage per capire perché le installazioni pnpm occupano meno disco e intercettano gli import non dichiarati.
Segui i passaggi di migrazione se decidi di cambiare, e fai commit del nuovo lockfile.
Scegli un solo package manager per repository ed elimina l'altro lockfile, così nessuno installa da uno non aggiornato.
In CI, pnpm install si rifiuta di modificare un lockfile non aggiornato, quindi fai commit di pnpm-lock.yaml ogni volta che cambia package.json.
Se un pacchetto si rompe con pnpm perché importa qualcosa che non ha mai dichiarato, segnalalo ai manutentori; con npm quell'import funzionava solo per caso.
pnpm esegue gli script senza la parola run, quindi pnpm dev funziona, purché il nome dello script non coincida con un comando integrato di pnpm.
Domande frequenti
pnpm è più veloce di npm?
pnpm spesso riusa i file già presenti nel suo store, il che aiuta le installazioni ripetute sulla stessa macchina. La velocità dipende dallo stato della cache, dalla rete e dalla dimensione del progetto, quindi misura entrambi sul tuo progetto invece di affidarti a un benchmark pubblicato.
Posso usare pnpm con un progetto che ha package-lock.json?
Sì. Esegui pnpm import per creare un pnpm-lock.yaml a partire da package-lock.json, npm-shrinkwrap.json o yarn.lock, poi elimina il vecchio lockfile e node_modules ed esegui pnpm install.
Perché la mia app non trova un modulo dopo il passaggio a pnpm?
Il tuo codice, o una dipendenza, importa un pacchetto che non è elencato nel proprio package.json. La struttura piatta di npm nascondeva quell'errore. Aggiungi il pacchetto mancante come dipendenza di ciò che lo importa.
pnpm ha bisogno di Node.js installato?
La documentazione di installazione di pnpm descrive pnpm 12 come un eseguibile nativo che non ha bisogno di Node.js per funzionare. Gli script del tuo progetto, ovviamente, hanno comunque bisogno di Node.js.
Quale dovrebbe usare un principiante?
npm, perché è incluso in Node.js e quasi tutti i tutorial lo usano. Passa a pnpm quando gestisci un monorepo, molti progetti sulla stessa macchina, o vuoi la struttura di node_modules più rigorosa.
Come ogni strumento salva i pacchetti
npm scrive una copia completa di ogni dipendenza nella node_modules del progetto e, dove può, porta le dipendenze annidate al primo livello. Dieci progetti che usano la stessa libreria ne contengono dieci copie.
pnpm scarica ogni file una sola volta in uno store globale content-addressable. I progetti ricevono hard link a quei file, quindi un secondo progetto con le stesse versioni non occupa quasi spazio in più, e una nuova versione aggiunge solo i file cambiati.
Dentro il progetto, pnpm mette in node_modules dei symlink per le tue dipendenze dirette e tiene tutto il resto sotto node_modules/.pnpm. Un pacchetto può raggiungere solo ciò che ha dichiarato.
Workspace e monorepo
I workspace di npm sono elencati nel package.json principale e si eseguono con -w name o --workspaces. pnpm li elenca in pnpm-workspace.yaml e li seleziona con --filter, che capisce anche i grafi delle dipendenze, per esempio un pacchetto più tutto ciò da cui dipende.
Il protocollo workspace: di pnpm lega una dipendenza al pacchetto locale e si rifiuta di ripiegare sul registry. Viene convertito in un normale intervallo di versioni quando pubblichi.
Passare un progetto da npm a pnpm
Passaggi di migrazione
pnpm import legge il lockfile di npm così mantieni le versioni che hai già testato. Esegui i test prima di fare commit.
Ogni cartella che corrisponde qui diventa un pacchetto del workspace. Metti il file nella radice del repository.
Dipendere da un pacchetto locale
workspace:* si risolve sempre nella copia locale di ui invece che in una versione del registry.
Traduttore di comandi da npm a pnpm
Scrivi un comando npm
npm install -D vite
Equivalente pnpm
Nessuna corrispondenza diretta. La maggior parte degli altri comandi npm mantiene lo stesso nome in pnpm.