项目初衷

节约磁盘空间并提升安装速度

项目初衷 - 图1

使用 npm 时,依赖每次被不同的项目使用,都会重复安装一次。 而在使用 pnpm 时,依赖会被存储在内容可寻址的存储中,所以:

  1. 如果你用到了某依赖项的不同版本,只会将不同版本间有差异的文件添加到仓库。 例如,如果某个包有100个文件,而它的新版本只改变了其中1个文件。那么 pnpm update 时只会向存储中心额外添加1个新文件,而不会因为仅仅一个文件的改变复制整新版本包的内容。
  2. 所有文件都会存储在硬盘上的某一位置。 当软件包被被安装时,包里的文件会硬链接到这一位置,而不会占用额外的磁盘空间。 这允许你跨项目地共享同一版本的依赖。

因此,您在磁盘上节省了大量空间,这与项目和依赖项的数量成正比,并且安装速度要快得多!

创建非扁平化的 node_modules 文件夹

项目初衷 - 图2

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

默认情况下,pnpm 使用软链的方式将项目的直接依赖添加进模块文件夹的根目录。 如果你想了解 pnpm 关于 node_modules 结构设计的更多细节,以及为什么它在 Node.js 生态成为了后起之秀,请参考:

项目初衷 - 图3提示

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