Facebookが公開した新しいJavaScriptパッケージマネージャ: Yarn
元記事:
素敵やーん。
日本時間で12日、ちょうど日付が変わったくらいにFacebookが前述の記事を公開した。内容は「JavaScriptコミュニティで圧倒的に力を持っているnpmの代替となる新しいパッケージマネージャ、Yarnを作ったぜ!」というもの。代替といってもYarnはnpmクライアントを完全に置き換えるものではなくて、上位互換を持ったものらしい。
npmに対して、Facebookはかなり前から依存パッケージのインストールにかかる時間を問題視していたみたいだ。これは僕や周囲のエンジニアの反応とも一致するし極めて妥当な感じがする。今回のYarn開発に関するモチベーションはそれだけではなく、同社のJavaScriptコードベースがエンジニアの数と共に肥大化していったことも述べていて、開発にグーグルが協力していることからも大規模サービスにおいてコード管理がいかに負担になっているかを物語っていると思う。
npmの遅さにはFBのエンジニアも辟易していたのね
— ぬこすけ (@pg_nukosuke) 2016年10月11日
アーキテクチャ
Yarnは3つのステップで依存パッケージのインストールを行う。グローバルキャッシュを用意してそこにパッケージを保存しておくのが従来のnpmクライアントとの違い。
Fetching:
次に、ダウンロードすべきパッケージがすでにグローバルキャッシュに存在しているかを確認し、もしなければtarballをグローバルキャッシュに保存する。これによってこのパッケージはオフラインでも利用可能になり、再びダウンロードする必要がなくなる。Linking:
最後にYarnは必要なファイルをグローバルキャッシュからnode_modules
ディレクトリにコピーする。
なるほど、という感じだ。
インストール
npmでインストールできる。
$ npm install -g yarn
使い方
次のようにnpmのサブコマンドに対応するらしい。個人的には、ここはあえて変えずにそのまま置き換えられるようにして欲しかった。
npm install
→yarn
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.