Package Manager

pnpm

pnpm ist ein schneller, speichereffizienter Package Manager, der einen content-addressable Store und strikte symlinked node_modules verwendet. Er ist die erste Wahl für Monorepos.

intermediate13 min readUpdated 15. Sept. 2026
pnpm-workspace.yaml
yaml
// pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"

// packages/ui/package.json
{
  "name": "@repo/ui",
  "version": "0.0.0",
  "private": true,
  "main": "./src/index.ts"
}
Store
Content-addressable
node_modules
Symlinked und strikt
Festplattennutzung
Projektübergreifend geteilt
Workspaces
Integriert
Lockfile
pnpm-lock.yaml
Ideal für
Monorepos

Warum es wichtig ist

Warum Teams zu pnpm wechseln

Spart Festplattenplatz

Jede Paketversion wird nur einmal in einem globalen Store gespeichert und per Hard-Link in Projekte eingebunden, sodass zehn Projekte nicht zehn Kopien bedeuten.

Schnelle Installationen

Ein content-addressable Store kombiniert mit parallelen Operationen macht Installationen deutlich schneller als ein jedes Mal neuer Download.

Standardmäßig strikt

Ein Paket kann nur importieren, was es explizit deklariert, wodurch verhindert wird, dass Phantom-Abhängigkeiten zufällig funktionieren.

Das Gesamtbild

Die drei Kernideen hinter pnpm

Ein gemeinsamer globaler Store, symlinked node_modules, die nur deklarierte Abhängigkeiten exponieren, und First-Class-Workspaces.

Der Store

Speicherung

Ein einziger globaler Cache der Paketinhalte, der per Hard-Link in jedes Projekt eingebunden wird, das sie benötigt.

node_modules

Resolution

Ein symlinked Layout, das den tatsächlichen Dependency-Graph widerspiegelt und deklarierte Abhängigkeiten erzwingt.

Workspaces

Monorepos

First-Class-Support für Repositories mit mehreren Paketen mittels des Workspace-Protokolls.

pnpm auf einen Blick

Der Kern von pnpm

pnpm add

Abhängigkeiten hinzufügen, mit -D für Development-Tools und -w für das Workspace-Root.

Striktes Layout

Nur deklarierte Abhängigkeiten sind importierbar, wodurch fehlende Einträge frühzeitig erkannt werden.

Workspaces

Paket-Globs in der pnpm-workspace.yaml definieren.

Workspace-Protokoll

Referenziere benachbarte Pakete mit workspace:* anstelle von Dateipfaden.

Catalogs

Zentralisierung von Abhängigkeitsversionen über mehrere Pakete hinweg.

Frozen Lockfile

CI-Installationen installieren exakt das, was im Lockfile spezifiziert ist.

Eine kurze Geschichte

Vom schnellen npm-Klon zum Monorepo-Standard

  1. 2017

    pnpm veröffentlicht

    Ein Package Manager, der auf einem content-addressable Store für Geschwindigkeit und Speichereffizienz basiert.

    17
  2. 2019

    Workspaces reifen aus

    First-Class-Monorepo-Support macht pnpm in größeren Repositories populär.

    19
  3. 2021

    Wachsende Adaption

    Frameworks und Bibliotheken beginnen, pnpm neben npm zu dokumentieren.

    21
  4. 2023

    Catalogs und mehr

    Gemeinsame Versions-Catalogs vereinfachen das Abhängigkeitsmanagement über Pakete hinweg.

    23
  5. Heute

    Der Monorepo-Standard

    Eine gängige Wahl für Monorepos und ein schneller Ersatz für viele npm-Workflows.

    Heute

Der vollständige Leitfaden

pnpm: Alles was Sie wissen müssen

Was ist pnpm?

pnpm ist ein Package Manager, der jede Version jedes Packages nur einmal in einem globalen, content-addressable store speichert und diese per Hardlink in jedes Projekt einbindet, das sie benötigt. Das Ergebnis ist ein drastisch geringerer Speicherverbrauch und wesentlich schnellere Installationen, insbesondere bei vielen Projekten oder in einem Monorepo.

Zudem ist pnpm strikt. Anstatt jede Dependency in einem einzigen node_modules zu flachen, nutzt pnpm Symlinks, welche den tatsächlichen Dependency-Graph widerspiegeln. Ein Package kann nur das importieren, was es auch explizit deklariert. Dadurch schlägt die versehentliche Abhängigkeit von einer transitiven Dependency sofort fehl, anstatt lokal zu funktionieren und erst in der Production zu crashen.

Der Store und node_modules

Der Store befindet sich in einem globalen Verzeichnis und enthält die Inhalte jeder Paketversion, die Sie jemals installiert haben. Wenn ein Projekt ein Paket benötigt, erstellt pnpm einen Hardlink aus dem Store, anstatt es zu kopieren.

Das node_modules-Layout verwendet dann Symlinks:

  • node_modules/.pnpm enthält die eigentlichen Pakete.
  • node_modules/<name> verlinkt auf die Version, die Ihr Projekt deklariert hat.
  • Die node_modules jedes einzelnen Pakets verlinkt nur auf dessen deklarierte Abhängigkeiten.

Aus diesem Grund erkennt pnpm Phantom-Abhängigkeiten: Wenn Ihr Code ein Paket importiert, das Sie vergessen haben, in package.json hinzuzufügen, schlägt dies fehl, da das Paket auf der obersten Ebene nicht verlinkt ist. Das flache Layout von npm lässt diesen Fehler oft unbemerkt passieren.

Befehle

Die Befehle ähneln denen von npm, was die Migration erleichtert.

pnpm install          # install from the lockfile
pnpm add zod          # add a dependency
pnpm add -D vitest    # add a dev dependency
pnpm remove zod       # remove a dependency
pnpm run build        # run a script
pnpm dlx create-vite  # run a package without installing

pnpm install nutzt den Store, wodurch wiederholte Installationen schnell gehen. pnpm-lock.yaml übernimmt die gleiche Rolle wie package-lock.json und sollte in das Repository eingecheckt werden.

Workspaces

Workspaces sind das herausragende Feature von pnpm. Die Paketstandorte werden in pnpm-workspace.yaml definiert.

# pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"

Ein Workspace kann dann über das Workspace-Protokoll anstatt über einen relativen Dateipfad von einem benachbarten Paket abhängen.

{
  "name": "@repo/web",
  "dependencies": {
    "@repo/ui": "workspace:*"
  }
}

pnpm verlinkt das lokale Paket, und workspace:* wird beim Veröffentlichen durch die tatsächliche Version ersetzt. Dadurch bleiben interne Abhängigkeiten explizit und fehleranfällige file:../..-Pfade werden vermieden.

Kataloge und Versionskonsistenz

In einem großen Monorepo passiert es leicht, dass verschiedene Packages von unterschiedlichen Versionen derselben Library abhängen. Kataloge zentralisieren diese Entscheidung.

# pnpm-workspace.yaml
packages:
  - "apps/*"
  - "packages/*"

catalog:
  react: ^19.0.0
  typescript: ^5.6.0
{
  "dependencies": {
    "react": "catalog:"
  }
}

Jedes Package, das catalog: verwendet, löst auf die einmal im Root definierte Version auf. Dadurch wird ein Upgrade zu einer einzigen Änderung und ein Auseinanderdriften der Versionen wird verhindert.

Tasks filtern und ausführen

pnpm kann eine Teilmenge eines Workspaces ansteuern, was in einem Monorepo essenziell ist.

# run tests only in packages that changed since main
pnpm --filter "...[origin/main]" test

# run a script in one package
pnpm --filter @repo/web dev

# run a script in every package
pnpm -r build

Filter unterstützen Paketnamen, Directory Globs und Abhängigkeitsbeziehungen, sodass Sie einen Befehl nur dort ausführen können, wo er relevant ist. Für das Caching und die Orchestrierung über Pakete hinweg kombinieren Sie pnpm am besten mit Turborepo, das genau für dieses Setup entwickelt wurde.

CI und Reproduzierbarkeit

Verwenden Sie in der CI eine eingefrorene Lockfile, damit die Installation fehlschlägt, wenn die Lockfile und die Manifeste nicht übereinstimmen.

pnpm install --frozen-lockfile
pnpm run build

Dies ist das pnpm-Äquivalent zu npm ci und garantiert einen reproduzierbaren Build. Da Installationen schnell sind und der Store in der CI gecached werden kann, trägt pnpm zudem dazu bei, die Pipeline-Zeit zu reduzieren.

pnpm im Vergleich zu npm

  • Festplatte und Geschwindigkeit: pnpm teilt Pakete über einen Store und verlinkt diese; npm kopiert pro Projekt einen flachen Baum.
  • Strenge: pnpm stellt nur deklarierte Abhängigkeiten bereit; das flache Layout von npm ermöglicht sogenannte Phantom-Imports.
  • Workspaces: Beide unterstützen diese, aber das Workspace-Protokoll und das Filtern von pnpm sind für große Monorepos ergonomischer.
  • Kompatibilität: Beide lesen package.json und unterstützen dieselbe Registry, sodass ein Wechsel normalerweise nur das Löschen von node_modules und der alten Lockfile erfordert.

Wählen Sie npm für Einfachheit und maximale Verbreitung und pnpm, wenn Festplattenplatz, Geschwindigkeit oder die Ergonomie von Monorepos eine Rolle spielen. Siehe den npm-Guide für den Standard-Workflow.

Best Practices

  • Commit pnpm-lock.yaml.
  • Nutze pnpm install --frozen-lockfile in der CI.
  • Verwende workspace:* für interne Abhängigkeiten.
  • Zentralisiere gemeinsam genutzte Versionen mithilfe von Catalogs.
  • Nutze die Strictness aus: Füge fehlende Abhängigkeiten hinzu, anstatt die Prüfung zu deaktivieren.
  • Nutze --filter, um Tasks nur dort auszuführen, wo sie relevant sind.
  • Kombiniere pnpm mit einem Task-Runner für das Caching in großen Repositories.

Häufige Fehler

  • Hinzufügen von Dependencies auf der falschen Workspace-Ebene mit -w.
  • Verwendung von file:-Pfaden anstelle des Workspace-Protokolls.
  • Ignorieren von „not declared in package.json“-Fehlern, anstatt das Manifest zu korrigieren.
  • Vergessen von --frozen-lockfile in der CI, was zu nicht reproduzierbaren Installationen führt.
  • Jedes Paket eine eigene Version einer gemeinsam genutzten Library pinnen lassen.
  • Mischen von Package Managern in einem Repository, wodurch sich widersprüchliche Lockfiles erstellen.

Wie geht es weiter?

pnpm ist die effiziente Wahl für moderne JavaScript-Projekte, insbesondere für Monorepos. Vergleiche es mit npm, ergänze Turborepo für das Task-Caching und verschaffe dir ein Verständnis für die zugrunde liegende Node.js-Runtime. Probiere es anschließend an einem bestehenden Projekt aus, indem du node_modules entfernst und pnpm den Dependency-Tree aus dem Store neu aufbauen lässt.

Referenzierung eines Workspace-Pakets

Das Workspace-Protokoll verknüpft lokale Pakete explizit. Relative Dateipfade sind fehleranfällig und brechen, wenn Ordner verschoben werden.

Bevorzugt
{
  "dependencies": {
    "@repo/ui": "workspace:*"
  }
}
Vermeiden
{
  "dependencies": {
    "@repo/ui": "file:../../packages/ui"
  }
}

Installation in der CI

Ein frozen Lockfile installiert exakt das, was committet wurde, und schlägt bei Abweichungen fehl, was reproduzierbare Builds sicherstellt.

Bevorzugt
pnpm install --frozen-lockfile
pnpm run build
Vermeiden
# may update the lockfile
# and install different
# versions than local
pnpm install
pnpm run build

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, pnpm zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch pnpm — mit Quizzen und echtem Code, den Sie im Browser ausführen können.