说说你对 pnpm 的了解
参考答案:
pnpm 的官方文档是这样说的:
Fast, disk space efficient package manager
pnpm 本质上就是一个包管理器,这一点跟 npm/yarn 没有区别,但它作为杀手锏的两个优势在于:
- 包安装速度极快;
- 磁盘空间利用非常高效。
pnpm 与 npm/yarn 相似,也是一个包管理器,但与他们不同的是,作者设计了一套理论上更完善的依赖结构以及高效的文件复用,来解决 npm/yarn 未打算解决或还不够完善的问题。
嵌套 + 扁平 + pnpm-lock.yaml
打开通过 pnpm 安装的项目 node_modules 文件夹,你会发现几乎只会有当前 package.json 中所声明的各个依赖(的软连接),而 "真正" 的模块文件,存在于 node_modules/.pnpm,由 模块名@版本号 形式的文件夹扁平化存储(解决依赖重复安装)。
这样的设计,很好的避免了项目中 跨声明访问 的问题,因为当前项目 node_modules 只有声明的依赖可以访问。
而 pnpm-lock.yaml 文件如同 yarn.lock、package-lock.json 一样,可以为项目提供一份各个依赖稳定的版本信息。
硬链接与更高效的复用
与 yarn 的 PnP模式 效果类似,为了提升文件存储效率以及降低文件IO开销,node_modules/.pnpm 中存储的文件其实是 pnpm 实际缓存文件的 硬链接,从而避免了多个项目带来多份相同文件引起的空间浪费问题。
pnpm 还额外的使用了 内容寻址的文件系统 来存储依赖文件。当遇到两个版本的 a模块 依赖,但两个版本之前只有一个文件存在差异时,pnpm 只会新增一个差异文件,最大化的提升文件存储效率。
题目要点:
pnpm 是一个快速且节省磁盘空间的包管理器,它在设计上旨在解决 npm 和 yarn 的一些局限性。
- 快速包安装:pnpm 设计了一套更高效的依赖结构,使得包的安装速度极快。
- 节省磁盘空间:通过使用硬链接和内容寻址的文件系统,pnpm 能够更高效地利用磁盘空间,避免重复安装相同的依赖文件。
- 依赖结构:pnpm 的依赖结构包括嵌套、扁平和 pnpm-lock.yaml 文件。嵌套指的是依赖之间的层级关系,扁平指的是依赖文件在磁盘上的存储方式,而 pnpm-lock.yaml 文件则类似于 yarn.lock 或 package-lock.json,用于锁定依赖版本。
- 硬链接与复用:pnpm 使用硬链接来指向缓存文件的实际内容,这减少了文件系统的 IO 开销,并且提高了文件存储效率。
- 内容寻址的文件系统:当遇到两个版本的依赖模块只有一个文件存在差异时,pnpm 只存储差异文件,而不是整个文件,从而进一步节省空间。
pnpm 的这些设计优化使其在处理大型项目和依赖管理时,相比 npm 和 yarn 具有明显的性能和存储优势。