「実践Next.js - App Routerで進化するWebアプリ開発」を読んで雑にまとめる
資料
データ取得について
"clean-start": "rm -rf .next/cache/fetch-cache
データとして格納されている。
動的レンダリングになる要因
- 動的データ取得(cache: "no-store"など)
- 動的関数(HTTPリクエスト関係の関数)の使用(headers(),cookies(), searchParams()など)
- dynamic segment (旧dynamic routeだったかな?)の利用
規約について
layout.tsxはerror.tsxの親階層に位置します。そのため、layout.tsxで発生した例外は親Route Segmentのerror.tsxで処理されます。
これは注意かもしれない!あまり意識したことがなかった。。反省。
メタデータについて
generateMetadata関数では、第2引数のResolvingMetadataとして継承されたメタデータを参照できます。
ResolvingMetadata
知らなかった。便利。
Route Handler
画面のRouteがHTMLをレンダリングするように、Route HandlerはJSONをレンダリングします。Route Handlerでは画面のRouteと同様に「静的レンダリング・動的レンダリング」を切り替えることができます。
この分け方があるのを知らなかった。
動的RouteHandlerになる要因
要因1:Dynamic Segment値の参照 {params: ""}
要因2:Requestオブジェクトの参照 (その都度Requestに応じる)
要因3:動的関数の使用 (cookies(), headers()など)
要因4:GETとHEAD以外のHTTP関数のexport
要因5:Segment Config Optionsの指定 ("force-dynamic"など)
こんなことできるのかー。
共通のビルドができるのかー。
/** @type {import('next').NextConfig} */
const nextConfig = {
transpilePackages: ['@acme/ui', 'lodash-es'],
}
module.exports = nextConfig
データ取得とキャッシュについて
認証関係
Intercepting RoutesとParallel Routes
Server Actions
Formからサーバーの非同期関数を直接呼び出せる機能
- 中間コード(API Client)がなくなる
- Browser向けにバンドルされていたAPI Clientが少なくなる
- ハイドレーションが完了する前に実行できる
bind
を利用すべきかどうかは要検討
revalidateはserver actionで利用することがおすすめ。
これは「Routerキャッシュ」というキャッシュにヒットしてしまっていることが原因です。
本節では「Server ActionのOn-demand Revalidationに優位性がある」と解説してきましたが、Route Handlerでしか実現できないケースがあります。 それは「Next.jsアプリケーションの外側からOn-demand Revalidationを呼び出す」というケースです。もっともイメージしやすいのが「ブログ記事」です。外部のCMSサービスでブログ記事を書き、Next.jsがそのCMSからデータ取得する構成はよくあります。