基础知识点讲解:npm、Yarn 和 pnpm 的区别
在 JavaScript 项目中,我们常用 npm 或 Yarn 来安装依赖包(比如 lodash、react 等)。这些依赖包会被放到项目里的 node_modules 文件夹里。
但是,npm 和 Yarn 有一个问题:
如果你有多个项目都用到同一个依赖包,比如 lodash,npm 会在每个项目的
node_modules里都存一份,导致硬盘空间浪费。
而 pnpm 解决了这个问题,让我们来看看它是怎么做到的。
pnpm 如何节省硬盘空间?
1. 共享依赖包,避免重复存储
- npm 和 Yarn: 每个项目都存一份完整的依赖包副本。
- pnpm: 所有项目共用一个中央存储区,依赖包只存一份。
举个例子:
假设你有 100 个项目都用 lodash@4.17.21,
- npm 会存 100 份 lodash,假设 lodash 大小是 5MB,总共占用约 500MB。
- pnpm 只存 1 份 lodash,硬盘只用 5MB,节省了 495MB。
2. 使用硬链接和软链接技术
- 硬链接(hard link) :让多个文件夹“指向”同一个文件,实际上文件只存一份,节省空间。
- 软链接(symbolic link) :类似快捷方式,指向实际文件位置。
pnpm 把依赖包放在统一的存储区,然后用硬链接和软链接把它们“挂载”到每个项目的 node_modules 里。这样,多个项目共享同一份文件,硬盘不会被重复占用。
3. 非扁平化的 node_modules 结构
- npm 和 Yarn 会把所有依赖都“平铺”在
node_modules里,导致项目可以访问到本不属于它的依赖,可能引起版本冲突。 - pnpm 保持依赖层级结构,
node_modules里只放项目真正需要的依赖和一个.pnpm文件夹,避免依赖污染。
4. 安装速度更快
pnpm 通过优化依赖解析和链接过程,安装速度通常比 npm 快 20%-50%。
代码示例:如何用 pnpm 替代 npm
安装 pnpm
npm install -g pnpm
使用 pnpm 安装依赖
假设你的项目有 package.json,用 pnpm 安装依赖:
pnpm install
新建项目并安装 React
mkdir my-app
cd my-app
pnpm init -y
pnpm add react react-dom
查看依赖文件结构
ls node_modules
# 你会看到实际依赖和 .pnpm 文件夹,依赖以硬链接形式存在
总结对比表
| 特点 | npm/Yarn | pnpm |
|---|---|---|
| 依赖存储 | 每个项目存一份完整副本 | 所有项目共享一份,节省空间 |
| 硬盘占用 | 高 | 低 |
| node_modules结构 | 扁平化,可能导致依赖污染 | 非扁平化,依赖隔离更好 |
| 安装速度 | 普通 | 更快(节省20%-50%时间) |
| 依赖管理方式 | 复制依赖 | 硬链接和软链接共享依赖 |
结语
用 pnpm 替代 npm,可以大幅节省硬盘空间,避免重复安装依赖,还能提高安装速度。对于有多个项目的开发者来说,pnpm 是非常值得尝试的包管理工具。
如果你想节省空间、加快安装速度,强烈推荐试试 pnpm!