Yarn入門:Classic(v1)とBerry(v2+)の違い、Workspaces・PnP・移行時の注意点を徹底解説
Yarnとは
YarnはJavaScript/Node.js向けのパッケージマネージャーで、依存関係のインストール、管理、スクリプト実行を効率的に行うためのツールです。もともとはFacebook(現Meta)を中心に、Exponent(現在のExpo)、Google、Tildeなどの企業やコミュニティの協力で開発され、2016年に発表されました。Yarnの目的は、速度・信頼性・再現性を高め、npm(当時の標準的なパッケージマネージャー)が抱えていた課題(インストールの遅さ、非決定的な依存解決など)を解決することにありました。
Yarnの基本的な特徴
- 高速なインストール:並列ダウンロードやキャッシュ機構により、同じパッケージを再インストールする際に非常に高速です。
- ロックファイルによる再現性:
yarn.lockで依存ツリーを固定し、異なる環境間でも同一の依存構成を再現します。 - オフラインインストール:一度ダウンロードしたパッケージをキャッシュしておけば、ネットワークのない環境でもインストールできます。
- Workspaces(モノレポ対応):複数パッケージを一つのリポジトリで管理するモノレポ構成を標準サポートし、依存の共有や効率的なインストールを実現します。
- セキュリティと整合性チェック:ダウンロード時にチェックサム検証や整合性チェックを行い、改ざんや破損を検出します。
Yarnの進化:Classic(v1)とBerry(v2以降)の違い
Yarnは大きく2つの世代に分かれます。従来のYarn(通称「Classic」またはv1)と、設計を大幅に見直したYarn 2以降(通称「Berry」)です。これらは互換性やアーキテクチャに違いがあるため、導入時はどちらを使うかの選定が重要です。
- Classic(v1)の特徴
node_modulesを使った従来型の依存解決- シンプルで多くの既存ツールとの互換性が高い
- コマンドは「yarn add」「yarn install」など従来型
- Berry(v2以降)の特徴
- Plug'n'Play (PnP):デフォルトでは
node_modulesを生成せず、依存を直接参照する仕組みで高速化・軽量化を実現(ただし一部ツールとの互換性問題あり)。 - 設定ファイルの変更:
.yarnrc.ymlなど新しい設定方式を採用。 - Zero-Installs:リポジトリにキャッシュを含めることで、初回からインストール不要で即座に環境構築が可能。
- 新しいプロトコル(
workspace:,patch:など)や拡張機能をサポート。
- Plug'n'Play (PnP):デフォルトでは
よく使うコマンド(例と用途)
yarn init:プロジェクトの初期化(package.jsonの作成)yarn install:依存関係のインストール(yarn.lockに従う)yarn add:依存パッケージを追加(--devでdevDependenciesに)yarn remove:依存パッケージを削除yarn upgrade:依存のアップデート@ yarn workspaces:ワークスペース関連の操作(モノレポの管理)yarn dlx:一時的にパッケージを実行(npmのnpxに相当、Berry以降の機能)
モノレポとWorkspaces
Yarn Workspacesは、複数のパッケージ(サブプロジェクト)を単一のリポジトリで管理する場合に非常に便利です。主な利点は以下の通りです。
- 依存の共通化と重複の排除(インストールが効率化)
- パッケージ間のローカル参照(
workspace:プロトコル) - ビルドやテストの横断的な自動化が容易になる
一方で、構成が複雑になりやすく、Workspacesと他のツール(CIやIDE、サードパーティツール)との互換性チェックが必要です。
セキュリティと再現性
Yarnはロックファイル(yarn.lock)により同一の依存ツリーを再現する仕組みを提供します。これにより、開発者間やCI環境での「ローカルでは動くがCIで動かない」といった問題を低減できます。また、ダウンロード時のチェックサムや整合性検証を行うことでパッケージの改ざんを検出する機能があり、セキュリティ面でも有利です。
npmやpnpmとの比較
Yarn登場当初はnpmに対して明確に速度や決定性で優位性がありましたが、その後npm自身も改善(package-lock.jsonの導入、並列化、Workspacesのサポートなど)しており、現在は機能が近づいています。pnpmは別のアプローチで、コンテンツアドレッシングされたグローバルストアとハードリンク/シンボリックリンクを使い、ディスク使用量とインストール速度の点で利点があります。
- Yarn(特にBerry):PnPによるnode_modules不要化、Zero-Installs、強力なワークスペース管理。
- npm:エコシステムのデフォルト、広い互換性、近年の機能強化で実用性向上。
- pnpm:効率的なディスク利用と速いインストール、大規模モノレポでの利点。
導入・移行時の注意点
Yarnを導入・移行する際には以下の点に注意してください。
- ロックファイルの扱い:npmから移行する場合は
yarn importでpackage-lock.jsonからyarn.lockを生成できますが、内容の確認とテストは必須です。 - PnPの互換性:Yarn BerryのPnPは一部のライブラリやビルドツールが期待する
node_modulesを前提としていないため、互換性問題が発生することがあります。その場合はnodeLinker: "node-modules"設定で従来方式に戻せます。 - CIやIDEの対応:CI設定やIDE(VSCodeなど)のプラグインがYarn Berryの独自機能に対応しているかを確認してください。YarnはIDE向けのSDK生成機能も提供していますが、環境によって手順が必要です。
- チーム合意:異なるマシンやCIで同じ振る舞いを得るため、プロジェクトで使用するYarnのバージョン(Classic vs Berry)や設定を統一し、リポジトリにバージョンを含める運用(例:
yarn set version)が推奨されます。
実務での運用ポイントとベストプラクティス
- ロックファイルは常にコミットして依存の再現性を担保する。
- CIではキャッシュ機構を適切に使い、インストール速度を改善する(例:YarnのキャッシュディレクトリやBerryのZero-Installs)。
- モノレポを採用する場合はWorkspacesを活用しつつ、依存ポリシー(shared dependencyのバージョン管理など)を明確化する。
- Berryを導入する場合は、事前に主要な開発ツールやビルドフローとの互換性確認・テストを行う。
- セキュリティ面では定期的な依存更新と監査(
yarn auditなど)を実施する。
まとめ
YarnはJavaScriptエコシステムにおける主要なパッケージマネージャーの一つで、速度・信頼性・モノレポ対応といった点で強力な機能を提供します。Classic(v1)は既存ツールとの互換性が高く、Berry(v2以降)はPlug'n'PlayやZero-Installsなど新しい概念を導入しており、用途やプロジェクト特性に応じて選択することが重要です。移行時は互換性やCI/IDE対応を事前に確認し、ロックファイル運用やチーム内合意を徹底することで安定した開発環境を実現できます。
参考文献
- Yarn 公式サイト
- Yarn ドキュメント - Getting Started
- Introducing Yarn(公式ブログ、2016年)
- Yarn - QA(よくある質問と互換性ガイド)
- Plug'n'Play (PnP) — Yarn features
- pnpm 公式サイト(比較参照用)
- npm ドキュメント(比較参照用)


