pnpm vs npm: Speicher, Lockfiles, Workspaces, Befehlsübersicht | We.Inc
Wie pnpm und npm Pakete speichern, Versionen sperren und Monorepos verwalten, ein durchsuchbarer Übersetzer von npm- zu pnpm-Befehlen und die genauen Schritte, um ein Projekt sicher umzustellen.
npm kopiert jedes Paket in das node_modules jedes Projekts und hebt sie flach nach oben. pnpm hält einen einzigen inhaltsadressierten Speicher auf der Festplatte, verlinkt Dateien daraus per Hardlink und legt nur deine direkten Abhängigkeiten auf die oberste Ebene von node_modules. Das spart Speicherplatz und verhindert, dass Code Pakete importiert, die er nie deklariert hat. Die meisten Befehle entsprechen sich eins zu eins.
Die wichtigsten Unterschiede
Thema
Wo die Paketdateien liegen
Eine Kopie in jedem Projekt
Ein gemeinsamer Speicher, per Hardlink in die Projekte verlinkt
Aufbau von node_modules
Flach, alles nach oben gehoben
Nur direkte Abhängigkeiten, der Rest unter node_modules/.pnpm
Lockfile
Workspaces deklariert in
Strikte Installation in CI
npm ci
pnpm install (in CI ist frozen lockfile der Standard)
Ein Paket ohne Installation ausführen
pnpm dlx (auch pnx, pnpx)
Beide Tools lesen dieselbe package.json und installieren aus derselben Registry, die Wahl hängt also an Aufbau, Geschwindigkeit wiederholter Installationen, Monorepo-Werkzeugen und Strenge. Unten siehst du, wie jedes Tool Pakete speichert, einen Übersetzer für die Befehle, die du schon kennst, und die Schritte, um ein bestehendes Projekt von npm auf pnpm umzustellen.
Gib einen npm-Befehl in den Übersetzer ein oder klicke auf eines der Beispiele, um das pnpm-Gegenstück zu sehen.
Lies den Abschnitt zur Speicherung, um zu verstehen, warum pnpm-Installationen weniger Speicherplatz brauchen und nicht deklarierte Imports aufdecken.
Folge den Migrationsschritten, wenn du umsteigen willst, und committe das neue Lockfile.
Wähle pro Repository einen Paketmanager und lösche das andere Lockfile, damit niemand aus einem veralteten installiert.
In CI weigert sich pnpm install, ein veraltetes Lockfile anzufassen, committe pnpm-lock.yaml also jedes Mal, wenn sich package.json ändert.
Wenn ein Paket unter pnpm kaputtgeht, weil es etwas importiert, das es nie deklariert hat, melde das beim Projekt; dieser Import hat unter npm nur zufällig funktioniert.
pnpm führt Skripte auch ohne das Wort run aus, pnpm dev funktioniert also, solange der Skriptname nicht mit einem eingebauten pnpm-Befehl kollidiert.
Häufige Fragen
Ist pnpm schneller als npm?
pnpm verwendet oft Dateien wieder, die schon in seinem Speicher liegen, was wiederholte Installationen auf demselben Rechner beschleunigt. Die Geschwindigkeit hängt vom Cache-Zustand, vom Netzwerk und von der Projektgröße ab, miss also beide an deinem eigenen Projekt, statt dich auf einen veröffentlichten Benchmark zu verlassen.
Kann ich pnpm in einem Projekt mit package-lock.json verwenden?
Ja. Führe pnpm import aus, um aus package-lock.json, npm-shrinkwrap.json oder yarn.lock eine pnpm-lock.yaml zu erzeugen, lösche dann das alte Lockfile und node_modules und führe pnpm install aus.
Warum findet meine App nach dem Umstieg auf pnpm ein Modul nicht?
Dein Code oder eine Abhängigkeit importiert ein Paket, das nicht in der eigenen package.json steht. Der flache Aufbau von npm hat diesen Fehler versteckt. Füge das fehlende Paket als Abhängigkeit dort hinzu, wo es importiert wird.
Braucht pnpm eine Node.js-Installation?
Die Installationsdokumentation von pnpm beschreibt pnpm 12 als natives Programm, das selbst kein Node.js zum Laufen braucht. Deine Projektskripte brauchen Node.js natürlich trotzdem.
Welches sollten Einsteiger verwenden?
npm, weil es mit Node.js ausgeliefert wird und fast jedes Tutorial es verwendet. Steig auf pnpm um, wenn du ein Monorepo betreibst, viele Projekte auf einem Rechner hast oder den strengeren Aufbau von node_modules willst.
Wie jedes Tool Pakete speichert
npm schreibt eine vollständige Kopie jeder Abhängigkeit in das node_modules des Projekts und hebt verschachtelte Abhängigkeiten nach Möglichkeit auf die oberste Ebene. Zehn Projekte, die dieselbe Library nutzen, enthalten zehn Kopien.
pnpm lädt jede Datei einmal in einen globalen inhaltsadressierten Speicher herunter. Projekte bekommen Hardlinks auf diese Dateien, sodass ein zweites Projekt mit denselben Versionen kaum zusätzlichen Platz braucht und eine neue Version nur die geänderten Dateien hinzufügt.
Innerhalb des Projekts legt pnpm Symlinks für deine direkten Abhängigkeiten in node_modules ab und hält alles andere unter node_modules/.pnpm. Ein Paket kann nur auf das zugreifen, was es deklariert hat.
Workspaces und Monorepos
npm-Workspaces werden in der package.json im Root aufgelistet und mit -w name oder --workspaces ausgeführt. pnpm listet sie in pnpm-workspace.yaml auf und wählt sie mit --filter aus, das auch Abhängigkeitsgraphen versteht, zum Beispiel ein Paket plus alles, wovon es abhängt.
Das workspace:-Protokoll von pnpm bindet eine Abhängigkeit an das lokale Paket und weigert sich, auf die Registry auszuweichen. Beim Veröffentlichen wird es in einen normalen Versionsbereich umgewandelt.
Ein Projekt von npm auf pnpm umstellen
Migrationsschritte
pnpm import liest das npm-Lockfile, damit du die Versionen behältst, die du bereits getestet hast. Lass deine Tests laufen, bevor du committest.
Jeder Ordner, der hier passt, wird zu einem Workspace-Paket. Leg die Datei im Root des Repositorys ab.
Abhängigkeit von einem lokalen Paket
workspace:* löst immer auf die lokale Kopie von ui auf statt auf eine Version aus der Registry.
Übersetzer von npm- zu pnpm-Befehlen
Gib einen npm-Befehl ein
npm install -D vite
pnpm-Gegenstück
Keine direkte Entsprechung. Die meisten anderen npm-Befehle heißen unter pnpm genauso.