TL;DR
Next.js は、Route 単位でレンダリング方式を自動で切り替える。デフォルトは Static Rendering で、条件に当てはまると Dynamic Rendering になる。
仕組み
Static Rendering
デフォルトのレンダリング方式。ビルド時か Revalidate 時にレンダリング結果をキャッシュファイルに出力し、Route のレスポンスとして返す。この成果物は CDN から配信できる。SSG や ISR から派生した機能である。
Dynamic Rendering
リクエストのたびにレンダリングする。毎回評価するので、Static Rendering よりパフォーマンスは悪い。次のどれかに当てはまると、Static Rendering ではなく Dynamic Rendering になる。
- 動的データを取得する(Next.js による fetch の拡張)
- Dynamic Functions を使う
- Dynamic Routes を使う
Dynamic Functions は、リクエスト時にしか分からない情報に依存する関数である。たとえば次のものがある。
- Server Component で
cookies()を使う(Cookie の参照)。NextAuth.js のgetServerSessionも内部でcookiesを呼ぶので、Dynamic Functions と見なされる - Server Component で
headers()を使う(リクエストヘッダの参照) - Server Component で props の
searchParamsを参照する(クエリパラメータの参照) unstable_noStoreを使う(キャッシュの無効化)unstable_afterを使う(レスポンスの終了後に実行する処理の登録)
Dynamic Routes でも、generateStaticParams を使えば SSG(ISR)ができ、Dynamic Rendering ではなくなる。
方式の確認
next build を実行すると、すべての Route がレンダリングされ、レンダリング方式が決まる。出力を見ると、どちらでレンダリングされたかが分かる。
自分の理解
Dynamic Routes を使うと Dynamic Rendering になることは、ドキュメントに書かれていない。Next.js 14 で実際に試して確かめた。