pnpm
硬链接和软链接
硬链接
特点: inode 号相同,内容相同,修改其一的内容,影响全部相关的文件内容,删除源文件,硬链仍然有效,但是不允许跨文件系统创建硬链接。文件共享同一地址,有点像 js 的浅拷贝。
pnpm 通过硬链接实现快速安装。
软链接
软链接(soft link)也叫"符号链接(symbolic link) 特点:inode 号不同,但内容是一样,软链接就相当于源文件的快捷方式,删除源文件,软链无效。
pnpm 通过软链接实现非扁平化的依赖结构。
为什么要用 pnpm
- 节省磁盘空间
- 提高安装速度
- 创建一个非扁平的 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
这种方法有两个严重的问题:
- 包经常创建太深的依赖关系树,这会导致 Windows 上的目录路径过长问题。
- 当在不同的依赖项中需要包时,它们被复制粘贴了几次。
而在 npm@3
之后采用的扁平化的 依赖树 存在以下问题。
- 模块可以访问它们不依赖的包
- 扁平化依赖关系树的算法非常复杂
- 某些包必须复制到一个项目的 node_modules 文件夹中
以上问题并没有在 yarn
中得到解决。
与 npm@3 不同,pnpm 尝试解决 npm@2 遇到的问题,而不会扁平化依赖关系树。在 pnpm 创建的 node_modules 文件夹中,所有包都有自己的依赖项组合在一起,但目录树永远不会像 npm@2 那样深。PNPM 保持所有依赖项平坦,但使用符号链接将它们组合在一起。
.pnpm/ 文件夹的用途。 .pnpm/ 以平铺的形式储存着所有的包,所以每个包都可以在这种命名模式的文件夹中被找到。
txt
.pnpm/<name>@<version>/node_modules/<name>
参考文章: