pnpm 和 npm 都是 JavaScript 的包管理工具,但它们在 依赖安装方式、性能和磁盘占用 上有明显区别。
下面帮你对比一下:
一句话总结
- ✅ npm:官方默认工具,简单直接,生态成熟
- ✅ pnpm:更快、更省空间、更严格,适合中大型项目
1️⃣ 依赖安装方式(最大区别)
✅ npm
- 每个项目都会把依赖完整复制一份 到
node_modules - 不同项目之间不共享依赖
- 会占用较多磁盘空间
结构类似:
projectA/node_modules/react
projectB/node_modules/react
✅ pnpm
- 使用 全局内容寻址存储(content-addressable store)
- 相同版本的依赖只存一份
- 通过 硬链接 + 符号链接 共享
结构类似:
~/.pnpm-store/react@18.2.0 ← 只存一份
projectA/node_modules → 链接
projectB/node_modules → 链接
✅ 优点:
- 节省大量磁盘空间
- 安装速度更快
2️⃣ 安装速度
| 工具 | 速度 |
|---|---|
| npm | 较慢 |
| pnpm | 更快(尤其是第二次安装) |
原因:
- pnpm 有全局缓存
- 不重复下载
- 链接速度比复制快
3️⃣ node_modules 结构
npm(扁平化结构)
会自动"提升"依赖:
node_modules/
react
lodash
缺点:
- 可能产生 幽灵依赖(phantom dependency)
- 代码中可以引用 package.json 里没声明的包
pnpm(严格结构)
依赖按层级存在:
node_modules/
.pnpm/
react@18.2.0/
✅ 优点:
- 不会出现幽灵依赖
- 依赖关系更清晰
- 更符合 Node 规范
4️⃣ Monorepo 支持
| 功能 | npm | pnpm |
|---|---|---|
| workspace | ✅ 支持 | ✅ 支持(更强) |
| monorepo 性能 | 一般 | 更优秀 |
✅ pnpm 是很多大型 Monorepo 项目的首选(如 Vue、Vite)
5️⃣ 命令对比
基本用法几乎一样:
| 功能 | npm | pnpm |
|---|---|---|
| 安装依赖 | npm install | pnpm install |
| 添加依赖 | npm i axios | pnpm add axios |
| 删除依赖 | npm uninstall | pnpm remove |
6️⃣ 什么时候选哪个?
✅ 选 npm:
- 小项目
- 不想额外安装工具
- 公司默认用 npm
✅ 选 pnpm:
- 中大型项目
- Monorepo
- 想提高安装速度
- 想节省磁盘空间
- 想避免幽灵依赖
7️⃣ 会不会有兼容问题?
现在基本没有。
pnpm 已经非常成熟:
- 支持 React / Vue / Next / Vite
- 支持大多数 npm 包
- 兼容 package-lock.json(可转换)
总结对比表
| 对比项 | npm | pnpm |
|---|---|---|
| 官方性 | ✅ 官方 | ❌ 第三方 |
| 速度 | 普通 | ✅ 快 |
| 磁盘占用 | 高 | ✅ 低 |
| 依赖严格性 | 一般 | ✅ 严格 |
| Monorepo | 一般 | ✅ 强 |
| 推荐程度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
如果你是:
- ✅ 前端开发者 → 推荐用 pnpm
- ✅ Node 新手练习 → 用 npm 也完全够
- ✅ 做大型项目 → 直接上 pnpm
后记
2026年4月3日于上海,在gpt5.2辅助下完成。