🔖
Next.js App Router: データ取得とキャッシュ戦略のハッカソンメモ
はじめに
こないだ参加したハッカソンで得た知見の備忘録です。
1. データ取得の基本パターン
データ取得の方法は、主に ServerActions でfetch
するか、API ルートを作成してfetch
するかの 2 択。
API ルートを選択する場合、fetch でユーザーの操作を伴う場合はクライアントコンポーネント化しないといけない。
ServerActions だとそのハードルを超えれる ⇨ 現在の主流らしい
2. キャッシュ戦略
2.1 毎回最新データを取得 (SSR)
fetch
はデフォルトでキャッシュされる。キャッシュを無効化し、リクエストごとに最新のデータを取得する SSR(サーバーサイドレンダリング)を実現するには、fetch
のオプションにcache: "no-store"
を指定する。
fetch(`${process.env.NEXT_PUBLIC_BASE_URL ?? ""}${endpoint}`, {
cache: "no-store",
});
revalidatePath
)
2.2 サーバーサイドでのキャッシュ更新 (POST
やPUT
などの API ルートでデータ更新が行われた後、関連するページのサーバーキャッシュを無効化する際に使用する。
revalidatePath
はサーバー上のキャッシュを削除するだけで、ブラウザのリロードはトリガーしない。
// API Route内
import { revalidatePath } from "next/cache";
// ...データ更新処理後...
revalidatePath("/profile", "layout"); // /profileで始まるページのキャッシュを無効化
router.refresh
)
2.3 クライアントサイドからのキャッシュ更新 (クライアント側から、サーバーコンポーネントのデータを再取得・再レンダリングさせたい場合に使用する。
router.refresh()
はサーバーコンポーネントのみを更新し、クライアントコンポーネントの状態(useState
など)は維持される。
// Client Component内
"use client";
import { useRouter } from "next/navigation";
const router = useRouter();
// ...何らかの処理後...
router.refresh(); // サーバーデータを再取得してUIを更新
params
取得
おまけ: ルートハンドラーでのAPI ルート(ルートハンドラー)で、/users/[id]
のような動的なパスパラメータを取得する場合の記述法(Next.js13 以降)
// app/api/users/[id]/route.ts
import { NextRequest, NextResponse } from "next/server";
export async function GET(
props: { params: Promise<{ id: string }> }) { //ここと、
try {
const { id: profileUserId } = await props.params; //ここが必要
...
Discussion