pnpm 比 npm 和 yarn 快在哪里?它的工作原理是什么?
请说明 pnpm 的核心优势(硬链接+软链接+内容寻址存储)以及为何能节省磁盘空间。
回答
Yahuda
pnpm:新一代包管理器,使用内容寻址存储(Content-Addressable Storage)和链接来管理依赖。
核心原理:
1. 唯一的内容寻址存储:
- 所有依赖包存储在全局目录
~/.pnpm-store中,按文件内容的哈希值存储 - 同一版本的依赖只存储一份,所有项目硬链接到该存储
- 不同版本的同名包各自独立存储
2. 非扁平 node_modules:
- node_modules 使用软链接+硬链接还原依赖树
- 项目
node_modules下的包是符号链接指向.pnpm目录 .pnpm内部维护真正的依赖关系结构- 实现了「严格」的依赖隔离——只能直接引用 package.json 中声明的依赖
对比:
npm: node_modules/express/... // 扁平化,可访问未声明的包
pnpm: node_modules/.pnpm/express@4.18.0/node_modules/express/...
node_modules/express → .pnpm/express@4.18.0/node_modules/express
优势:
| 特性 | npm | yarn | pnpm |
|---|---|---|---|
| 磁盘占用 | 高(每个项目拷贝) | 高(每个项目拷贝) | 极低(内容寻址存储) |
| 安装速度 | 中等 | 快(并行+缓存) | 快(内容寻址+并行) |
| 依赖隔离 | ❌ 扁平(幽灵依赖) | ❌ 扁平 | ✅ 严格隔离 |
| 安全 | 有安全隐患 | 同左 | 防幽灵依赖 |
| monorepo 支持 | ❌(需lerna) | ❌(需workspace) | ✅ 内置 workspace |
注意:pnpm 对 monorepo 有原生支持,pnpm -r 批量操作包。