Appearance
包管理器
npm、yarn、pnpm 的区别?
- Pnpm:依赖安装快,使用硬链接和符号链接优化存储,防止依赖混乱。
- Npm:传统依赖管理,存在依赖扁平化问题。
- Yarn:快速安装依赖,缓存机制优秀,但依赖树仍可能混乱。
什么是幻影依赖?
在项目中可以使用没有安装声明的包,这就是幻影依赖。
会造成的问题:
- 版本的问题
例如
element-plus
中安装了lodash
,在我们项目中lodash
也会被一起安装,有一天element-plus
的依赖的lodash
升级了,就会导致我们项目使用的lodash
和element-plus
中安装了lodash
的版本不一致。
- 依赖丢失问题
如果这个
lodash
在第三方包中是安装的开发依赖,如果自己项目使用到生产环境打包,这个lodash
就找不到了。
pnpm 是如何解决幻影依赖的?
pnpm 建立了一个 store 仓库(node_modules/.pnpm)来存放拍平后的各种依赖,而项目中 node_modules 的依赖,是采用树结构,不会将它们拍平(npm、yarn会拍平,就会产生幻影依赖),然后第三方包借助的子包,通过软链接的方式去链接到 node_modules/.pnpm。
pnpm 包管理方式
项目依赖的第三方包,会在 node_modules 目录下,通过软链接,链接到 node_modules/.pnpm 目录下具体的包,下面的包通过硬链接链接到磁盘的 store 仓库中,每次安装都是安装在 store 中的。
软链接 和 硬链接
- 软链接:例如 B -> A -> 内存地址,A删除后,B就无效了
- 硬链接:例如 A -> 内存地址,B -> 内存地址,AB都指向同一个地址,AB相互独立
pnpm 优势
- 速度快
- 更节省磁盘空间
- 扁平化依赖
- 减少了幽灵依赖