跳到主要内容
pnpm
文档目录

pnpm vs 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 不会对 file 依赖执行安装。

这意味着,如果你有一个名为 foo<root>/foo)的包,其依赖为 bar@file:../bar,那么对 foo 运行 pnpm install 时,pnpm 不会为 <root>/bar 执行安装。

如果你需要同时在多个包中运行安装,例如在 monorepo 的场景下,可以查看 pnpm -r 的文档。

本页内容译自pnpm 官方文档(MIT License),如有出入以英文原文为准。