npm vs pnpm:包管理器怎么选?

npm 是默认选择,pnpm 在速度和磁盘效率上更优

对比

维度npmpnpm
安装速度 中等(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 是更好的选择。关键是团队统一,不要混用。