yarn vs npm?

如今欣欣向荣的前端圈可谓是百家争鸣,连包管理器都搞出两个来了,当然啦,我们不必每个都学,只需要选你喜欢的一个使用就行啦~

本文进行对比的是yarn0.27.5版本和npm5.3.0版本,都是截止本文写作日期最新的稳定版本了。首先通过create-react-app的依赖下载测试二者的首次下载,二次下载以及离线下载的速度,然后给出二者的常用命令。

yarn

首先我们下载最新版本的yarn 和npm。

1
2
3
4
5
6
7
// if you have installed npm
npm install npm -g

// get yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn

然后我们下载create-react-app,并创建一个demo项目,创建的时候它会自动给你下载依赖,为了强行测试,我们就删掉node_modules文件夹和yarn.lock文件,前者放置了所有下载的包,后者保存了所有单个包的版本要求,实际下载版本,下载地址以及依赖的版本要求。稍后我们在详细说明其重要性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
npm install create-react-app

create-react-app demo
cd demo/
rm -rf node_modules && rm yarn.lock

// first time install
yarn install

// remove modules
rm -rf node_modules

// second time install
yarn install

// remove modules and yarn.lock
rm -rf node_modules && rm yarn.lock

// third time instalk
yarn install

三次下载测试的结果依次是12.35s, 5.54s, 13.40s。可以粗略的得出两个结论:

  • 二次下载的时间年大概是第一次的一般左右。
  • yarn.lock是加速下载的关键。

我们再来试一下离线下载,实际上如果你可以通过缓存达到离线下载的效果,但是,当我们要保持缓存清洁,同一个库只存在一个版本,那么当你要更新版本的时候,你就要做两件事:

  • yarn remove package
  • yarn cache clean && yarn add new-package

如果使用offline mode,为每一个项目都准备一个缓存目录,存放当前的所有包的压缩包。具体步骤如下:

1
2
3
4
5
6
cd PROJECT_DIR
yarn config set yarn-offline-mirror ./npm-packages-offline-cache
mv ~/.yarnrc ./

rm -rf node_modules && yarn.lock
yarn install

然后我们就可以看到在项目目录里的npm-packages-offline-cache目录就会有所有项目依赖的压缩包。

我们甚至可以将这个目录commit到git。让所有的项目成员都使用同一个版本的依并且节约时间。

npm

之前一直都是在用npm,写完这篇文章之后,我决定以后选择yarn,至于为什么看到最后就知道了。

我们用npm做同样的测试,首先是首次下载时间:

1
2
3
4
5
6
7
// first time install
rm -rf node_modules && rm -rf yarn.lock
npm install

// second time install
rm -rf node_modules
npm install

两次的下载时间分别是168s,12s。第一次下载这么长是因为我删除了缓存,但是可以猜测正常下载时间应该是第二次下载的两倍左右。 

command cheatsheet

经过上面的时间比较之后,我基本打算从npm迁移到yarn,所以最后,我们来总结一下yarn和npm的常用命令。

两者不太一样的命令

  • yarn == npm install 下载所有依赖。
  • yarn add package == npm install package@latest --save添加一个项目依赖包。
  • yarn add package --save-dev == npm install package --save-dev添加一个开发依赖包。
  • yarn remove package == npm uninstall package --save 移除一个项目依赖包。
  • yarn gloabl add package == npm install -g package下载一个全局包

两者一样的命令

npm init/link/publish/test/login/cache clean == yarn init/link/publish/test/login/cache clean

yarn有npm没有的命令

  • yarn why package 为什么这个依赖会被安装,实际上也就是看看哪些包依赖于它。
  • yarn upgrade-interactive 交互式的更新包。
  • 超快的下载速度。
  • 自动保存依赖版本和依赖。
  • 支持emoji表情。

总结

我选择yarn的最重要的原因是下载速度,其次是命令的简便性,当然用alias绑定简写之后这并不是个优势。本篇的目的不是贬低npm,而是希望两者都能互相学习,互相竞争,让javascript的包管理更加轻松愉快!

感谢阅读~

有钱的捧个钱场,没钱的捧个人场