Next.js 15のAdvanced Static Generation Controlとは?
はじめに
Next.js 15より「Advanced Static Generation Control」とよばれる設定が追加されました。
この機能は待望のものでしたが、あまり話題になっていないため、この記事を書きました。
現在の課題
Next.jsを利用したアプリケーションにおいては、マークダウンなどで管理している場合を除き、外部のAPIやDBからデータを参照して、ページに組み込んでいることが多いと思います。
その上で、Static Generationを行っている場合に、ビルドの並列度やスピードをコントロールできないことから、外部とのデータの通信部分において、429エラーや5xxエラーを発生させてしまうという問題がありました。
また反対に、ビルドエラーは発生していないが、ビルドに時間がかかりすぎる、という問題も良くあります。
自分はヘッドレスCMSに関する仕事をしていることから、上記のような問題を耳にすることは非常に多く、何かしらの改善が必要な状況とは考えていました。
現状のワークアラウンドとしては、cpus
とworkerThreads
の設定変更が挙げられることがありましたが、動作の詳細はドキュメント化されておらず、利用しづらいオプションではありました。
設定の詳細
staticGenerationRetryCount
静的ページを生成する際に、試行する上限回数です。
エラーになってしまった場合にリトライを行います。
デフォルト値は、undefined
(1回)です。
最初はリトライを行う回数だと認識していたのですが、挙動を確認したところ、最初の生成についても1回としてカウントされているようでした。そのため、リトライをするためには、2
以上の数値を指定する必要があります。
課題で記したように、外部のAPIのレートリミット制限などでページ生成に失敗した場合は、単純なリトライを行うことで、成功する可能性があります。
リトライ処理を行う場合、今までは外部とのデータ処理部分(fetchやSDK)の中で対処する必要がありましたが、Next.jsの設定として入ったことによって、より扱いやすくなりました。
staticGenerationMaxConcurrency
各ワーカーが同時に処理する最大ページ数です。
デフォルト値は8
です。
この値が小さい(最小1
)ほど、同時に処理されるページ数は小さくなるため、外部のAPIのレートリミット制限などに抵触する可能性は少なくなります。
staticGenerationMinPagesPerWorker
各ワーカーが処理する最小ページ数です。
デフォルト値は25
です。
たとえば生成するページのパスが100個ある場合を考えます。
staticGenerationMinPagesPerWorker
が100
の場合、ワーカーは1つ起動します。
staticGenerationMinPagesPerWorker
が50
の場合、ワーカーは2つ起動します。
この値が大きいほど、起動されるワーカーが減少するため、外部のAPIのレートリミット制限などに抵触する可能性は少なくなります。
実際のユースケース別の設定
前提として、公式ブログにおいても特別な要件がない限りはデフォルト値の使用を推奨しています。そのため、何か問題が発生するまでは、変更の必要はありません。
以下のようなケースにて、効果を発揮します。
A. ビルドの並列度が高く、エラーが発生する場合
以下の3点が有効となります。
-
staticGenerationMaxConcurrency
を下げる(最小1
)こと -
staticGenerationMinPagesPerWorker
を上げること -
staticGenerationRetryCount
を2
以上に設定すること
B. ビルドが遅い場合
以下の2点が有効となります。
-
staticGenerationMaxConcurrency
を上げること -
staticGenerationMinPagesPerWorker
を下げる(最小1
)こと
一方でこの設定変更は、外部のAPIやDBに対するスパイクリクエストを生じさせる可能性があります。
また、ビルドを行う環境においても、ネットワーク接続に関するエラーや、メモリ不足のエラーなどが発生する可能性があります。
性能確認やテストを実施した上で、慎重に行うべきでしょう。
また静的ページ生成というアーキテクチャを採用する以上、ページ数の増加でビルドが遅くなる問題を完全に回避することは不可能だと考えます。
ビルドのスピードを上げたい場合は、サーバーを活用する構成(next start
)への変更も視野に入れる必要があります。
おわりに
記事に誤りや改善点がある場合には、お気軽にコメントをお寄せください👍
Discussion