Skip to content

包管理器

npm、yarn、pnpm 的区别?

  • Pnpm:依赖安装快,使用硬链接和符号链接优化存储,防止依赖混乱。
  • Npm:传统依赖管理,存在依赖扁平化问题。
  • Yarn:快速安装依赖,缓存机制优秀,但依赖树仍可能混乱。

什么是幻影依赖?

在项目中可以使用没有安装声明的包,这就是幻影依赖。

会造成的问题:

  • 版本的问题

例如 element-plus 中安装了 lodash,在我们项目中 lodash 也会被一起安装,有一天 element-plus 的依赖的 lodash 升级了,就会导致我们项目使用的 lodashelement-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 优势

  • 速度快
  • 更节省磁盘空间
  • 扁平化依赖
  • 减少了幽灵依赖