Yarn Berry vs pnpm: モダンな JS パッケージマネージャー
コンテンツアドレス指定のストアと厳格な依存分離による、高速でディスク効率の良い node_modules が欲しいなら pnpm を選び、Plug n Play、zero-installs、そしてそのプラグインと constraints システムが欲しいなら Yarn Berry を選びましょう。
Yarn Berry (Yarn 2 以降) と pnpm はどちらも npm に代わる高速でモダンな選択肢で、強力な monorepo サポートを備えます。両者の最大の違いは、依存関係をディスク上にどう配置するかです。pnpm はグローバルなコンテンツアドレス指定のストアと symlink を使い、厳格でフラットでない node_modules を生成します。Yarn Berry はデフォルトで Plug n Play (PnP) を使い、node_modules を完全に省略できます。
| Yarn Berry | pnpm | |
|---|---|---|
| インストールモデル | PnP (デフォルト) または node-modules linker | グローバルストアからの symlink |
| ディスク使用量 | 低 (zero-installs キャッシュ) | 低 (ハードリンクのストア) |
| 厳格さ | PnP 下では厳格 | 厳格 (ファントム依存なし) |
| Workspaces | あり (成熟) | あり (成熟) |
| 互換性 | PnP は一部ツールで patch が必要な場合あり | 高 (実際の node_modules レイアウト) |
| 追加機能 | プラグイン、constraints、zero-installs | pnpm-lock.yaml、catalogs |
それぞれが本当に優れている点
pnpm は幅広い互換性で優れます。symlink の node_modules はほとんどのツールにとって通常のレイアウトに見えつつ、宣言されていない (ファントム) 依存へのアクセスを防ぎます。Yarn Berry は PnP の zero-installs (キャッシュを commit して CI で yarn install をほぼ即時にする) と、その constraints およびプラグインエコシステムが欲しい場合に優れます。
CI では
どちらもキャッシュが良好に効きます。pnpm はストアから高速に復元し、pnpm install --frozen-lockfile がロックを強制します。zero-installs を使う Yarn Berry は、キャッシュが commit されているため CI のインストールをほぼ無料にできますが、その分リポジトリが大きくなります。どちらも lockfile の drift で失敗させる --immutable/--frozen-lockfile をサポートし、CI ではこれが望ましいでしょう。
正直な注意点
PnP は正確性を高めますが、一部のツールは物理的な node_modules を前提としており、node-modules linker や patch が必要でこれが摩擦になります。pnpm は混在するツールチェーンでは概して驚きの少ない選択肢ですが、その厳格さはフラットな npm ツリーが隠していた実際のバグ (宣言されていない依存) を表面化させることがあります。
結論
既存のツールとそのまま動作する、高速で厳格なインストールへの最もスムーズな道が欲しいなら pnpm を選びましょう。PnP の zero-installs、あるいはプラグインと constraints 機能を特に求めており、時折の互換性作業を許容できるなら Yarn Berry を選びましょう。