pnpm vs npm: opslag, lockfiles, workspaces, commando's | We.Inc
Hoe pnpm en npm packages opslaan, versies vastleggen en monorepo's draaien, een doorzoekbare vertaler van npm- naar pnpm-commando's, en de exacte stappen om een project veilig over te zetten.
npm kopieert elk package naar de node_modules van elk project en hoist ze plat. pnpm houdt één content-addressable store op schijf bij, maakt hard links naar bestanden daaruit, en zet alleen uw directe dependencies bovenaan in node_modules. Dat bespaart schijfruimte en voorkomt dat code packages importeert die ze nooit heeft gedeclareerd. De meeste commando's komen één op één overeen.
Belangrijkste verschillen
Onderwerp
Waar packagebestanden staan
Een kopie in elk project
Eén gedeelde store, met hard links in projecten
Indeling van node_modules
Plat, alles gehoist
Alleen directe dependencies, de rest onder node_modules/.pnpm
Lockfile
Workspaces gedeclareerd in
Strikte installatie in CI
npm ci
pnpm install (frozen lockfile is de standaard in CI)
Een package draaien zonder te installeren
pnpm dlx (ook pnx, pnpx)
Beide tools lezen hetzelfde package.json en installeren uit dezelfde registry, dus de keuze gaat over indeling, snelheid van herhaalde installaties, tooling voor monorepo's en strengheid. Hieronder ziet u hoe elk packages opslaat, een vertaler voor de commando's die u al kent, en de stappen om een bestaand project van npm naar pnpm te verhuizen.
Typ een npm-commando in de vertaler, of klik op een van de voorbeelden, om het pnpm-equivalent te zien.
Lees de sectie over opslag om te begrijpen waarom pnpm-installaties minder schijfruimte gebruiken en niet-gedeclareerde imports opvangen.
Volg de migratiestappen als u besluit over te stappen, en commit de nieuwe lockfile.
Kies één package manager per repository en verwijder de andere lockfile, zodat niemand uit een verouderde installeert.
In CI weigert pnpm install een verouderde lockfile aan te passen, dus commit pnpm-lock.yaml telkens als package.json verandert.
Breekt een package onder pnpm omdat het iets importeert dat het nooit heeft gedeclareerd, meld het dan upstream; die import werkte onder npm alleen bij toeval.
pnpm draait scripts zonder het woord run, dus pnpm dev werkt, zolang de scriptnaam niet botst met een ingebouwd pnpm-commando.
Veelgestelde vragen
Is pnpm sneller dan npm?
pnpm hergebruikt vaak bestanden die al in de store staan, wat helpt bij herhaalde installaties op dezelfde machine. De snelheid hangt af van de staat van de cache, het netwerk en de grootte van het project, dus meet beide op uw eigen project in plaats van te vertrouwen op een gepubliceerde benchmark.
Kan ik pnpm gebruiken met een project dat package-lock.json heeft?
Ja. Voer pnpm import uit om een pnpm-lock.yaml te bouwen uit package-lock.json, npm-shrinkwrap.json of yarn.lock, verwijder daarna de oude lockfile en node_modules en voer pnpm install uit.
Waarom vindt mijn app een module niet meer na de overstap naar pnpm?
Uw code, of een dependency, importeert een package dat niet in het eigen package.json staat. De platte indeling van npm verborg die fout. Voeg het ontbrekende package toe als dependency van wat het importeert.
Heeft pnpm Node.js nodig?
De installatiedocumentatie van pnpm beschrijft pnpm 12 als native executable die zelf geen Node.js nodig heeft om te draaien. Uw projectscripts hebben natuurlijk nog wel Node.js nodig.
Welke moet een beginner gebruiken?
npm, omdat het met Node.js wordt meegeleverd en bijna elke tutorial het gebruikt. Stap over op pnpm als u een monorepo draait, veel projecten op één machine hebt, of de strengere indeling van node_modules wilt.
Hoe elke tool packages opslaat
npm schrijft een volledige kopie van elke dependency naar de node_modules van het project en tilt geneste dependencies waar mogelijk naar het hoogste niveau. Tien projecten die dezelfde library gebruiken, bevatten tien kopieën.
pnpm downloadt elk bestand één keer naar een globale content-addressable store. Projecten krijgen hard links naar die bestanden, dus een tweede project met dezelfde versies neemt bijna geen extra ruimte in, en een nieuwe versie voegt alleen de gewijzigde bestanden toe.
Binnen het project zet pnpm symlinks voor uw directe dependencies in node_modules en houdt de rest onder node_modules/.pnpm. Een package kan alleen bij wat het heeft gedeclareerd.
Workspaces en monorepo's
npm-workspaces staan in het package.json in de root en draait u met -w name of --workspaces. pnpm zet ze in pnpm-workspace.yaml en selecteert ze met --filter, dat ook dependencygrafen begrijpt, bijvoorbeeld een package plus alles waarvan het afhankelijk is.
Het workspace:-protocol van pnpm pint een dependency vast op het lokale package en weigert terug te vallen op de registry. Bij het publiceren wordt het omgezet naar een normaal versiebereik.
Een project overzetten van npm naar pnpm
Migratiestappen
pnpm import leest de lockfile van npm, zodat u de versies houdt die u al hebt getest. Draai uw tests voordat u commit.
Elke map die hier overeenkomt, wordt een workspace-package. Zet het bestand in de root van de repository.
Afhankelijk zijn van een lokaal package
workspace:* verwijst altijd naar de lokale kopie van ui in plaats van naar een versie uit de registry.
Vertaler van npm- naar pnpm-commando's
Typ een npm-commando
npm install -D vite
pnpm-equivalent
Geen directe overeenkomst. De meeste andere npm-commando's houden onder pnpm dezelfde naam.