pnpm vs npm

npm 的扁平树

从 npm v3 开始,npm 维护了一个扁平依赖树 这导致磁盘空间减少, 并且node_modules 目录是混乱的。

另一方面,pnpm 通过使用硬链接和符号链接链接到全局硬盘来管理node_modules。 这将使你的磁盘空间使用量大大减少,同时保持node_modules 的整洁。 如果你希望了解更多信息,可以参考store layout

pnpm 正确的 node_modules 结构的好处在于,它”有助于避免愚蠢的错误“,因为它让你无法使用不是 package.json 中指定的模块。

安装

pnpm 不允许安装 package.json 中没有包含的包。 如果没有参数传递给 pnpm add,包将保存为常规依赖项。 与 npm 一样, --save-dev--save-optional 可以是用于安装包作为开发或可选的依赖。

由于此限制,项目在使用 pnpm 时不会有任何无关的包,除非它们删除依赖项并将其保留为孤立的。 这就是为什么 pnpm 的实现的 prune command 不允许你指定包来修剪 - 它总是去除所有多余的和孤儿包。

目录依赖

目录依赖以 file: 前缀开始,指向文件系统的目录。 与 npm 一样,pnpm 符号链接这些依赖项。 与 npm 不同的是,pnpm 不执行这些文件依赖项的安装。

这意味着如果您有一个名为 foo (<root>/foo) 的包,它有 bar@file:../bar 作为依赖项,则当你在 foo 上执行 pnpm install 时, pnpm 将不会为 <root>/bar 安装。

如果您需要同时在多个包中运行安装,例如在 monorepo 的情况下,您应该查看 pnpm -r 的文档。