先给一个一句话对比结论:
npm 是官方基础款,
pnpm 是为“工程规模”和“效率”优化的,
cnpm 是为“国内网络环境”兜底的。
一、npm 是什么?(基准线)
npm(Node Package Manager)
Node.js 官方自带的包管理器。
它做了什么?
- 下载依赖
- 管理版本
- 执行脚本
npm install
npm run dev
npm 的优点
✅ 官方
✅ 生态最大
✅ 人人都会
npm 的核心问题(为什么后来会有 pnpm)
1️⃣ node_modules 非常大
- 每个项目都复制一整套依赖
- 磁盘占用高
2️⃣ 安装慢(尤其国内)
- 网络不稳定
- 包层级深
3️⃣ 依赖“幽灵化”
npm 允许:
A 依赖 B
C 也能偷偷用 B(即使没声明)
👉 项目表面能跑,实际依赖不干净
二、cnpm 是什么?(国内环境产物)
cnpm
npm 的“国内镜像版 + 客户端”。
核心目的只有一个:
解决 npm 在国内下载慢、失败的问题
cnpm 的工作方式
- 使用 淘宝 npm 镜像
- 命令和 npm 几乎一样
cnpm install
cnpm 的优点
✅ 国内下载快
✅ 老项目兼容好
cnpm 的问题(现在用得少了)
❌ 非官方
- 和 npm 行为不完全一致
- 有历史兼容坑
❌ node_modules 结构更混乱
- 扁平化 + 软链接
- 某些工具不兼容
👉 企业级项目基本不推荐 cnpm
现在国内更推荐什么?
npm config set registry https://registry.npmmirror.com
👉 用 npm,但换国内镜像
三、pnpm 是什么?(企业级首选)
pnpm(Performance npm)
一个为 大型项目 / 企业工程 设计的包管理器。
pnpm 最核心的设计:内容寻址 + 硬链接
npm 的方式(简化)
node_modules/
vue/
axios/
lodash/
每个项目一套。
pnpm 的方式(核心差异)
~/.pnpm-store/
vue@3.4.0/
axios@1.6.0/
项目里:
node_modules/
vue -> 硬链接
👉 所有项目共享一份依赖
pnpm 带来的直接好处
1️⃣ 安装速度快
- 只下载一次
- 之后秒装
2️⃣ 磁盘占用极低
- 10 个项目 ≠ 10 份依赖
3️⃣ 依赖更严格(非常重要)
pnpm 不允许“偷偷用依赖”:
没在 package.json 里声明?
→ 直接报错
👉 项目依赖更干净,线上风险更低
pnpm 的“严格”带来的副作用
❌ 老项目可能跑不起来
❌ 有些写得不规范的库会暴露问题
但对企业来说,这是 优点,不是缺点。
四、三者核心对比表(工程视角)
| 维度 | npm | cnpm | pnpm |
|---|---|---|---|
| 官方 | ✅ | ❌ | ❌ |
| 国内速度 | ❌ | ✅ | ✅ |
| 安装速度 | 中 | 中 | 快 |
| 磁盘占用 | 高 | 高 | 低 |
| 依赖严格性 | 低 | 低 | 高 |
| 企业推荐 | 一般 | 不推荐 | 强烈推荐 |
| 生态兼容 | 最好 | 一般 | 好 |
五、企业为什么现在“几乎都选 pnpm”?
从工程治理角度看:
1️⃣ 成本问题
- 磁盘
- CI 构建时间
- 网络资源
pnpm 全部更省。
2️⃣ 质量问题
pnpm 强制:
- 依赖必须声明
- 构建行为可预测
👉 减少“开发能跑、线上挂”的情况
3️⃣ 单仓库(Monorepo)友好
pnpm 对:
- 多包项目
- 组件库
- 平台型系统
支持非常好。
六、你在什么情况下用谁?
✅ 学习 / 小项目
npm + 国内镜像
✅ 企业项目 / 中大型工程
pnpm(首选)
❌ 不推荐新项目
cnpm
除非你在维护非常老的项目。
七、一句话终极总结
npm 是“标准”,
pnpm 是“工程化的未来”,
cnpm 是“历史环境下的妥协方案”。