2016年に yarn が登場した当初、npm 3 の問題点(遅いインストール、ロックファイルなし、非決定論的な依存関係ツリー)から yarn は明らかな勝者でした。2年後、npm 5 が大幅に差を縮めました。今はどちらを選ぶべきでしょうか?
yarn が生まれた理由
npm 3 の主な問題:
- ロックファイルなし:チームメンバーが異なる依存バージョンを取得する可能性
- 遅い:並列ダウンロードなし、キャッシュなし
- 非決定論的:
npm installが異なる結果を生む可能性
yarn は3つすべてを一度に解決:
yarn.lock— 決定論的な依存関係ツリー- 並列ダウンロード + キャッシュ — 劇的な速度向上
- フラットな依存関係解決
npm 5 が追いついた
npm 5(Node.js 8 時代)は package-lock.json を追加し、速度も大幅に改善されました。
2018年の比較
| 機能 | npm 5 | yarn |
|---|---|---|
| ロックファイル | package-lock.json | yarn.lock |
| インストール速度 | 速い | 速い |
| ワークスペース | ❌ | ✅(組み込み) |
| オフラインモード | ❌ | ✅ |
| 出力の可読性 | 普通 | より良い |
コマンド構文
bash
# インストール
npm install yarn
npm install --save yarn add [パッケージ]
npm install --save-dev yarn add --dev [パッケージ]
# 削除
npm uninstall yarn remove
# スクリプト実行
npm run [スクリプト] yarn [スクリプト](run 不要)
# 更新
npm update yarn upgrade
ワークスペース(monorepo)
yarn の組み込みワークスペースサポートは monorepo における大きな優位点です:
json
// package.json(ルート)
{
"private": true,
"workspaces": ["packages/*"]
}
bash
# すべてのワークスペースの依存関係をインストール
yarn install
# 特定のワークスペースでコマンドを実行
yarn workspace my-package test
ロックファイルのベストプラクティス
どちらを選択する場合でも:
- ロックファイルをコミット —
package-lock.jsonまたはyarn.lock - 同じプロジェクトで npm と yarn を混在させない
- チーム全体で同じパッケージマネージャーのバージョンを使用する
おすすめ(2018年)
- 新規プロジェクト:どちらでもよい、一貫性を保つ
- Monorepo:yarn(ワークスペースが圧倒的に優れている)
- シンプルなプロジェクト:npm 5 で十分
最も重要なのはチームの一貫性です。パッケージマネージャーを混在させるとロックファイルの競合と非決定論的なインストールが発生します。