npm 把每个项目的 node_modules 都完整拷一遍依赖——十个项目十份 lodash。pnpm 用全局 store(内容寻址存储)存唯一一份,各项目里用硬链接 + 符号链接组织依赖,磁盘与安装时间都大幅下降(实测大型 monorepo 提升 2-3 倍)。
另一个杀招是「严格依赖结构」:pnpm 的 node_modules 用非扁平结构,只有 package.json 声明的依赖能被 import——有效杜绝「幽灵依赖」(代码里直接用了传递依赖却不声明,npm 扁平结构下能跑,迁移就炸)。monorepo 场景它的工作区(workspace)能力也是标配。
# 安装
# npm i -g pnpm
# 常用命令与 npm 几乎一致
# pnpm add axios 安装
# pnpm add -D vitest 开发依赖
# pnpm install 按 lock 安装
# pnpm why lodash 查看依赖来源(谁引入了它)
# monorepo 工作区(pnpm-workspace.yaml)
packages:
- 'packages/*' # 各子包
- 'apps/*'
# 根目录装跨包共享依赖:
# pnpm add -w lodash -w = workspace root
# 子包引用同仓伙伴包:
# pnpm --filter ./packages/ui add @repo/utils
/* 严格结构的 node_modules:
* node_modules/.pnpm/ ← 真身(硬链接到 store)
* node_modules/lodash → 软链 ← 只有 package.json 声明的能用
*/