npm与pnpm--为什么推荐pnpm
包管理器中 npm是最经典的,但大家都任意忽略一个更优质的管理器:pnpm
1. 核心区别
特性 | npm | pnpm |
---|---|---|
依赖存储方式 | 扁平化结构(可能重复依赖) | 硬链接 + 符号链接(共享依赖,节省空间) |
安装速度 | 较慢(尤其是大型项目) | 更快(依赖复用,避免重复下载) |
磁盘空间 | 占用较多(相同依赖可能多次存储) | 占用极少(共享同一份依赖文件) |
依赖管理严格性 | 较松散(可能引发“幽灵依赖”) | 严格(仅允许访问声明的依赖) |
安全性 | 一般 | 更高(依赖隔离性更好) |
2. 原理通俗解释
-
npm:
-
把依赖包全部下载到项目的
node_modules
,如果多个包依赖同一个库(如lodash
),可能会重复存储多份。 -
例如:A 包依赖
lodash@4.17
,B 包也依赖lodash@4.17
→ npm 会分别安装两次,占用双倍空间。
-
-
pnpm:
-
在电脑全局创建一个共享存储仓库,所有项目共享同一份依赖文件。
-
通过硬链接(文件指针)指向存储仓库中的文件,避免重复下载。
-
例如:A 包和 B 包都依赖
lodash@4.17
→ pnpm 只下载一次,两个项目共享同一份文件。
-
3. 使用场景
工具 | 适用场景 |
---|---|
npm | - 传统项目或对兼容性要求高的场景 - 依赖某些仅支持 npm 的工作流或工具 |
pnpm | - 追求安装速度和节省磁盘空间 - 大型项目(如 monorepo) - 需要严格依赖隔离 |
4. 迁移成本
-
从 npm 迁移到 pnpm 通常是无缝的,只需删除
node_modules
和package-lock.json
,然后运行pnpm install
。 -
少数情况需注意:
-
项目依赖了“幽灵依赖”(未在
package.json
声明但被直接引用)。 -
某些工具链(如旧版
react-scripts
)可能需要调整配置。
-
5,快速命令对比
功能 | npm 命令 | pnpm 命令 |
---|---|---|
安装生产依赖 | npm install <包名> | pnpm add <包名> |
安装开发依赖 | npm install <包名> -D | pnpm add <包名> -D |
全局安装 | npm install -g <包名> | pnpm add -g <包名> |
删除依赖 | npm uninstall <包名> | pnpm remove <包名> |
可以看见 pnpm和npm几乎一样的 0成本搬迁