Skip to content
On this page

npm、yarn、pnpm对比

npm

经历两个主要版本:v2 和 v3

v2版本 采用树型依赖关系

缺点:

  • 包经常创建太深的依赖树,这会导致 Windows 上出现长目录路径问题
  • 包在不同的依赖项中需要时被多次复制粘贴

v3版本 采用平铺依赖

优点(相对npm@2)

  • 节省了相同依赖多次复制的空间

缺点

  • 幽灵依赖(模块可以访问它们不依赖的包。比如包A依赖包B,安装包A包B平铺在node_modules的根目录下,然后开发过程中代码可以随意引入包B且不会报错;但是uninstall包A后虽然包B仍存在,由于package.json中没有包B的引用,一旦执行npm i后,包B就会被删除,导致程序异常)
  • 相同依赖不同版本(比如包A依赖包B@1.0包C依赖包B@2.0。平铺逻辑是先判断上层有没有相同依赖,没有则平铺到上层node_modules下;如果有且版本不同则会安装在父依赖包的node_modules下,依赖关系如下:) ├─ node_modules │ ├─ A │ ├─ B@1.0 │ └─ C │ │ └─ node_modules │ │ │ └─ B@2.0
  • 扁平化依赖树的算法非常复杂

yarn

缺点:

  • 与 npm 相同的扁平node_modules结构

pnpm

优点:

  • 硬链接取代复制粘贴(npm 和 yarn都是将包缓存在全局引用的时候再逐个复制粘贴到项目中),节约磁盘空间
  • 仍然采用树形依赖关系,算法简单提高安装速度
  • 没有幽灵依赖

注意

在 pnpm 升级到 v7 可能会出现如下报错

Run "pnpm setup" to create it automatically, or set the global-bin-dir setting, or the PNPM_HOME env variable. The global bin directory should be in the PATH.

通过执行以下命令可解决

source ~/.zshrc