npm、pnpm、yarn三者之间的区别?

283 阅读4分钟

npm介绍

npm是Node默认的包管理工具,可以根据项目中的package.json文件自动解析和安装项目依赖。主要的步骤是:

  1. 读取package.json文件,构建依赖树
  2. 判断当前包是否有缓存判断是否过期(304判断),没过期则使用缓存
  3. 如果过期则通过config的源下载对应的tar包并解压到本地缓存目录下
  4. 将依赖从缓存中拷贝到项目下的node_modules目录下

pnpm介绍

pnpm解决以上问题的方案是使用硬连接。使用pnpm时,在同一个系统中所有相同的包是会被下载一次。各个项目在安装依赖时,会通过硬连接的方式连接到本机上的pnpm的store目录中。也就是说,项目中的node_modules下不再是真实的文件,而是硬连接。这样的好处显而易见,使用硬连接代替拷贝操作省去了I/O操作,同时节省了空间。

yarn介绍

yarn出现时解决了上面的问题,通过使用yarn.lock文件确定最终依赖结构的稳定性。后来的版本中npm也采用了package-lock.json来确保这种稳定性。在lock文件中记录了每个依赖包的精确版本以及目录结构,从而减少由于包版本不一致导致的bug。

除此之外,yarn优化了缓存的利用和网络请求。如果缓存中下载过同样的包,yarn可以直接从缓存中拷贝到项目目录下,而无需通过网络下载。即使通过网络下载时,yarn的fetch队列能够更充分地利用网络资源,并且有着自动的超时重试机制,不会因为某个包无法获取而导致整个安装卡死。

但是无论是yarn还是npm都无法解决这些问题:

  1. 扁平化算法过于复杂,耗时较长
  2. 扁平化结构带来的非法访问
  3. 将包从缓存拷贝到目录下的过程有大量I/O操作,耗费时间且每个项目都会占据一份空间

npm 、pnpm、yarn区别?

npm、pnpm和yarn都是用于管理JavaScript包依赖的工具,它们在功能和性能上有一些区别。下面是它们之间的主要区别:

  1. npm(Node Package Manager)是Node.js的默认软件包管理器。它是一个命令行工具,用于下载、安装和管理应用程序的依赖项。npm拥有庞大的包生态系统,使得可以通过npm获得广泛的开源包。

  2. yarn是由Facebook开发的另一个包管理器,旨在改善npm的性能和稳定性。它采用并行下载和缓存,可以更快地安装依赖项,并且在网络不稳定的条件下更具可靠性。此外,yarn引入了yarn.lock文件来确保团队中的所有开发者都使用相同版本的依赖项。

  3. yarn出现解决了npm的痛点:

    • 痛点1:npm install会进行顺序安装package.json的包,yarn采用了并行安装,大大提升了安装速度。
    • 痛点2:npm每次安装都要重新安装,yarn采用了缓存的方式,同样内容不会重复安装。
    • 痛点3: npm之前没有使用lock.json,安装版本混乱,后面npm更新汲取了yarn的lock优点
  4. pnpm是另一种包管理工具,与npm和yarn类似。与npm和yarn不同,pnpm采用了一种称为"优势硬链接"的方式来共享依赖项,这意味着对于多个项目,它们可以共享相同的依赖项,从而节省磁盘空间。pnpm还通过并发下载和安装操作来提高性能。

pnpm的优点:

  • 节省磁盘空间

  • 速度快

  • 支持Node.js最新版本

  • 安全性

    • pnpm采用的方式是依赖分割 npm安装一个指定依赖包express的node_module目录

总的来说,这些包管理工具的目标都是简化依赖项管理的过程,但它们在性能、缓存策略和依赖项的版本控制等方面有所不同。选择使用哪个工具取决于个人或项目的需求和偏好。通常来说,如果你对性能有较高要求并且希望享受更快的安装速度,可以考虑使用yarn或pnpm。如果你想使用广泛的包生态系统并且追求与npm的兼容性,那么npm可能是一个不错的选择。