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を、今日から「秒速」の世界へ引き上げましょう。