ハトネコエ Web がくしゅうちょう

プログラミングとかAndroid

npm と yarn のインストール時間を比較してみた

彗星の如く現れた yarn
Facebook社の中の人が作った yarn は、 npm を発展させたパッケージ管理ツールです。*1

npm 同様 package.json を読み込み、npm リポジトリとほぼ同様の yarn リポジトリからダウンロードしてくるものなので、
npm からの移行は簡単です。

まずは

brew install yarn

もしくは

npm install -g yarn

にて yarn をインストールしてきて、( npm に取って代わるものとして作られているため、前者のやり方を yarn としては推奨しているようだ)
それから現在の node_modules フォルダを削除し、

rm -rf node_modules

yarn install を実行するだけです。( yarn install とコマンドしても yarn とコマンドしても同じ )

yarn

さて、気になるのは yarn install にかかる時間。
本当に速くなっているのでしょうか?
time コマンドを利用し見てみましょう。

今回インストールするパッケージの一覧は以下のとおりです。

# package.json より抜粋
  "dependencies": {
    "font-awesome": "^4.7.0",
    "zepto": "^1.2.0"
  },
  "devDependencies": {
    "babel-preset-es2015": "^6.18.0",
    "csso": "^2.3.0",
    "del": "^2.2.2",
    "gulp": "^3.9.1",
    "gulp-babel": "^6.1.2",
    "gulp-htmlmin": "^3.0.0",
    "gulp-imagemin": "^3.1.0",
    "gulp-postcss": "^6.2.0",
    "gulp-pug": "^3.1.0",
    "gulp-replace": "^0.5.4",
    "gulp-sass": "^2.3.2",
    "gulp-sourcemaps": "^2.2.0",
    "gulp-uglify": "^2.0.0",
    "gulp-webserver": "^0.9.1",
    "postcss-cssnext": "^2.8.0",
    "postcss-csso": "^1.1.2",
    "pump": "^1.0.1"
  }

また、
npm のバージョンは v3.10.8
yarn のバージョンは v0.16.1 を使用しています。

time npm install

# 中略

npm install  35.38s user 10.38s system 51% cpu 1:29.60 total

約1分30秒かかりました。続いて yarn です。

time yarn

yarn install v0.16.1
info No lockfile found.
[1/4] 🔍  Resolving packages...
warning gulp > vinyl-fs > glob-stream > minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
warning gulp > vinyl-fs > glob-watcher > gaze > globule > minimatch@0.2.14: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
warning gulp > vinyl-fs > glob-watcher > gaze > globule > glob > graceful-fs@1.2.3: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to graceful-fs@^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
success Saved lockfile.
✨  Done in 80.57s.
yarn  25.27s user 13.88s system 48% cpu 1:21.12 total

約1分20秒です。少し速いですね。
それから、行数のすごく長い npm install と違い、絵文字を使いつつシンプルに出力されているのが見て取れますね。

そしてここからが yarn の本領発揮です。

yarn は一度インストールしたものはキャッシュに貯め、
次回インストール時はキャッシュにあるものを使い、リポジトリからダウンロードしません。

それにより、インストール時間を大幅に削減しているのです。
再びインストールしてみましょう。

rm -rf node_modules
time yarn
yarn install v0.16.1
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
success Saved lockfile.
✨  Done in 23.81s.
yarn  13.32s user 8.05s system 88% cpu 24.253 total

約24秒です!
従来の npm install と1分以上の違いがあります。

また、キャッシュにあるものを持ってきているだけなので、
ネットにつなげていない状況でも yarn コマンドは上のとおりに動作します。

まあ、問題は……

du -sh ~/.yarn-cache
 86M    /Users/user_name/.yarn-cache

ユーザーディレクトリに作られる yarn のキャッシュフォルダの容量がどんどんと大きくなっていきそうなのが心配ですね……。