PNPM 使用介绍

pnpm 用硬链接共享依赖,省磁盘、装得快、依赖不幽灵。

Beginner
Key Pointspnpm 全局存一份包内容,项目里用硬链接指过去,并严格隔离非法依赖。

装与用

Bash
npm install -g pnpm
pnpm -v

pnpm init
pnpm add express
pnpm add -D typescript
pnpm install
pnpm run dev
Output
$ pnpm -v
9.12.3

$ pnpm add express
Packages: +54
++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 54, reused 54, downloaded 0, added 54, done

Note reused 54, downloaded 0 — the packages already exist in the global store and are hard-linked in, costing almost no time or disk.

和 npm 的差别

Aspectnpmpnpm
磁盘每个项目各存一份全局一份 + 硬链接
node_modules扁平提升符号链接 + 严格隔离
幽灵依赖可能装到没声明的包访问不到,直接报错
monorepo要 workspaces原生 workspace,体验更好

幽灵依赖是什么

npm hoists dependencies to the top-level node_modules, so transitive dependencies you never declared are still require-able. It works locally and breaks in CI the day that package's tree changes.

JavaScript
// 只在 dependencies 里声明了 express
// express 依赖 body-parser,但你没声明它
const bp = require('body-parser');   // npm: 能跑  pnpm: ERR_MODULE_NOT_FOUND

workspace

YAML
# pnpm-workspace.yaml
packages:
  - 'packages/*'
  - 'apps/*'
Bash
pnpm --filter @app/web add lodash
pnpm -r run build
To migrate: delete node_modules and package-lock.json; pnpm import converts the old lock into pnpm-lock.yaml so versions do not drift.

Friends & Partners