pnpm-Nutzungsanleitung

Als Node.js-Entwickler haben Sie sicherlich schon vonnpmundyarn, sie sind leistungsstarke Werkzeuge zur Verwaltung von Projektabhängigkeiten. Aber sind Sie schon einmal aufnode_modulesdie Frustration über riesige Ordner, langsame Installationsgeschwindigkeiten oder schnell voll werdenden Speicherplatz gestoßen? Das ist das Problem, das pnpm lösen kann.

pnpmist ein schneller, speicherplatzsparender Node.js-Paketmanager. Es speichert Pakete mithilfe von Content-Addressing, wobei alle Versionen von Abhängigkeiten zentral an einem Ort auf dem System gespeichert und dann über Hardlinks in Projekte verlinkt werden, wodurch doppelte Installationen vermieden werden.

pnpm's Slogan lautetFast, disk space efficient package manager(Schneller, speicherplatzsparender Paketmanager). Er ist nicht nur extrem schnell, sondern sein einzigartiger Verlinkungsmechanismus spart Ihnen auch eine beträchtliche Menge an Speicherplatz und Bandbreite.


pnpm installieren

Es gibt mehrere Möglichkeiten, pnpm zu installieren; Sie können je nach Ihren Vorlieben und Ihrer Systemumgebung wählen.

Methode 1: Installation über npm (für alle Benutzer empfohlen)

Dies ist die universellste und einfachste Methode. Öffnen Sie Ihr Terminal (Windows-Benutzer können PowerShell oder CMD verwenden) und führen Sie den folgenden Befehl aus:

npm install -g pnpm

Dieser Befehl installiert pnpm über npm in Ihrer globalen Umgebung.

Überprüfen Sie, ob die Installation erfolgreich war: Führen Sie nach der Installation den folgenden Befehl aus, um die Version zu prüfen. Wenn die Versionsnummer normal angezeigt wird, war die Installation erfolgreich.

pnpm --version

Ausgabe ähnlich wie: 8.15.0

Methode 2: Installation über ein eigenständiges Skript

Für macOS- oder Linux-Benutzer können Sie mit dem folgenden Skript installieren:

# macOS/Linux
curl -fsSL https://get.pnpm.io/install.sh | sh -

# Windows (PowerShell)
iwr https://get.pnpm.io/install.ps1 -useb | iex

pnpm verwenden

Nachdem Sie nun gelernt haben, wie man es installiert, beginnen wir mit der tatsächlichen Verwendung von pnpm. Sein Befehlsdesign ist sehr intuitiv; wenn Sie mit npm vertraut sind, können Sie fast nahtlos wechseln.

Ein neues Projekt initialisieren

Ähnlich wienpm init, pnpm kann verwendet werden, um ein Projekt zu initialisieren und zu erstellenpackage.jsonDatei.

# 交互式地回答问题,创建 package.json
pnpm init

# 快速创建一个带有默认值的 package.json
pnpm init -y

Führen Siepnpm init -yDanach bekommst du ein sehr einfachespackage.jsonDatei:

Beispiel

{
  "name": "your-project-name",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Fehler: kein Test angegeben\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Abhängigkeiten installieren

Der Installationsbefehl von pnpm istpnpm add <package-name>, äquivalent zunpm install <package-name>。

# 安装所有依赖
pnpm install

# 添加依赖包
pnpm add <package-name>

# 添加开发依赖
pnpm add -D <package-name>

# 添加全局包
pnpm add -g <package-name>

# 安装指定版本
pnpm add <package-name>@<version>

Abhängigkeiten aktualisieren

# 更新所有依赖
pnpm update

# 更新指定包
pnpm update <package-name>

# 更新到最新版本(忽略 package.json 中的版本范围)
pnpm update --latest

Abhängigkeiten entfernen

pnpm remove <package-name>

Skripte ausführen

# 运行 package.json 中定义的脚本
pnpm run <script-name>
# 一些常见的简写
pnpm start
pnpm test
pnpm build

Befehlsvergleichstabelle npm zu pnpm

npm-Befehl pnpm-Befehl
npm install pnpm install
npm install <pkg> pnpm add <pkg>
npm install <pkg> --save-dev pnpm add -D <pkg>
npm install <pkg> --global pnpm add -g <pkg>
npm update pnpm update
npm uninstall <pkg> pnpm remove <pkg>
npm run <script> pnpm run <script>
npx <command> pnpm dlx <command>
npm list pnpm list
npm outdated pnpm outdated
npm audit pnpm audit

Konfigurationsdatei

pnpm unterstützt die Konfiguration über die ⟦⟧.npmrc-.npmrcDatei

Wenn Sie dies im Projektstammverzeichnis erstellen, können Sie das Verhalten von pnpm anpassen.

Gängige Konfigurationsbeispiele

# 设置国内镜像源(淘宝)
registry=https://registry.npmmirror.com

# 自动安装 peer dependencies
auto-install-peers=true

# 严格模式
strict-peer-dependencies=true

# shamefully-hoist(提升依赖,兼容某些工具)
shamefully-hoist=true

# 指定 node_modules 目录结构
node-linker=hoisted

# 设置存储目录
store-dir=~/.pnpm-store

Aktuelle Konfiguration anzeigen

pnpm config list

Konfigurationsoptionen festlegen:

pnpm config set <key> <value>

Arbeitsbereich

pnpm bietet eine integrierte, leistungsstarke Monorepo-Unterstützung.

Definieren Sie einen Workspace, indem Sie eine pnpm-workspace.yaml-Datei im Projektstammverzeichnis erstellen.

Konfigurationsbeispiel:

packages:
  - 'packages/*'
  - 'apps/*'
<p>  - '!**/test/**'
Beispiel für Projektstruktur:
my-monorepo/
├── pnpm-workspace.yaml
├── package.json
├── packages/
│   ├── package-a/
│   │   └── package.json
│   └── package-b/
│       └── package.json
└── apps/
    └── web-app/
        └── package.json

Workspace-Befehle

# 在所有工作区包中安装依赖
pnpm install

# 在指定工作区执行命令
pnpm --filter <package-name> <command>

# 在所有工作区执行命令
pnpm -r <command>

# 递归运行脚本
pnpm -r run build

# 为工作区添加依赖
pnpm --filter <package-name> add <dependency>

# 添加工作区内部依赖
pnpm --filter package-a add package-b@workspace:*

Workspace-Protokoll

Wenn Sie auf andere Pakete innerhalb des Workspace verweisen, verwenden Sie das workspace:-Protokoll:

json{
  "dependencies": {
    "package-a": "workspace:*",
    "package-b": "workspace:^1.0.0"
  }
}

Erweiterte Funktionen

pnpm exec und pnpm dlx

# 执行本地安装的包
pnpm exec <command>

# 执行远程包(类似 npx)
pnpm dlx create-react-app my-app

# 使用特定版本
pnpm dlx create-react-app@latest my-app

Abhängigkeitsbaum anzeigen

# 查看依赖树
pnpm list

# 指定深度
pnpm list --depth 2

# 只显示生产依赖
pnpm list --prod

# 查看全局包
pnpm list -g

Veraltete Abhängigkeiten anzeigen

pnpm outdated

Sicherheit der Abhängigkeiten prüfen

pnpm audit

# 自动修复安全问题
pnpm audit --fix

Cache bereinigen

# 清理未使用的包
pnpm store prune

# 查看存储位置
pnpm store path

# 查看存储状态
pnpm store status

Lockfile importieren

Bei der Migration von anderen Paketmanagern:

# 从 package-lock.json 导入
pnpm import

# 从 yarn.lock 导入
pnpm import

Pakete patchen

Wenn Sie ein Abhängigkeitspaket vorübergehend ändern müssen:

# 创建补丁
pnpm patch <package-name>@<version>

# 应用补丁后提交
pnpm patch-commit <path>

Was ist pnpm? Was sind seine Kernvorteile?

Bevor wir tiefer in die Nutzung einsteigen, müssen wir zunächst die Kernphilosophie von pnpm und die Veränderungen, die sie mit sich bringt, verstehen.

pnpm (Performant npm)ist ein Node.js-Paketmanager, der abwärtskompatibel mit npm ist, was bedeutet, dass die überwiegende Mehrheit vonnpmBefehlen inpnpmdirekt verwendet werden kann.

Das Designziel von pnpm ist es, die Engpässe traditioneller Paketmanager (wie npm und yarn) bei Speicherplatz und Installationsgeschwindigkeit zu lösen.

Probleme mit traditionellen Paketmanagern

Stellen Sie sich vor, Sie arbeiten in Ihrem Unternehmen an 10 verschiedenen Frontend-Projekten, und jedes Projekt hängt von[email protected]. Bei Verwendung von npm oder yarn wird dieseslodashPaket vollständig heruntergeladen und 10-mal gespeichert, in 10 verschiedenennode_modulesOrdnern auf Ihrem Computer. Dies verursacht eine enorme Verschwendung von Speicherplatz.

Der revolutionäre Ansatz von pnpm: inhaltsadressierbare Speicherung und Hardlinks

pnpm verwendet einen cleveren Ansatz:

  1. Globaler Speicher: Wenn Sie ein Paket installieren, speichert pnpm dessen Inhalte ineinem globalen Single-Version-Repository(normalerweise unter~/.pnpm-store)。
  2. Hardlinks: In Ihrem Projektnode_modulesin, pnpm kopiert nicht die vollständigen Dateien des Pakets, sondern erstelltHardlinks. Man kann sich einen Hardlink als eine "fortgeschrittene Verknüpfung" vorstellen; er teilt dieselben Festplattendaten wie die Originaldatei.
  3. Symlink-Organisation: Zum Beibehaltennode_modulesflache Struktur (umrequireAnweisungen zu erleichtern), pnpm erstellt einen ausgeklügelten Satz vonsymbolischen Links(Softlinks), um den Abhängigkeitsbaum zu organisieren.

Durch diesen Mechanismus,egal wie viele Projekte von demselben Paket abhängen, wird nur eine Kopie des Pakets auf der physischen Festplatte gespeichert.. Dies bringt unmittelbare Vorteile:

  • Spart eine große Menge an Speicherplatz: Für Entwickler mit mehreren Projekten sind die Einsparungen äußerst erheblich.
  • Extrem schnelle Installationsgeschwindigkeit: Bei nachfolgenden Installationen, wenn das Paket bereits im globalen Store vorhanden ist, muss pnpm nur Links erstellen, was um Größenordnungen schneller ist als Herunterladen und Entpacken.
  • Verbesserte Sicherheit:node_modulesDie Paketdateien darin sind schreibgeschützt (da es sich um Hardlinks handelt), was das Risiko vermeidet, dass Projektskripte versehentlich die Inhalte von Abhängigkeitspaketen ändern, und den Determinismus der Abhängigkeiten gewährleistet.

Die obige Abbildung zeigt deutlich den Kern-Workflow von pnpm: Alle Projekte teilen dieselbe Paketdatei im globalen Store über Hardlinks und dann in ihren jeweiligennode_modulesVerzeichnissen wird die Abhängigkeitsstruktur durch symbolische Links aufgebaut.

Funktionsvergleich npm (v7+) / yarn pnpm
Speicherplatzverbrauch Abhängigkeiten werden für jedes Projekt separat gespeichert und beanspruchen viel Speicherplatz. Alle Projekte nutzen gemeinsam eineeinzige Kopie, mit extrem geringem Speicherplatzverbrauch.
Installationsgeschwindigkeit Langsamer; erfordert das Herunterladen, Entpacken und Aufbauen des Abhängigkeitsbaums. Extrem schnell, besonders für nachfolgende Installationen, bei denen hauptsächlich Links erstellt werden.
node_modulesStruktur Flach oder halbflach, was zu Dependency-Hoisting und Problemen mit Phantom-Abhängigkeiten führen kann. Striktenicht-flache Struktur, die Abhängigkeitsbeziehungen genau simuliert und Phantom-Abhängigkeiten eliminiert.
Monorepo-Unterstützung Unterstützt über Workspaces, aber mit Leistungsengpässen. Native, effizienteWorkspaces-Unterstützung; Leistung ist ihre Stärke.
Paketverwaltungsmodell Kopiert Dateien während der Installation in das Projekt. Link-Modell (Hardlinks + symbolische Links).
Sicherheit Abhängigkeiten können durch Projektskripte geändert werden. Abhängigkeitsdateien sind schreibgeschützte Hardlinks und bieten höhere Sicherheit.

Offizielle Ressourcen:

Andere Erweiterungen