Yarnのいいところは?

ウルトラでメガでスーパーなパッケージ管理ができるのがYarnだそうです。
が、今回は実際に使ってみて感じたメリットについて書きます。

package.jsonを使える(npm互換)

「今までずっとnpmでやってきたプロジェクトだし、わざわざyarnに乗り換えるの面倒臭いよね…」と目をそむけてきましたが、全然面倒臭くありませんでした。yarnをグローバルインストールしてしまえば、あとはnpmと同様にpackage.jsonを元にパッケージ管理ができます。導入まで1ステップというお手軽さでした。

$ npm install -g yarn

yarnのインストールはnpmから。なんか変な話ですね。

node_modulesの容量が減った

モジュール管理方法が、npmは階層化されているのに対し、yarnはフラットです。読み込んだモジュールが更にモジュールを読み込んでいて…とネストしていくものを全部フラットでインストールするため重複がありません。その分軽くなります。

ダウンロードが速い

過去に1度ダウンロードしたものをローカルにキャッシュしておいてくれるので、npm installをし直すような場面で特に高速化の威力を発揮します。ローカルキャッシュということはオフラインにも対応しているということですね(まだオフラインの恩恵を受けたことはありませんが)。

$ yarn
# もしくは
$ yarn install

バージョン固定がしやすい

Yarnでは読み込むモジュールのバージョンをお手軽に固定することができます(一応npmでもできるんですよ、npm shrinkwrapという機能を使うと)。これにより「誰のどの環境にも同じモジュールがある」状態を維持できます。

ロゴがかわいい

ニャーン。ヤーン。

Yarnの導入をしよう

インストール

$ npm install -g yarn

プロジェクトの準備

$ yarn init

モジュールの追加&削除

$ yarn add [package]            # npm install --save に相当
$ yarn add --dev [package]      # npm install --save-dev に相当
$ yarn add [package]@[version]

$ yarn remove [package]

その他コマンドのnpm / yarn比較は公式に一覧化されています。

Yarnのパッケージインストールの仕組み

何か問題が起きたときに、内部の動きを知っていると意外と役立ったりしますよね。ということで軽く触れておきます。

1. モジュール間の依存解決

モジュール間の依存関係を再帰的に解決する。

2. Fetch & Cache

ダウンロード対象の各パッケージがグローバルキャッシュ(~/.yarn-cache)に存在しているかを確認し、もしなければtarballを取得しキャッシュする。

3. 対象プロジェクトのnode_modulesへコピー

グローバルキャッシュから対象のモジュールをnode_modules以下へコピーする。

まとめ

  • package.jsonを使えるのでnpm互換
  • モジュールのダウンロードが速い
  • モジュールの容量削減
  • バージョン固定

大きなデメリットもなく手間もなく、あっという間にnpmからyarnへと移行しちゃいました。皆様もぜひ。