npm yarn cnpm pnpm区别

91 阅读4分钟
  1. npm 是随同nodeJS一起安装的js包管理工具
  2. yarn 是由facebook、google等公司推出的js包管理工具,默认使用的是npm的registry(即npm包的下载地址)。之所以要推出yarn是因为要解决npm之前存在的问题
  • 依赖目录嵌套太深:过去,npm的依赖是嵌套的,在windows系统上是一个极大的问题,因为Windows系统目录最多支持255个字符。
  • 下载速度慢:
    • 由于嵌套层次问题,所以npm对包的下载只能是串行的,即前一个包下载完后才会下载下一个包,带宽资源没有完全利用
    • 多个相同版本的包被重复下载
  •   如:工程中依赖A包和B包,A依赖C包并且B也依赖C包,C包又依赖D包,项目的node_modules会像下图一样:会有重复的C和D包
    

image.png

  • 控制台输出繁杂:过去,npm安装包的时候,每安装一个依赖就会输出依赖的详细信息,导致一次安装有大量的信息输出到控制台,遇到错误极难查看
  • 工程移植问题:之前没有package-lock.json文件,npm的版本依赖模糊,可能会导致工程移植后,依赖的确切版本不一致。

yarn解决了npm之前存在的问题:

  • 使用扁平的目录结构,避免层次过深
  • 并行下载,提升速度。只要确定好依赖结构,可以同时下载多个包。 如:工程中依赖A包和B包,A依赖C包并且B也依赖C包,项目的node_modules会像下图一样扁平无重复的包:

image.png

  • 使用本地缓存,提升速度。
  • 控制台仅输出关键信息
  • 使用yarn-lock.json文件记录确切依赖

yarn的出现给npm带来了很大压力,随后npm就学习yarn的先进理念进行优化,npm6版本几乎解决了上述存在的问题。

  • 目录扁平化
  • 并行下载
  • 本地缓存
  • 简化了控制台输出
  • 使用package-lock.json记录确切依赖
  1. cnpm 为了解决国内用户连接npm registry缓慢的问题,淘宝搭建了自己的registry,即淘宝npm镜像源。 因为之前npm没有设置registry的功能,所以淘宝提供了CLI工具就是cnpm,支持除了npm publish外所有命令,只不过。如今npm已经支持修改registry,所以几乎和npm无差别。

  2. pnpm是一种新的包管理器,相比于npm、yarn有一些特有的优势

  • 目前,安装效率高于npm和yarn的最新版
  • 极其简洁的node-modules目录
  • 避免了开发时使用间接依赖的问题
  • 极大的降低磁盘空间的占用

原理如下:

  • 同yarn和新版的npm一样,pnpm仍然使用缓存来保存已经安装过的包,以及使用pnpm-lock.yaml来记录详细的依赖版本。
  • 不同于yarn和npm,pnpm使用符号链接和硬链接(可以暂且理解为快捷方式)的做法来放置依赖,从而规避了从缓存中复制文件到node-modules的时间(yarn和npm虽然有缓存,但是安装时是将缓存复制到项目中的node-modules中的),使得安装和卸载的速度更快(只需要删除或者创建类似于快捷方式的文件,该文件指向缓存的包)。
  • 由于使用了符号链接和硬链接,pnpm可以规避windows操作系统路径过长的问题,因此,他选择使用树形的依赖结果,有着几乎完美的依赖管理,也因为如此,项目中只能使用直接依赖,而不能使用间接依赖。

问题:
考虑如下场景,使用yarn或者新版的npm安装A,得到的node-modules如下所示:
image.png

那么理论上可以通过如下代码使用C包,但是C包我没有直接安装而是因为安装了A包并且因为包管理器扁平的管理方式可以使用c包。

require("C")

如果我们依赖的第三方包出现了上述的情况,而我们的项目使用了pnpm开发,会有如下问题:

image.png

因为你使用pnpm安装时,也是使用pnpm处理你依赖包的node-modules,所以可能有上述问题,所以现在很多包也在修正之前不规范的代码。