Yarn

パッケージマネージャーNode.jsJavaScriptTypeScriptモノレポWorkspacesワークスペース

パッケージマネージャー

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