GitHub ActionsでNext.js等をビルドする際にnode_modulesをキャッシュすることでビルドの高速化を図ります
動作確認環境
Next.js 14.2.4
Yarn v3
GitHub Actionsでは、よく利用するデータをキャッシュ(一時的に保存)しておくことができます
例えば node_modules をキャッシュする場合は、以下のように記述します
jobs:restore:name: Restore cacheruns-on: ubuntu-lateststeps:- name: Checkoutuses: actions/checkout@v4with:ref: ${{ github.head_ref }}- name: Setup Node.jsuses: actions/setup-node@v4with:node-version: ${{ vars.NODE_VERSION }}- name: Restore cacheid: node_modules_cache_iduses: actions/cache@v4with:save-always: truepath: node_moduleskey: ${{ matrix.os }}-node-v${{ matrix.node }}-deps-${{ hashFiles(format('{0}{1}', github.workspace, '/package-lock.json')) }}
パッケージ管理モジュールに応じて、package-lock.json や yarn.lock を指定してください
ただし Yarn v3 以降では node_modules にパッケージがインストールされている場合でも、Yarn特有のキャッシュがない場合には yarn で再インストールされるために、高速化が期待できないことがあります
Yarn特有のキャッシュとは
例えば Next.js(Vercel) のビルド時は、自動インストールを無効化することで高速化が期待できます
.vercel/project.json を作成し、自動インストールを無効化します (installCommand を空文字列にする)
{"projectId":"_","orgId":"_","settings":{"framework":"nextjs","installCommand":""}}Cloudflareにデプロイする場合も、vercelによるビルドが自動で行われるため、手動でビルドした上で -s オプションを付与して自動ビルドを無効化すると、高速化されます
- name: Buildrun: npx vercel build && npx next-on-pages -s
なお、さらに時間を惜しむ場合は vercel と next-on-pages を事前に node_modules に含めておくと、インストール分の時間が(おそらく)短縮されます
- name: Buildrun: node_modules/.bin/vercel build && node_modules/.bin/next-on-pages -s
これでYarnを使っていても、ビルドを高速化できました 🎉
おわりに
なかなか高速化できなかった原因がYarnだと気がつくまでに2ヶ月くらいかかりました... 🐶