npm yarn pnpm 对比

  • 安装速度快

npm 是按照队列依次安装每个 package,当前一个 package 安装完成之后,才能继续后面的安装。而 Yarn 是同步执行所有任务。

而且,如果一个 package 之前已经安装过,yarn 会直接从缓存中获取,而不是重新下载。

  • 统一包版本

yarn 还创新性的新增了 yarn.lock 文件,它是 yarn 在安装依赖包时,自动生成的一个文件,作用是记录 yarn 安装的每个 package 的版本,保证之后 install 时的版本一致。

不过随着后来 npm 也新增了作用相同的 package-lock.json,这个优势已经不太明显。

  • 节省磁盘空间

我们知道,包的安装方法是从服务器上下载到本地,写入到 node_modules 文件夹,而每个包又有自己的 依赖,也会有 node_modules 文件夹,所以当一个 package 在不同的依赖项中需要时,它会被多次复制粘贴并生成多份文件,形成一个很深的依赖树。

而 yarn 会将相同的依赖提升到最顶层,而不是每个包下都存在一个相同的副本。

yarn 和 npm 还存在两个明显的问题:

  1. 如果一个包卸载,那么他相关的依赖也会被卸载(没有在项目中 package.json 中声明的),这就有可能卸载项目中还在使用过的包。

  2. 当一个包有多个版本的时候,只会提升一个,其余版本的包还会存在重复安装的情况。

pnpm

内部使用基于内容寻址的文件系统来存储磁盘上所有的文件

同一个包只会安装一次,磁盘中只有一个地方写入,后面再次使用都会直接使 hardlink。即使一个包的不同版本,pnpm 也会极大程度地复用之前版本的代码。举个例子,比如 lodash 有 100 个文件,更新版本之后多了一个文件,那么磁盘当中并不会重新写入 101 个文件,而是保留原来的 100 个文件的 hardlink,仅仅写入那一个新增的文件。

贡献者: huxiguo