Yarnはnpmに代わる新しいパッケージマネージャとしてFacebookが発表しました。 開発にはGoogleといった有名な企業も関わっており、またRuby on Railsにも採用されるなど、JavaScriptのパッケージマネージャとしての地位を確立しつつあります。

この記事では、このYarnに関する概要やnpmとの違い、インストールの方法などについてまとめました。

Yarnとは

Yarnはnpmの上位互換的なパッケージマネージャです。 これまで、パッケージ管理にはnpmが用いられてきましたが、npmには次のような問題がありました。

  • インストールが遅い
  • インストール結果に一貫性がない
  • セキュリティ上の懸念がある

これら問題点に対するYarnの優位性について次にまとめます。

インストールが速い

Yarnは一度ダウンロードしたパッケージをグローバルにキャッシュとして保持し、次回以降そこからコピーするため高速にインストールできます。 またダウンロード自体も並列で行なうため、初回ダウンロードもnpmに比べて速いです。

インストール結果に一貫性がある

Yarnでインストールを行なうと、yarn.lockというファイルが生成されます。 これは依存パッケージのバージョン情報を示しているファイルですが、これを参照することで正確にパッケージを管理することができます。

なにがいいかというと、たとえばインストールごとに同じファイル構造でパッケージがインストールされるため、一貫性のないnpmで起こっていたバグの可能性が少なくなることが期待できます。

よりセキュアである

Yarnはインストール前にチェックサムで整合性を確認するため、より安全であるといえます。

その他にも、FacebookやGoogleが開発に関わっていることの信頼感や、インストール時の出力がクリーンであることなど、多くのメリットを享受できます。

インストール方法

インストールはHomebrewをとおして行ないます。 これだけでyarnコマンドを利用できるようになります。

$ brew update
$ brew install yarn

使い方

1. package.jsonを生成する

Yarnはnpmで利用していたpackage.jsonをそのまま利用することができるので、すでにあればこのプロセスは必要ありません。

package.jsonがまだない場合は、次のコマンドで生成します。

$ yarn init -y

このコマンドでつくられたファイルの中身は次のようになっています。 npm initで生成したものより、かなりシンプルになっていることが分かります。

{
  "name": "foo",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

2. パッケージを追加する

パッケージの追加はaddサブコマンドにより行ないます。 たとえばreactパッケージは次のコマンドでインストールします。

$ yarn add react

このとき、あわせてyarn.lockというロックファイルが生成されます。 Yarnはこれをもとにパッケージを管理することになります。

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


asap@~2.0.3:
  version "2.0.5"
  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"

core-js@^1.0.0:
  version "1.2.7"
  resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"

...

3. パッケージをインストールする

package.jsonの内容をもとにパッケージを一括でインストールするには、次のコマンドを実行します。

$ yarn install # または単純に yarn

付録:ベンチマーク

参考までに、npmとYarn(キャッシュなし・あり)でreactとその依存パッケージをインストールした際の実行時間を紹介します。 なお、実行した際の回線速度は約4Mbpsでした。

コマンド

$ time npm install
$ rm -rf node_modules
$ time yarn install   # キャッシュなし
$ rm -rf node_modules
$ time yarn install   # キャッシュあり

実行結果

コマンド 実行時間
npm install 2.08s
yarn install(キャッシュなし) 1.92s
yarn install (キャッシュあり) 0.77s

このように、特にキャッシュが有効なケースにおいてnpmより大きくインストール時間が短縮できていることが確認できました。

参考記事

おわりに

Yarnはnpmによる管理に比べてメリットしかなく、使わない手はないかな、という印象です。 まだ使ったことのない方は、ぜひ導入を検討してみてください。