hiroaki's blog

技術系を中心に気になったこととかいろいろと。

Yarnがどのくらい速いのか実際に使ってみた

Yarnとは

Facebookが公開したパッケージマネージャー。 npmと同じようにパッケージを管理できる。
yarnでもpackage.jsonをそのまま使用可能なため、既存のプロジェクトにも導入が可能。

詳細な機能は公式サイトを参照。
Yarn 公式サイト

インストール

Homebrew を使っていれば下記のコマンドだけでインストールが完了。

$ brew update
$ brew install yarn

どのくらい速いのか

下記のpackage.jsonで試してみた。

{
  "name": "sample",
  "version": "1.0.0",
  "description": "default template for development.",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Hiroaki Imai",
  "license": "",
  "dependencies": {
    "jquery": "^3.0.0"
  },
  "devDependencies": {
    "babel": "^6.5.2",
    "babel-core": "^6.10.4",
    "babel-polyfill": "^6.9.1",
    "babel-preset-es2015": "^6.9.0",
    "babel-preset-stage-0": "^6.5.0",
    "babelify": "^7.3.0",
    "browserify": "^13.0.1",
    "gulp": "^3.9.1",
    "gulp-load-plugins": "^1.2.4",
    "gulp-plumber": "^1.1.0",
    "gulp-sass": "^2.3.2",
    "gulp-util": "^3.0.7",
    "html-browserify": "0.0.6",
    "lodash.assign": "^4.0.9",
    "vinyl-source-stream": "^1.1.0",
    "watchify": "^3.7.0"
  }
}

使用したnpmのバージョンは下記の通り。

$ npm -v
3.10.8

npmとyarnとでどのくらい差があるかを試してみた。 まずは通常のnpmの場合。キャッシュをクリアしてインストール。

$ npm cache clean
$ time npm i
npm i 45.52s user 11.52s system 39% cpu 2:23.88 total

キャッシュが効いた状態で再度実行。

$ time npm i
npm i 41.34s user 10.01s system 49% cpu 1:42.92 total

次にyarnの場合はこちら。 インストールはyarnもしくはyarn installで実行。

$ rm -rf ~/.yarn-cache
$ rm -rf ~/.yarn
$ time yarn
✨ Done in 107.47s.
yarn 27.98s user 12.92s system 37% cpu 1:48.29 total

次にキャッシュがある状態で実行。

$ time yarn
 ✨ Done in 23.35s.
yarn 11.03s user 5.61s system 69% cpu 24.049 total

yarnの場合、初回のインストール時でもnpmに比べて30秒ほど速い。 キャッシュが効いた場合だと、npmが1分42秒なのに比べてyarnは24秒とかなりの差がある。

キャッシュ無し キャッシュあり
npm 2:23.88 1:42.92
yarn 1:48.29 24.049

yarnは一度インストールするとローカルにパッケージを持つため2回目以降のインストールが速くなる。

 まとめ

yarnを使うことでインストールにかかる時間を短縮でき、 開発着手までの手間を減らすことができる。 今回の検証では記載していないが、パッケージのバージョン固定もできるため、 開発規模が大きくなればなるほど効果が出てきそう。 逆に規模が小さい開発の場合はあまりメリットがないかもしれない。

また、リリースされたばかりということもあり、今後どのようにyarnがメンテナンスされていくかが不明。 実プロジェクトに適用していくかはもう少し様子を見ておいたほうがよいかもしれない。