Skip to content

pnpm

硬链接和软链接

硬链接

特点: inode 号相同,内容相同,修改其一的内容,影响全部相关的文件内容,删除源文件,硬链仍然有效,但是不允许跨文件系统创建硬链接。文件共享同一地址,有点像 js 的浅拷贝。

pnpm 通过硬链接实现快速安装。

软链接

软链接(soft link)也叫"符号链接(symbolic link) 特点:inode 号不同,但内容是一样,软链接就相当于源文件的快捷方式,删除源文件,软链无效。

pnpm 通过软链接实现非扁平化的依赖结构。

为什么要用 pnpm

  1. 节省磁盘空间
  2. 提高安装速度
  3. 创建一个非扁平的 node_modules 目录

现在的包管理在依赖处理上存在的问题许多问题。

npm@3 之前,node_modules 结构是可预测且干净的,因为 node_modules 中的每个依赖项都有自己的 node_modules 文件夹,其所有依赖项都在 package.json 中指定。

txt
node_modules
└─ foo
   ├─ index.js
   ├─ package.json
   └─ node_modules
      └─ bar
         ├─ index.js
         └─ package.json

这种方法有两个严重的问题:

  1. 包经常创建太深的依赖关系树,这会导致 Windows 上的目录路径过长问题。
  2. 当在不同的依赖项中需要包时,它们被复制粘贴了几次。

而在 npm@3之后采用的扁平化的 依赖树 存在以下问题。

  1. 模块可以访问它们不依赖的包
  2. 扁平化依赖关系树的算法非常复杂
  3. 某些包必须复制到一个项目的 node_modules 文件夹中

以上问题并没有在 yarn 中得到解决。

与 npm@3 不同,pnpm 尝试解决 npm@2 遇到的问题,而不会扁平化依赖关系树。在 pnpm 创建的 node_modules 文件夹中,所有包都有自己的依赖项组合在一起,但目录树永远不会像 npm@2 那样深。PNPM 保持所有依赖项平坦,但使用符号链接将它们组合在一起。

.pnpm/ 文件夹的用途。 .pnpm/ 以平铺的形式储存着所有的包,所以每个包都可以在这种命名模式的文件夹中被找到。

txt
.pnpm/<name>@<version>/node_modules/<name>

参考文章:

  1. Why should we use pnpm?