pnpm
1. 什么是 pnpm?
pnpm 是一种 Node.js 的包管理器(类似于 npm 和 yarn)。 名字里的 p 代表 Performant(高性能),也有人说是 “poor man's npm” 😂。
它的核心特点是:
- 使用 硬链接 + 符号链接 的方式来存储依赖。
- 避免不同项目重复下载相同的依赖,大大节省磁盘空间。
- 更快的安装速度。
2. pnpm 有什么用?
🚀 性能和空间优势
- npm/yarn:每个项目都要复制一份完整的依赖到
node_modules
。 - pnpm:把所有依赖放在一个全局的 内容可寻址存储(content-addressable store),项目里只是通过符号链接指向。
结果就是:
- 相同的依赖只会存一份。
- 安装速度更快,磁盘占用更小。
📦 严格的依赖隔离
- 在
npm
或yarn
中,node_modules
会形成一个“扁平化”结构,有时可能让项目误依赖到不是自己声明的包(幽灵依赖问题)。 - pnpm 使用符号链接保持严格的依赖树,避免隐式依赖。 👉 如果你的
package.json
里没声明,就无法直接引用。
🛠 Monorepo 支持更好
pnpm
原生支持 monorepo 管理(工作空间pnpm-workspace.yaml
)。- 比如在一个仓库里有多个子包,
pnpm
可以高效地安装和链接它们,代替 Lerna、Yarn workspaces 等工具。
🌍 与 npm 生态完全兼容
pnpm
底层还是调用 npm registry,所以和 npm 包生态 100%兼容。- 使用方式也和
npm
很接近,学习成本低。
3. 如何使用 pnpm?
安装 pnpm
bash
npm install -g pnpm
常用命令对照
操作 | npm | pnpm |
---|---|---|
安装依赖 | npm install | pnpm install |
安装某个包 | npm install xx | pnpm add xx |
移除某个包 | npm uninstall xx | pnpm remove xx |
更新依赖 | npm update | pnpm update |
初始化项目 | npm init | pnpm init |
Monorepo 示例
创建 pnpm-workspace.yaml
:
yaml
packages:
- 'packages/*'
- 'apps/*'
这样 pnpm
会自动管理多个子项目的依赖和链接。
总结
- pnpm 是一种更快、更省空间、更严格的包管理器。
- 核心优势:
- 磁盘节省(共享依赖存储)。
- 安装速度快。
- 严格依赖管理,避免幽灵依赖。
- 原生支持 monorepo。
npm vs Yarn vs pnpm 对比表
特性 / 工具 | npm | Yarn | pnpm |
---|---|---|---|
生态兼容性 | ✅ 官方,100% 兼容 npm registry | ✅ 兼容 npm registry | ✅ 兼容 npm registry |
安装速度 | ⏳ 较慢(尤其是全量安装时) | 🚀 比 npm 快,缓存优化 | ⚡ 非常快(硬链接 + 全局存储机制) |
磁盘空间占用 | 📦 高,每个项目一份完整依赖 | 📦 中等,有缓存但依赖重复存储 | 🪶 很低,共享依赖存储,节省大量空间 |
依赖结构 | 扁平化,可能产生“幽灵依赖” | 扁平化,依旧可能有幽灵依赖 | 严格隔离,避免幽灵依赖 |
Monorepo 支持 | 🚫 无原生支持,需要 Lerna 等工具 | ⚠️ Yarn Workspaces 支持 | ✅ 原生支持 Workspaces,管理更高效 |
命令兼容性 | 标准 npm 命令 | 大部分与 npm 相似 | 基本兼容,部分命令略有不同(如 add ) |
锁文件 | package-lock.json | yarn.lock | pnpm-lock.yaml |
稳定性 | ✅ 官方维护,稳定性高 | ✅ 较成熟,社区维护 | ✅ 越来越流行,性能最佳 |
学习成本 | ⭐⭐ 最低 | ⭐⭐ 略有差异(命令相似) | ⭐⭐⭐ 略高,但上手简单 |
适用场景 | 小型项目,或默认环境 | 中大型项目,需要更快安装 | 中大型/Monorepo 项目,重视性能和空间 |
对比总结
- npm:默认选择,生态最广,适合一般小型项目。
- Yarn:性能较优,适合需要加快依赖安装的团队。
- pnpm:性能最好、磁盘最省、依赖最严格,特别适合 大型项目 和 monorepo 场景。