Open25

「実践Next.js - App Routerで進化するWebアプリ開発」を読んで雑にまとめる

りょたりょた

データ取得について

"clean-start": "rm -rf .next/cache/fetch-cache

データとして格納されている。

りょたりょた

動的レンダリングになる要因

  1. 動的データ取得(cache: "no-store"など)
  2. 動的関数(HTTPリクエスト関係の関数)の使用(headers(),cookies(), searchParams()など)
  3. dynamic segment (旧dynamic routeだったかな?)の利用
りょたりょた

規約について

layout.tsxはerror.tsxの親階層に位置します。そのため、layout.tsxで発生した例外は親Route Segmentのerror.tsxで処理されます。

これは注意かもしれない!あまり意識したことがなかった。。反省。

りょたりょた

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"など)

りょたりょた

データ取得とキャッシュについて

りょたりょた

パラメータ(引数)が異なるとリクエストのメモ化が効かない。

りょたりょた

cache関数を使用するときの注意点は「Reactコンポーネントの中で使わないこと」です。上記のように、コンポーネントの外側で使用します。もうひとつの注意点は「データ取得関数の引数はプリミティブ値でなければならない」という点です。

メモ化はfetchのみ。そのほかの関数にリクエストのメモ化を行うにはcache/react関数を利用する。オブジェクトを引数に渡すのはNG

https://ja.react.dev/reference/react/cache

りょたりょた

認証関係

りょたりょた

NextAuth.js

  1. 環境変数NEXTAUTH_SECRETの設定
  2. Middlewareの設置
  3. NextAuthOptionsの設定
  4. Route Handlerの設置
  5. getServerSessionの利用
りょたりょた

ここは予約語のような扱いなのか。

NextAuth.jsは専用のRoute Handler api/auth/[...nextauth]/route.tsを使用します。

りょたりょた

Server Actions

りょたりょた

Formからサーバーの非同期関数を直接呼び出せる機能

  • 中間コード(API Client)がなくなる
  • Browser向けにバンドルされていたAPI Clientが少なくなる
  • ハイドレーションが完了する前に実行できる
りょたりょた

revalidateはserver actionで利用することがおすすめ。

これは「Routerキャッシュ」というキャッシュにヒットしてしまっていることが原因です。

りょたりょた

本節では「Server ActionのOn-demand Revalidationに優位性がある」と解説してきましたが、Route Handlerでしか実現できないケースがあります。 それは「Next.jsアプリケーションの外側からOn-demand Revalidationを呼び出す」というケースです。もっともイメージしやすいのが「ブログ記事」です。外部のCMSサービスでブログ記事を書き、Next.jsがそのCMSからデータ取得する構成はよくあります。