Yarn
パッケージマネージャー
Yarn
概要
Yarnは、npmの代替として開発された高速・安全・信頼性の高いJavaScript/TypeScriptパッケージマネージャーです。Meta(旧Facebook)、Google、Exponent、Tildeが共同開発し、npmと完全な互換性を持ちながら、決定論的インストール、オフライン機能、ワークスペース機能などの先進的な機能を提供します。現在のYarn Berry(v2以降)は、プラグアブルアーキテクチャとPlug'n'Play(PnP)により、従来のnode_modulesの課題を解決した次世代パッケージマネージャーです。
詳細
Yarnは2016年にnpmの速度と一貫性の問題を解決するために開発されました。最新のYarn Berry(v3/v4)では、従来のnode_modulesディレクトリを使用しないPlug'n'Play(PnP)アプローチを採用し、ディスク容量の削減と高速化を実現しています。Workspaces機能により、モノレポでの複数パッケージ管理が簡単になり、依存関係の共有とバージョン管理が効率化されます。また、Zero-Installs機能により、.yarnディレクトリをコミットすることで、git cloneだけでプロジェクトを実行可能な状態にできます。コンストレイント機能では、Prologライクな構文でワークスペース間の依存関係ルールを定義でき、大規模プロジェクトでの一貫性を保つことができます。
メリット・デメリット
メリット
- 高速なインストール: 並列処理とキャッシュ機能による高速なパッケージインストール
- 決定論的インストール: yarn.lockファイルによる再現可能なビルド環境
- Workspaces機能: モノレポでの効率的な複数パッケージ管理
- PnP(Plug'n'Play): node_modulesを使わない高速で軽量なパッケージ解決
- Zero-Installs: 依存関係をリポジトリにコミットしてインストール不要に
- プラグインシステム: 豊富なプラグインによる機能拡張
デメリット
- 学習コストの高さ: npmとは異なる概念(特にPnP)の理解が必要
- エコシステムの互換性: 一部のパッケージがPnPと互換性がない場合がある
- 設定の複雑さ: 高度な機能を使うための設定が複雑
- 移行コスト: 既存のnpmプロジェクトからの移行に時間がかかる
参考ページ
書き方の例
基本的なプロジェクト初期化
# 新しいプロジェクトの初期化
yarn init
# パッケージのインストール
yarn install
# パッケージの追加
yarn add react react-dom
# 開発依存関係の追加
yarn add -D typescript @types/react
# グローバルパッケージの追加
yarn global add nodemon
Workspaces(モノレポ)設定
// package.json
{
"name": "my-monorepo",
"private": true,
"workspaces": [
"packages/*"
]
}
# ワークスペース全体でのコマンド実行
yarn workspaces foreach run build
# 特定のワークスペースでのコマンド実行
yarn workspace @myorg/app run dev
# 変更されたワークスペースのみでコマンド実行
yarn workspaces foreach --since run test
# ワークスペース間の依存関係追加
yarn workspace @myorg/app add @myorg/utils@workspace:^
スクリプト実行とタスク管理
# パッケージスクリプトの実行
yarn run build
yarn run test
yarn run dev
# バイナリの実行
yarn exec webpack
yarn bin webpack # バイナリパス取得
yarn node --inspect $(yarn bin jest) # Node.jsフラグ付き実行
# 依存関係の情報表示
yarn info react
yarn why lodash
yarn licenses list
パッケージ管理とバージョン制御
# パッケージの更新
yarn up react
yarn up -i # インタラクティブ更新
yarn upgrade-interactive
# パッケージの削除
yarn remove lodash
yarn remove -A lodash # 全ワークスペースから削除
# キャッシュ管理
yarn cache clean
yarn cache clean --all
高度な設定とPnP
# .yarnrc.yml
nodeLinker: pnp # またはnode-modules
pnpMode: strict
# Workspaces hoisting制限
nmHoistingLimits: workspaces
# プラグインの追加
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
spec: "@yarnpkg/plugin-typescript"
プロダクション環境での最適化
# プロダクションビルド(devDependencies除外)
yarn install --production
yarn workspaces focus --production
# Yarn 2+ でのゼロインストール設定
# .gitignore に以下を追加
# .yarn/cache
# .yarn/unplugged
# .yarn/build-state.yml
# .yarn/install-state.gz
# パッケージバンドル作成
yarn pack
yarn workspaces foreach pack