pnpm install
和 npm install
都是用于安装 JavaScript 项目依赖的命令,但它们背后的包管理器(分别是 pnpm
和 npm
)在处理依赖安装、存储和优化方面有一些关键区别。
1. 存储方式的区别
-
npm:在每个项目的
node_modules
文件夹中分别存储其依赖。这意味着如果你有多个项目,它们共享相同的依赖库,这些依赖库的多个副本将在你的文件系统中的每个项目内分别存储。这样做会占用更多的磁盘空间。 -
pnpm:采用一种称为内容寻址文件系统的方式来存储依赖。所有项目的依赖被存储在一个共享的位置,各个项目中的
node_modules
目录通过硬链接(hard links)或符号链接(symlinks)指向这个共享位置。该方法有效地减少了磁盘空间的占用,并加快了依赖的安装速度。
2. 性能与速度
-
pnpm:由于对依赖进行了有效的复用,并且使用硬链接来减少磁盘上的副本数量,通常可以提供比
npm
更快的安装速度。 -
npm:近几个大版本中也进行了许多性能改进,但在多个项目中共享相同依赖时,它可能仍然比
pnpm
更慢,尤其是在首次安装依赖时。
3. 依赖平面结构 vs. 嵌套结构
-
npm:自版本 3 以后,默认创建扁平的
node_modules
结构(尽可能),这样做是为了避免 Windows 系统中路径过长的问题。但在必要时,npm
仍然会创建嵌套的node_modules
目录结构,以解决依赖冲突。 -
pnpm:通过使用符号链接,
pnpm
维护了一个严格的嵌套依赖结构,更接近每个包的package.json
文件所声明的依赖树形态。这提供了更高的一致性和在某些情况下更好的包隔离性。
4. 依赖隔离与安全性
-
pnpm:更好地隔离了依赖,每个包只能访问其在
package.json
中声明的依赖。这一特性增强了项目的安全性,因为它阻止了未声明的依赖被意外引入的情况。 -
npm:虽然
npm
也遵循package.json
中的声明,但其扁平化的node_modules
结构有时可能会容易地让包访问到未明确声明的依赖。
5. 命令行界面(CLI)和配置
- 这两个工具的命令行界面(CLI)和配置都非常直观且类似,但它们的某些命令和选项可能会有细微差别。
pnpm
为了优化性能和安全性引入了一些特有的命令和配置选项。
总的来说,pnpm
在多项目管理、磁盘空间和安装速度方面提供了优于 npm
的性能和利益。对于新项目或在寻求性能优化的既存项目,考虑试用 pnpm
可能是个不错的选择。