🔖

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",
});

2.2 サーバーサイドでのキャッシュ更新 (revalidatePath)

POSTPUTなどの API ルートでデータ更新が行われた後、関連するページのサーバーキャッシュを無効化する際に使用する。

revalidatePathはサーバー上のキャッシュを削除するだけで、ブラウザのリロードはトリガーしない。

// API Route内
import { revalidatePath } from "next/cache";

// ...データ更新処理後...
revalidatePath("/profile", "layout"); // /profileで始まるページのキャッシュを無効化

2.3 クライアントサイドからのキャッシュ更新 (router.refresh)

クライアント側から、サーバーコンポーネントのデータを再取得・再レンダリングさせたい場合に使用する。

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; //ここが必要
...
KA projects

Discussion