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

动机

节省磁盘空间

An illustration of the pnpm content-addressable store. On the illustration there are two projects with node_modules. The files in the node_modules directories are hard links to the same files in the content-addressable store.

当使用 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 的三阶段安装过程快得多。

An illustration of how package managers like Yarn Classic or npm install dependencies.

创建非扁平化的 node_modules 目录

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

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

An illustration of a node_modules directory created by pnpm. Packages in the root node_modules are symlinks to directories inside the node_modules/.pnpm directory

如果您想详细了解 pnpm 创建的独特 node_modules 结构以及它为何能与 Node.js 生态系统良好配合,请阅读

提示

如果您的工具无法很好地使用符号链接,您仍然可以使用 pnpm 并将 node-linker 设置为 hoisted。这将指示 pnpm 创建一个与 npm 和 Yarn Classic 创建的类似的 node_modules 目录。