npm vs pnpm:包管理器怎么选?
npm 是默认选择,pnpm 在速度和磁盘效率上更优
对比
| 维度 | npm | pnpm |
|---|---|---|
| 安装速度 | 中等(npm 7+ 有改善) | 快(硬链接 + 并行安装) |
| 磁盘占用 | 每个项目独立 node_modules | 全局存储 + 硬链接,节省 50%+ 空间 |
| node_modules 结构 | 扁平化(可能有幽灵依赖) | 严格隔离(不允许访问未声明的依赖) |
| Monorepo 支持 | workspaces(基础) | workspaces(更成熟、更快) |
| 生态兼容性 | 100% 兼容所有包 | 极少数包可能不兼容严格模式 |
| 学习成本 | 零(Node.js 自带) | 低(命令几乎相同) |
| Lock 文件 | package-lock.json | pnpm-lock.yaml |
使用场景
什么时候用 npm
- 新手入门,不想额外安装工具
- 项目简单,依赖不多
- 团队成员对 npm 更熟悉
- 需要最大兼容性
什么时候用 pnpm
- Monorepo 项目(多包管理)
- CI/CD 需要更快的安装速度
- 磁盘空间有限(如容器环境)
- 想要严格的依赖隔离(避免幽灵依赖)
- 大型项目依赖多
示例
mergeExample
# npm 工作流 npm init -y npm install express npm install -D jest npm run test npm ci # CI 环境
rebaseExample
# pnpm 工作流 pnpm init pnpm add express pnpm add -D jest pnpm test pnpm install --frozen-lockfile # CI 环境
常见错误
在已有 package-lock.json 的项目中混用 pnpm(应该迁移 lock 文件)
以为 pnpm 和 npm 完全不兼容(实际上命令几乎一样)
在 CI 中用 npm install 而非 npm ci(ci 更快更可靠)
建议
个人项目和小团队用 npm 就够了,它是默认选择且持续改进。如果你管理 monorepo 或对安装速度有要求,pnpm 是更好的选择。关键是团队统一,不要混用。