跳至主要内容
版本: 9.x

pnpm 与 npm

npm 的扁平树

从版本 3 开始,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 命令 实现不允许你指定要修剪的包 - 它总是删除所有多余的和遗弃的包。

目录依赖项

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

这意味着,如果你有一个名为 `foo`(`/foo`)的包,它将 `bar@file:../bar` 作为依赖项,那么当你对 `foo` 运行 `pnpm install` 时,pnpm 不会对 `/bar` 执行安装。

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