pnpm vs npm

npm 的平铺目录结构

从 npm v3 开始,npm 使用平铺的依赖结构。 这可以减少磁盘空间占用, 但却导致 node_modules 目录的混乱。

另一方面,pnpm 通过使用硬链接和符号链接到全局磁盘内容可寻址存储来管理 node_modules。 这将为您带来减少磁盘空间使用的好处,同时还保持您的 node_modules 是干净的。 如果你希望了解更多信息,可以参考存储布局

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 的文档。