6月2日 01:43
npm、Yarn 和 pnpm 怎么选?2025 年包管理器对比
npm 和 Yarn 都是 JavaScript 包管理器,做的事情一样(安装依赖、管理版本、运行脚本),区别在于速度、稳定性和锁文件机制。2025 年的实际情况:npm 够用,pnpm 值得切换,Yarn 1 已过时。
核心差异
| 维度 | npm | Yarn 1 (Classic) | Yarn 2+ (Berry) | pnpm |
|---|---|---|---|---|
| 锁文件 | package-lock.json | yarn.lock | yarn.lock | pnpm-lock.yaml |
| 安装速度 | 中 | 快 | 快 | 最快 |
| 离线安装 | 缓存但需网络 | 支持 | 支持 | 支持 |
| Monorepo | workspaces (npm 7+) | workspaces | workspaces | workspaces |
| 磁盘占用 | 高 | 高 | 高 | 低(硬链接) |
| Plug'n'Play | 不支持 | 不支持 | 支持 | 不支持 |
Yarn 曾经的优势,npm 已经追平
Yarn 1 在 2016 年发布时碾压 npm:确定性安装(yarn.lock)、并行下载、离线缓存。但 npm 5+ 引入了 package-lock.json,npm 7+ 加了 workspaces,核心差距已经很小。
2025 年不建议新项目用 Yarn 1。它已经停止维护(最后版本 1.22.x),安全漏洞不会修复。
Yarn 2+ (Berry):激进但有代价
Yarn Berry 引入了 Plug'n'Play(PnP)——不生成 node_modules,用 .pnp.cjs 文件映射包路径。好处是安装快、磁盘占用小。代价是很多依赖 node_modules 的工具不兼容,需要额外配置。
零安装(Zero-Install)是 Berry 的另一个特性——把 .yarn/cache 提交到 Git,clone 后不用 npm install 直接开发。对小团队方便,但 cache 目录会让 Git 仓库膨胀。
实际采用率不高——PnP 的兼容性问题导致迁移成本大,很多团队试了又切回 npm。
pnpm:当前最值得切换的方案
pnpm 用硬链接替代复制——所有项目共享同一份包文件,磁盘占用只有 npm 的 1/3 到 1/5。安装速度也最快(比 npm 快 2-3 倍)。
bashnpm install -g pnpm pnpm install # 替代 npm install pnpm add react # 替代 npm install react pnpm run dev # 替代 npm run dev
pnpm 的严格模式(非扁平的 node_modules)避免了幽灵依赖——你只能 import 声明过的包,不会意外引用到间接依赖。这对项目长期维护是好事,但迁移老项目时可能暴露隐藏的依赖问题。
怎么选
- 新项目:pnpm(磁盘省、速度快、严格依赖)或 npm(零配置、生态兼容性最好)
- 已有项目用 npm:没必要迁移。npm 够用,迁移收益不大
- 已有项目用 Yarn 1:建议迁移到 pnpm 或 npm。Yarn 1 不再维护
- 已有项目用 Yarn Berry:如果 PnP 工作正常就继续用,没有问题就不要换
一句话:没有强需求就不要换包管理器。迁移成本 > 收益的情况很常见。