オフトゥン大好き

惰眠系プログラマの作業ログで( ˘ω˘ ) スヤァ…

Facebookが公開した新しいJavaScriptパッケージマネージャ: Yarn

元記事:

素敵やーん。

日本時間で12日、ちょうど日付が変わったくらいにFacebookが前述の記事を公開した。内容は「JavaScriptコミュニティで圧倒的に力を持っているnpmの代替となる新しいパッケージマネージャ、Yarnを作ったぜ!」というもの。代替といってもYarnはnpmクライアントを完全に置き換えるものではなくて、上位互換を持ったものらしい。

npmに対して、Facebookはかなり前から依存パッケージのインストールにかかる時間を問題視していたみたいだ。これは僕や周囲のエンジニアの反応とも一致するし極めて妥当な感じがする。今回のYarn開発に関するモチベーションはそれだけではなく、同社のJavaScriptコードベースがエンジニアの数と共に肥大化していったことも述べていて、開発にグーグルが協力していることからも大規模サービスにおいてコード管理がいかに負担になっているかを物語っていると思う。

アーキテクチャ

Yarnは3つのステップで依存パッケージのインストールを行う。グローバルキャッシュを用意してそこにパッケージを保存しておくのが従来のnpmクライアントとの違い。

  1. Resolution:
    npmレジストリへのリクエストによってそれぞれの依存関係を再帰的に解決していく。

  2. Fetching:
    次に、ダウンロードすべきパッケージがすでにグローバルキャッシュに存在しているかを確認し、もしなければtarballをグローバルキャッシュに保存する。これによってこのパッケージはオフラインでも利用可能になり、再びダウンロードする必要がなくなる。

  3. Linking:
    最後にYarnは必要なファイルをグローバルキャッシュからnode_modulesディレクトリにコピーする。

なるほど、という感じだ。

インストール

npmでインストールできる。

$ npm install -g yarn

使い方

次のようにnpmのサブコマンドに対応するらしい。個人的には、ここはあえて変えずにそのまま置き換えられるようにして欲しかった。

  • npm installyarn

  • npm install --save <name>yarn add <name>

速度比較

適当に選んだ自作nodeプロジェクトの依存項目のみ抜粋したものがこちら。

{
  "dependencies": {
    "es6-promise": "^4.0.5",
    "isomorphic-fetch": "^2.2.1",
    "qs": "^6.2.1"
  },
  "devDependencies": {
    "babel-preset-es2015": "^6.16.0",
    "chai": "^3.5.0",
    "karma": "^1.3.0",
    "karma-babel-preprocessor": "^6.0.1",
    "karma-chai": "^0.1.0",
    "karma-mocha": "^1.2.0",
    "karma-mocha-reporter": "^2.2.0",
    "karma-phantomjs-launcher": "^1.0.2",
    "karma-sinon-chai": "^1.2.4",
    "karma-webpack": "^1.8.0",
    "mocha": "^3.1.0",
    "phantomjs-prebuilt": "^2.1.12",
    "sinon": "^1.17.6",
    "sinon-chai": "^2.8.0",
    "ts-loader": "^0.8.2",
    "tslint": "^3.15.1",
    "typedoc": "^0.4.5",
    "typescript": "^2.0.3",
    "typings": "^1.4.0",
    "webpack": "^1.13.2"
  }
}

これをnpmとYarnで比較してみる。Yarnはキャッシュの効果も知りたいので1回目でコピーされたnode_modulesを削除してもう一度実行した結果もみる。

manager time result
npm npm install 44.20s user 11.06s system 28% cpu 3:11.75 total
Yarn (1回目) yarn 38.63s user 19.57s system 98% cpu 59.047 total
Yarn (2回目) yarn 23.46s user 11.32s system 116% cpu 29.961 total

Yarnはとにかく速い。そして、Yarnは2回目でダウンロードの時間が省けるのでさらに速くなる。ちなみにキャッシュは~/.yarn-cache/に保存されるようだ。

感想

速度が向上するのはいいことだけど、僕としてはオフラインでも作業できるようになるのが一番のメリットだと思う。 一度ローカルにnpmをミラーしようとして挫折したことがある。

とにかくYarn素敵。使わない理由はない。

GitHub - yarnpkg/yarn: 📦🐈 Fast, reliable, and secure dependency management for JavaScript.

関連記事