【入門編】yarnの「Zero-installs」とは?CI時間を劇的に短縮する設定と運用ガイド – ビルド・パッケージ管理ツール生産性向上バイブル

CI時間を「数分から数秒へ」:Yarn BerryのZero-installsが変えるフロントエンド開発の未来

こんにちは。大規模開発の現場で日々「いかにビルド時間を削り、開発体験(DX)を最大化するか」に心血を注いでいるアーキテクトです。

フロントエンド開発において、皆さんが最もストレスを感じる瞬間はどこでしょうか? 私が確信しているのは、「CI(GitHub Actionsなど)が走り出すたびに、数分間かけてひたすら `node_modules` を生成し続けるあの待ち時間」です。

今日は、その無駄を根絶し、CIを「魔法のように」瞬時に終わらせるYarn Berryの「Zero-installs」という概念について、その本質を深掘りします。

—

1. Zero-installsとは何か? 本質的な理解

従来の `npm` や `yarn v1` は、プロジェクトのルートに `node_modules` という巨大なディレクトリを生成していました。これには以下の致命的な欠点があります。

  • 肥大化: 依存関係が増えるほど、数万個のファイルが生成される。
  • 非決定性: `node_modules` は環境依存になりがち。
  • CIのオーバーヘッド: 毎回ネットワーク越しにパッケージをダウンロードし、ディスクに書き込む作業(`npm install`)が必要。

Yarn BerryのZero-installsは、この常識を覆します。
具体的には、依存パッケージを圧縮ファイル(`.zip`)としてリポジトリにコミットし、「そもそもインストール処理自体を行わない」という戦略をとります。

これにより、CIは「`yarn install` の完了を待つ」のではなく、「キャッシュから取り出すだけで、即座にビルドを開始する」ことが可能になります。

—

2. Zero-installsを導入するための最短ルート

まずは、プロジェクトをYarn Berry(v2以降)へ移行し、PnP(Plug’n’Play)モードを有効にします。

ステップ1: Yarnのバージョンを固定する

プロジェクトのルートで以下のコマンドを打ち、Yarnのバージョンを管理下に置きます。

プロジェクト内でYarn Berry(stable)を使用するように設定
yarn set version stable

ステップ2: PnPモードの設定

`.yarnrc.yml` という設定ファイルに、Yarnの挙動を定義します。

.yarnrc.yml
node_modulesを生成せず、PnPという独自の解決メカニズムを使用
nodeLinker: pnp

依存関係をキャッシュする場所を指定
pnpEnableCache: true

ステップ3: ゼロインストールを有効化

`.gitignore` を編集し、通常は除外する `.yarn/cache` を含めるようにします。

.gitignore
yarn.lockは必須
.pnp.cjsも必須
.yarn/cache/配下の.zipファイルはコミットする!
!/.yarn/cache

これで、あなたが `yarn add` を実行するたびに、`.yarn/cache` 内に圧縮ファイルが生成されます。これをGitにコミットすることで、あなたのローカル環境とCI環境の依存関係が、1ビットの差異もなく同期されます。

—

3. なぜこれでCI時間が劇的に短縮されるのか?

CIのパイプラインで以下のような構成を組んでみてください。

.github/workflows/ci.yml(抜粋)
jobs:
build:
runs-on: ubuntu-latest
steps:

  • uses: actions/checkout@v4
  • name: Setup Node.js

uses: actions/setup-node@v4
with:
node-version: 20

# ここが魔法のポイント:インストール処理をスキップ
# 既にコミットされた.yarn/cacheがあるため、yarn installは即座に終了する

  • name: Install dependencies

run: yarn install –immutable

  • name: Build

run: yarn build

解説:
`–immutable` オプションを付けることで、`yarn.lock` にない変更が検知された場合にCIが失敗するようになります。これにより、「ローカルとCIでバージョンが違う」という悲劇を物理的に排除できます。

—

4. アーキテクトからのアドバイス:実務での注意点

Zero-installsは強力ですが、銀の弾丸ではありません。以下のポイントを押さえておきましょう。

1. リポジトリの肥大化: 巨大なライブラリを大量に導入すると、Gitのクローンサイズが増加します。しかし、現在のGitHubのネットワーク速度とストレージ効率を考えれば、`node_modules` を再インストールする待ち時間と天秤にかけると、多くの場合「Zero-installsの勝ち」です。
2. バイナリパッケージ: 一部の複雑なネイティブモジュールは注意が必要です。しかし、Yarn Berryは `pnpify` などのツールを通じて、従来のツールとの互換性も確保しています。
3. チームの合意: チーム全員が「`node_modules` が存在しない世界」に慣れる必要があります。VS Codeを使用している場合は、`vscode-zipfs` 拡張機能を入れることで、圧縮されたパッケージの中身を直接エディタで確認できるようになります。

—

最後に:なぜ今、これをやるべきか

フロントエンドのアーキテクチャが複雑化する今、「環境構築の再現性」と「速度」はプロフェッショナルの必須要件です。

`node_modules` を消すことは、単なる最適化ではなく、「ビルドパイプラインから不安定要素を排除する」というエンジニアリングの本質的な改善です。

まずは小さなプロジェクトからで構いません。一度この「Zero-installs」の爆速感を味わうと、二度と `npm install` のプログレスバーを眺める生活には戻れなくなるはずですよ。

さあ、あなたのCIを、今日から「秒速」の世界へ引き上げましょう。

タイトルとURLをコピーしました