跳到主要内容
版本:Next

设计动机

节省磁盘空间

pnpm 内容寻址存储的示意图。图中展示了两个带有 node_modules 的项目。node_modules 目录中的文件是内容寻址存储中相同文件的硬链接。

使用 npm 时,如果你有 100 个项目使用同一个依赖,那么这个依赖在磁盘上就会有 100 个副本。而使用 pnpm 时,依赖会存储在内容寻址存储中,所以:

  1. 如果你依赖某个包的不同版本,只有发生变化的文件才会被添加到存储中。例如,如果一个包有100个文件,而新版本只改变了其中一个文件,pnpm update 只会向存储中添加1个新文件,而不是仅仅为了一个改动就克隆整个依赖。
  2. 所有文件都保存在磁盘上的单一位置。当安装包时,它们的文件会从这个单一位置进行硬链接,不会消耗额外的磁盘空间。这使你可以在多个项目之间共享相同版本的依赖。

因此,你可以节省大量的磁盘空间,节省的空间与项目数量和依赖数量成正比,并且安装速度也会快得多!

提升安装速度

pnpm 通过三个阶段执行安装:

  1. 依赖解析。识别所有需要的依赖并将其获取到存储中。
  2. 目录结构计算。根据依赖关系计算 node_modules 目录结构。
  3. 链接依赖。所有剩余的依赖都从存储中获取并硬链接到 node_modules 中。

An illustration of the pnpm install process. Packages are resolved, fetched, and hard linked as soon as possible.

这种方法比传统的三阶段安装过程(解析、获取和将所有依赖写入 node_modules)要快得多。

其他包管理器(如 Yarn Classic 或 npm)安装依赖的过程示意图。

创建非扁平的 node_modules 目录

当使用 npm 或 Yarn Classic 安装依赖时,所有包都会被提升到模块目录的根目录。这导致源代码可以访问那些未被添加为项目依赖的包。

默认情况下,pnpm 使用符号链接,只将项目的直接依赖添加到模块目录的根目录中。

pnpm 创建的 node_modules 目录示意图。根 node_modules 中的包是指向 node_modules/.pnpm 目录内目录的符号链接

如果你想了解更多关于 pnpm 创建的独特 node_modules 结构以及为什么它能很好地与 Node.js 生态系统配合的详细信息,请阅读:

提示

如果你的工具不能很好地处理符号链接,你仍然可以使用 pnpm,只需将 nodeLinker 设置为 hoisted。这将指示 pnpm 创建一个类似于 npm 和 Yarn Classic 所创建的 node_modules 目录。