Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pnpm install 和 npm install 有何区别 #889

Open
yanlele opened this issue Sep 17, 2024 · 0 comments
Open

pnpm install 和 npm install 有何区别 #889

yanlele opened this issue Sep 17, 2024 · 0 comments
Labels
工程化 web 项目工程化 阿里巴巴 公司标签
Milestone

Comments

@yanlele
Copy link
Member

yanlele commented Sep 17, 2024

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

@yanlele yanlele added 工程化 web 项目工程化 阿里巴巴 公司标签 labels Sep 17, 2024
@yanlele yanlele added this to the milestone Sep 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
工程化 web 项目工程化 阿里巴巴 公司标签
Projects
None yet
Development

No branches or pull requests

1 participant