Back

Eine Einführung in pnpm: Eine schnellere Alternative zu npm und Yarn

Eine Einführung in pnpm: Eine schnellere Alternative zu npm und Yarn

Wenn Sie schon einmal beobachtet haben, wie Ihre CI/CD-Pipeline minutenlang mit der Installation von Abhängigkeiten beschäftigt war, oder auf Entwicklungsrechnern mit Speicherplatzproblemen aufgrund doppelter Pakete in verschiedenen Projekten zu kämpfen hatten, erleben Sie genau die Probleme, für deren Lösung pnpm entwickelt wurde. Dieser leistungsstarke Paketmanager bietet einen grundlegend anderen Ansatz für das Dependency-Management, der Installationszeiten um das 2- bis 3-fache verkürzen und die Festplattennutzung um etwa 50 % reduzieren kann.

Wichtigste Erkenntnisse

  • pnpm verwendet einen inhaltsadressierbaren Speicher mit Hard Links, um doppelte Pakete projektübergreifend zu eliminieren
  • Strikte Dependency-Auflösung verhindert Phantom-Dependencies und erkennt Fehler vor der Produktionsumgebung
  • Installationsgeschwindigkeiten verbessern sich um das 2- bis 3-fache im Vergleich zu npm, bei 50 % weniger Festplattennutzung
  • Integrierte Workspace-Unterstützung macht es ideal für Monorepo-Architekturen

Was macht pnpm anders

Im Gegensatz zu npm und Yarn, die Pakete projektübergreifend duplizieren, verwendet pnpm einen inhaltsadressierbaren Speicher mit Hard Links, um Abhängigkeiten global zu teilen. Wenn Sie Express in mehreren Projekten installieren, erstellt npm separate Kopien in jedem node_modules-Ordner. pnpm speichert es einmal in ~/.pnpm-store und erstellt Hard Links zu dieser einzelnen Kopie, wodurch die Festplattennutzung drastisch reduziert wird, während gleichzeitig eine vollständige Isolation zwischen Projekten aufrechterhalten wird.

Diese Architektur verhindert auch „Phantom-Dependencies” – ein häufiges Problem, bei dem Code versehentlich Pakete importieren kann, die nicht in der package.json aufgeführt sind. Mit der strikten Node.js-Modulauflösung von pnpm kann Ihr Code nicht auf eine Abhängigkeit zugreifen, wenn diese nicht explizit deklariert ist, wodurch Fehler erkannt werden, bevor sie die Produktionsumgebung erreichen.

Installation und Einrichtung

Für Node.js 16.13 oder neuer ist die empfohlene Installationsmethode über Corepack:

corepack enable
corepack prepare pnpm@latest --activate

Alternativ können Sie über npm installieren:

npm install -g pnpm

Wichtige Befehle für die tägliche Entwicklung

Die grundlegenden pnpm-Befehle spiegeln die vertraute Syntax von npm wider und fügen gleichzeitig Leistungsoptimierungen hinzu:

pnpm add express          # Produktions-Dependency hinzufügen
pnpm add -D typescript    # Dev-Dependency hinzufügen
pnpm remove lodash       # Paket entfernen
pnpm update             # Alle Dependencies aktualisieren
pnpm run build         # Skript aus package.json ausführen

Der Befehl pnpm store bietet einzigartige Funktionalität zur Verwaltung des globalen Paket-Caches:

pnpm store status      # Store-Zustand prüfen
pnpm store prune      # Nicht referenzierte Pakete entfernen

Konfiguration für moderne Projekte

Erstellen Sie eine .npmrc-Datei, um das pnpm-Verhalten für Ihr Team zu konfigurieren:

strict-peer-dependencies=true
auto-install-peers=true
prefer-offline=true

Diese Einstellungen erzwingen Peer-Dependency-Anforderungen, installieren automatisch Peer-Dependencies (Node.js 16+) und priorisieren gecachte Pakete, um Installationen zu beschleunigen.

Workspace-Einrichtung für Monorepos

Für Monorepo-Projekte glänzt die Workspace-Unterstützung von pnpm bei der Verwaltung mehrerer Pakete. Erstellen Sie eine pnpm-workspace.yaml-Datei:

packages:
  - 'packages/*'
  - 'apps/*'

Verknüpfen Sie Workspace-Pakete mit dem workspace:-Protokoll in der package.json:

{
  "dependencies": {
    "@myapp/shared": "workspace:*",
    "@myapp/ui": "workspace:^1.0.0"
  }
}

Führen Sie Befehle über alle Workspace-Pakete hinweg aus:

pnpm -r build                  # Alle Pakete bauen
pnpm --filter @myapp/api dev   # Dev-Skript in spezifischem Paket ausführen

CI/CD-Optimierung

Für GitHub Actions verwenden Sie die offizielle pnpm-Action mit Node.js 22 LTS:

- uses: pnpm/action-setup@v4
  with:
    version: 9
- uses: actions/setup-node@v4
  with:
    node-version: 22
    cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm test

Für GitLab CI konfigurieren Sie Caching, um die CI/CD-Optimierung zu maximieren:

image: node:22

before_script:
  - corepack enable
  - corepack prepare pnpm@latest --activate

cache:
  key: pnpm-store-$CI_COMMIT_REF_SLUG
  paths:
    - .pnpm-store

install:
  script:
    - pnpm config set store-dir .pnpm-store
    - pnpm install --frozen-lockfile

Das Flag --frozen-lockfile gewährleistet reproduzierbare Builds, indem es fehlschlägt, wenn pnpm-lock.yaml nicht mit package.json übereinstimmt, wodurch Abweichungen zwischen Entwicklungs- und Produktionsumgebungen verhindert werden.

Performance in der Praxis

Teams, die von npm migrieren, sehen typischerweise eine Verbesserung der Installationsgeschwindigkeit um das 2- bis 3-fache aufgrund der effizienten Linking-Strategie von pnpm. Ein mittelgroßes Projekt mit 500 Dependencies könnte mit npm 60 Sekunden dauern, mit pnpm jedoch nur 20-25 Sekunden. Die Festplatteneinsparungen sind noch dramatischer – Entwickler, die an mehreren Projekten arbeiten, gewinnen oft 5-10 GB Speicherplatz zurück, da doppelte Pakete eliminiert werden.

Fazit

pnpm hält sein Versprechen eines schnelleren, effizienteren Dependency-Managements durch innovative Architektur statt inkrementeller Verbesserungen. Die strikte Dependency-Auflösung erkennt Fehler frühzeitig, während die Workspace-Einrichtungsfähigkeiten es ideal für moderne Monorepo-Architekturen machen. Ob Sie CI/CD-Pipelines optimieren oder komplexe Full-Stack-Anwendungen verwalten – pnpm bietet die Performance und Zuverlässigkeit, die Entwicklungsteams benötigen, ohne die Kompatibilität mit dem bestehenden npm-Ökosystem zu opfern.

Häufig gestellte Fragen (FAQs)

pnpm erzwingt standardmäßig eine strikte Peer-Dependency-Auflösung. Es installiert Peer-Dependencies nicht automatisch, es sei denn, Sie aktivieren auto-install-peers in Ihrer Konfiguration. Dies verhindert Versionskonflikte und stellt sicher, dass Ihr Projekt alle erforderlichen Abhängigkeiten explizit deklariert.

Ja, pnpm ist vollständig kompatibel mit npm- und Yarn-Projekten. Führen Sie einfach pnpm import in Ihrem Projektverzeichnis aus, um eine pnpm-lock.yaml-Datei aus Ihrer bestehenden Lock-Datei zu generieren. Alle Ihre npm-Skripte und package.json-Konfigurationen funktionieren ohne Änderungen.

Pakete verbleiben im globalen Store, auch nachdem sie aus Projekten deinstalliert wurden. Dies ermöglicht eine sofortige Neuinstallation, falls sie später benötigt werden. Führen Sie regelmäßig pnpm store prune aus, um nicht referenzierte Pakete zu entfernen und Festplattenspeicher freizugeben.

Absolut. pnpm ist produktionsreif und wird von großen Unternehmen verwendet. Verwenden Sie pnpm install --frozen-lockfile in der Produktion, um exakte Dependency-Versionen sicherzustellen. Die deterministischen Installationen und die strikte Dependency-Auflösung machen Deployments tatsächlich zuverlässiger als mit traditionellen Paketmanagern.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay