动机
节省磁盘空间
当使用 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 并将 node-linker 设置为 hoisted
。这将指示 pnpm 创建一个与 npm 和 Yarn Classic 创建的类似的 node_modules 目录。