pnpm install 和 npm install 有何区别

pnpm installnpm install 都是用于安装 JavaScript 项目依赖的命令,但它们背后的包管理器(分别是 pnpmnpm)在处理依赖安装、存储和优化方面有一些关键区别。

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 可能是个不错的选择。