HashiCorpが出しているCIでベースブランチとPRのNext.jsのバンドルサイズの差を計測するActionsをApp Routerで動かすメモ。
インストール
以下のコマンドを実行するとプロンプトが表示され、入力すると.github/workflows
にnextjs-bundle-analysis.yml
を作成し、package.jsonに設定が追加されます。
npx -p nextjs-bundle-analysis generate
package.json
の設定は以下のようにしています。
"nextBundleAnalysis": {
"budget": 358400,
"budgetPercentIncreaseRed": 20,
"minimumChangeThreshold": 0,
"showDetails": true
}
budget
はバンドルサイズの上限です。budgetPercentIncreaseRed
は前回のバンドルサイズとの差がこの値を超えると赤く表示されます。minimumChangeThreshold
は変更がこの値を超えると表示されます。- 0にすると全て表示されます。
showDetails
は詳細を表示するかどうかです。
App Routerに対応させる
HashiCorpの実装ではまだApp Routerに対応していないため、スクリプトを貼り替えます。
tutorial : using the appdir directory · Issue #83 · hashicorp/nextjs-bundle-analysis
- 依存関係をインストール
pnpm i -D gzip-size@6 mkdirp
- フォークされたスクリプトを
report-bundle-size.js
としてプロジェクトのルートにコピー: report-bundle-size.js · GitHub nextjs_bundle_analysis.yml
を開き、- name: Analyze bundle
というアクションを見つけて、npx -p nextjs-bundle-analysis report
をnode report-bundle-size.js
に置き換える
これでApp Routerでもバンドルサイズを計測できるようになります。おそらくgzip-sizeを6に固定しているのはモジュール解決の関係だと思われるので、ESMに書き換えれば動くと思います。
コメントが複数作成されないようにする
nextjs-bundle-analysis
の実装に問題があり、PRごとにコメントを作成してしまいます。これを修正するには、コメント系のstepを消し、以下のように置き換えます。
next-touched-pages
というヘッダーを使ってコメントを作成します。
- name: Comment
uses: marocchino/sticky-pull-request-comment@v2
with:
header: next-touched-pages
message: ${{ steps.get-comment-body.outputs.body }}
update comment not working, PR gets multiple comments · Issue #57 · hashicorp/nextjs-bundle-analysis
依存の更新、作成したActionをpushする
actions/upload-artifact
などのバージョンなどが古いので更新します。
また、このAcitonはベースブランチを比較するため、初回のプルリクエストでは実行に失敗するはずです。その場合は無視して一旦マージしましょう。