设计动机
节省磁盘空间
使用 npm 时,如果你有 100 个项目使用同一个依赖,那么这个依赖在磁盘上就会有 100 个副本。而使用 pnpm 时,依赖会存储在内容寻址存储中,所以:
- 如果你依赖某个包的不同版本,只有发生变化的文件才会被添加到存储中。例如,如果一个包有100个文件,而新版本只改变了其中一个文件,
pnpm update
只会向存储中添加1个新文件,而不是仅仅为了一个改动就克隆整个依赖。 - 所有文件都保存在磁盘上的单一位置。当安装包时,它们的文件会从这个单一位置进行硬链接,不会消耗额外的磁盘空间。这使你可以在多个项目之间共享相同版本的依赖。
因此,你可以节省大量的磁盘空间,节省的空间与项目数量和依赖数量成正比,并且安装速度也会快得多!
提升安装速度
pnpm 通过三个阶段执行安装:
- 依赖解析。识别所有需要的依赖并将其获取到存储中。
- 目录结构计算。根据依赖关系计算
node_modules
目录结构。 - 链接依赖。所有剩余的依赖都从存储中获取并硬链接到
node_modules
中。
这种方法比传统的三阶段安装过程(解析、获取和将所有依赖写入 node_modules
)要快得多。
创建非扁平的 node_modules 目录
当使用 npm 或 Yarn Classic 安装依赖时,所有包都会被提升到模块目录的根目录。这导致源代码可以访问那些未被添加为项目依赖的包。
默认情况下,pnpm 使用符号链接,只将项目的直接依赖添加到模块目录的根目录中。
如果你想了解更多关于 pnpm 创建的独特 node_modules
结构以及为什么它能很好地与 Node.js 生态系统配合的详细信息,请阅读:
提示
如果你的工具不能很好地处理符号链接,你仍然可以使用 pnpm,只需将 nodeLinker 设置为 hoisted
。这将指示 pnpm 创建一个类似于 npm 和 Yarn Classic 所创建的 node_modules 目录。