Claude Code × Next.js フルスタック開発完全ガイド|CLAUDE.mdテンプレート・use cache・Server Actions・Prisma 7対応【2026年最新】

Claude Code × Next.js フルスタック開発完全ガイド|CLAUDE.mdテンプレート・use cache・Server Actions・Prisma 7対応【2026年最新】 AI開発

Next.jsとClaude Codeの組み合わせは、特に相性が良いです。App RouterのServer Components / Client Components境界、Server Actionsのバリデーション設計、'use cache'のキャッシング戦略——これらはいずれも「文脈を踏まえた設計判断」が求められる領域で、Claude Codeが力を発揮します。

この記事では、Next.js 16(2025年10月リリース)に対応したClaude Codeの実践的な活用方法を解説します。コピペ即使えるCLAUDE.mdテンプレート、よくある失敗パターンと防止策、shadcn/ui CLI v4との連携まで、フルスタック開発の全工程をカバーします。

Next.jsの基本的な使い方についてはTypeScript × Next.js完全ガイドで解説しています。この記事はClaude Codeとの連携に特化した内容です。
スポンサーリンク

Claude CodeとNext.js App Routerが相性よい理由

App RouterはServer ComponentsとClient Componentsという「境界」の設計が重要です。この境界判断を誤ると、不必要な`’use client’`が増えてパフォーマンスが下がったり、逆にサーバー側でしか動かないコードがクライアントに入ってエラーになったりします。

Claude Codeにこのルールをあらかじめ教えておけば、コンポーネントを生成するたびに正しい境界を意識したコードを出力してくれます。また、Next.js 15以降の「paramsの非同期化」や16の「`’use cache’`ディレクティブ」といった変更点も、CLAUDE.mdに書いておくだけで自動的に対応したコードが生成されます。

  • 設計判断の補助: Server/Client境界・キャッシュ戦略の迷いを即座に解消できる
  • 破壊的変更への対応: Next.js 15/16の変更点をCLAUDE.mdに書けば自動対応
  • フルスタック一貫生成: スキーマ→Server Actions→UIを文脈を保ったまま連続生成できる
  • 公式エージェントサポート: Next.js 16.2.1以降、create-next-appがCLAUDE.mdを自動生成する

コピペで使えるCLAUDE.mdテンプレート(Next.js 16対応)

以下のテンプレートをプロジェクトルートのCLAUDE.mdに配置してください。Next.js 16 + Tailwind CSS v4 + shadcn/ui v4 + Prisma 7の構成を想定しています。

CLAUDE.md テンプレート(Next.js 16対応)
# Next.js 16 フルスタック開発ルール

@AGENTS.md

## プロジェクト構成
- Next.js 16 App Router専用(Pages Router/getServerSideProps/getStaticPropsは使用禁止)
- TypeScript strict: true(anyは禁止、unknownかgenericsを使う)
- Tailwind CSS v4(tailwind.config.tsは不要、globals.cssの@themeで設定)
- shadcn/ui v4(CLIでインストール、直接編集禁止)
- Prisma 7(importパスは@/generated/prisma/client、@prisma/clientは不可)
- Zod(バリデーション統一)

## ディレクトリ構造
src/
  app/           # App Router(page.tsx, layout.tsx, loading.tsx, error.tsx必須)
  components/    # UIコンポーネント
  actions/       # Server Actions("use server"専用ファイル)
  lib/           # DB接続(db.ts)・ユーティリティ
  types/         # 型定義

## コンポーネントルール(重要)
- デフォルトはServer Components
- "use client"はonClick/useState/useEffectなどインタラクションが必要な箇所のみ
- データ取得のためだけにClient Componentにしない
- Server Componentsでasync/awaitを使いDBを直接取得する
- loading.tsxとerror.tsxをすべての非同期ルートに追加する

## データ取得・変更のルール
- データ取得: Server ComponentsでPrisma/Drizzleを直接await
- ミューテーション: Server Actions("use server" + Zodバリデーション + revalidatePath)
- 内部データアクセスにAPIルートを使わない(webhookや外部公開APIのみRoute Handlers使用)
- useEffectでの初期データ取得は禁止

## キャッシング(Next.js 16の"use cache")
- 静的コンテンツ: "use cache"ディレクティブ + cacheLife()
- キャッシュ無効化: cacheTag() + revalidateTag()(Server Actions内)
- "use cache"内でcookies()/headers()を直接呼ばない(外で読んで引数として渡す)

## Next.js 16の変更点(必ず従うこと)
- params/searchParams/cookies()/headers()/draftMode()はすべてPromise型→awaitが必要
- middleware.tsはproxy.tsにリネーム推奨(新しいプロジェクト)
- Turbopackがデフォルトバンドラー(webpackは--webpackフラグで切替)
- next lintコマンド廃止(ESLintを直接使う)

## Prisma 7の変更点
- importパス: @/generated/prisma/client(@prisma/clientは廃止)
- @prisma/adapter-pgが必須: npm install @prisma/adapter-pg pg
- P2002エラーのmeta.targetの取得方法が変更(コードコメントで補足)

## 禁止事項
- Pages Router/getServerSideProps/getStaticPropsの使用
- any型の使用
- useEffectでのデータフェッチ
- 内部データアクセスにAPIルートを使う
- shadcn/uiコンポーネントの直接編集
- キャッシュ設定なしの裸のfetch()
Next.js 16.2.1以降はcreate-next-app実行時にAGENTS.mdが自動生成されます。CLAUDE.mdの先頭に@AGENTS.mdと書くだけで、公式推奨ルールを自動読み込みできます。

Server Components / Client Componentsの境界をClaude Codeに正しく指示する

'use client'の乱用はNext.jsパフォーマンスの大敵です。CLAUDE.mdにルールを書いておくだけでなく、コンポーネント生成時の指示にも意図を明示することが重要です。

コンポーネント生成の効果的な指示
# NG: 意図が不明確
「ユーザー一覧コンポーネントを作って」

# OK: Server Componentsを意図として明示
「ユーザー一覧のServer Componentを作ってください。
- DBから直接データを取得(useEffectは不使用)
- loading.tsxとerror.tsxも作成
- ページネーションはsearchParamsで管理
- 検索フィールドのみ別途Client Componentとして分離」
Claudeが生成するコンポーネントの例
// app/users/page.tsx(Server Component)
import { Suspense } from "react";
import { db } from "@/lib/db";
import { UserList } from "@/components/user-list";
import { UserSearch } from "@/components/user-search"; // Client Component

type Props = {
  searchParams: Promise<{ page?: string; q?: string }>;
};

export default async function UsersPage({ searchParams }: Props) {
  // Next.js 16: searchParamsはPromise型→awaitが必要
  const { page = "1", q = "" } = await searchParams;

  const users = await db.user.findMany({
    where: q ? { name: { contains: q } } : undefined,
    take: 20,
    skip: (Number(page) - 1) * 20,
    select: { id: true, name: true, email: true, createdAt: true },
  });

  return (
    <div>
      {/* 検索は状態管理が必要なのでClient Component */}
      <UserSearch defaultValue={q} />
      <Suspense fallback={&lt;div&gt;読み込み中...&lt;/div&gt;}&gt;
        <UserList users={users} />
      </Suspense>
    </div>
  );
}
paramssearchParamsはNext.js 15以降でPromise型になりました。Claude CodeにCLAUDE.mdを読ませておけば自動的にawaitつきのコードを生成します。

Server Actionsをきれいに自動生成させる

Server Actionsの生成は、フォーマットを統一した指示を出すことでコードの一貫性を保てます。

Server Actions生成プロンプト
src/actions/post.tsにブログ投稿のServer Actionsを実装してください。

仕様:
- createPost: タイトル・コンテンツを受け取りDBに保存
- updatePost: IDと更新内容を受け取り更新
- deletePost: IDを受け取りソフトデリート

実装規約:
- "use server"ディレクティブ必須
- Zodで入力バリデーション
- 戻り値: { success: boolean, error?: string, data?: T } の統一フォーマット
- revalidatePath("/posts")でキャッシュ再検証
- エラーメッセージは日本語で
- 未認証の場合はunauthorizedError()を返す
生成されるServer Actionsの例
"use server";

import { z } from "zod";
import { revalidatePath } from "next/cache";
import { db } from "@/lib/db";

const createPostSchema = z.object({
  title: z.string().min(1, "タイトルを入力してください").max(200),
  content: z.string().min(1, "本文を入力してください"),
});

type ActionResult&lt;T = void&gt; = {
  success: boolean;
  error?: string;
  data?: T;
};

export async function createPost(
  formData: FormData
): Promise&lt;ActionResult&lt;{ id: string }&gt;&gt; {
  const raw = {
    title: formData.get("title"),
    content: formData.get("content"),
  };

  const parsed = createPostSchema.safeParse(raw);
  if (!parsed.success) {
    return { success: false, error: parsed.error.errors[0].message };
  }

  try {
    const post = await db.post.create({
      data: {
        title: parsed.data.title,
        content: parsed.data.content,
        status: "DRAFT",
      },
      select: { id: true },
    });
    revalidatePath("/posts");
    return { success: true, data: { id: post.id } };
  } catch {
    return { success: false, error: "投稿の作成に失敗しました" };
  }
}

‘use cache’ディレクティブをClaude Codeに使わせる(Next.js 16)

Next.js 16で安定版になった'use cache'ディレクティブは、関数やコンポーネントの戻り値をキャッシュする機能です。従来のfetchオプションよりも細かい制御ができます。

use cache の使い方をClaude Codeに指示する
src/lib/queries.tsにブログ投稿の取得関数を実装してください。

キャッシング要件:
- 投稿一覧: 1時間キャッシュ。投稿が変更されたら無効化
- 投稿詳細: 1日キャッシュ。その投稿が更新されたら無効化
- Next.js 16の"use cache"ディレクティブを使う
use cache を使った取得関数の例
"use cache";

import { cacheLife, cacheTag } from "next/cache";
import { db } from "./db";

// 投稿一覧: 1時間キャッシュ
export async function getPosts() {
  cacheLife("hours");       // 1時間キャッシュ
  cacheTag("posts");        // revalidateTag("posts")で無効化

  return db.post.findMany({
    where: { status: "PUBLISHED", deletedAt: null },
    orderBy: { publishedAt: "desc" },
    take: 20,
    select: { id: true, title: true, publishedAt: true },
  });
}

// 投稿詳細: 1日キャッシュ(投稿IDごとにタグを設定)
export async function getPostById(id: string) {
  cacheLife("days");        // 1日キャッシュ
  cacheTag("posts", `post-${id}`);  // 個別無効化も可能

  return db.post.findUnique({
    where: { id, status: "PUBLISHED" },
    include: { author: { select: { name: true } } },
  });
}
投稿更新時にキャッシュを無効化するServer Action
"use server";

import { revalidateTag } from "next/cache";
import { db } from "@/lib/db";

export async function updatePost(id: string, data: { title: string }) {
  await db.post.update({ where: { id }, data });

  // この投稿のキャッシュだけを無効化
  revalidateTag(`post-${id}`);
  // 一覧のキャッシュも無効化
  revalidateTag("posts");

  return { success: true };
}
'use cache'関数の中でcookies()headers()を直接呼ぶとビルドエラーになります。外のコンポーネントで読んで引数として渡す必要があります。CLAUDE.mdに明記しておきましょう。

shadcn/ui CLI v4とClaude Codeの連携(2026年3月最新)

shadcn/ui CLI v4(2026年3月)では、AIエージェントとの統合を意識した新機能が追加されました。

shadcn Skillsを使ってコンテキストを自動補完

shadcn/skillsを追加すると、Claude Codeがshadcn/uiのコンポーネントAPI・バリアント・プロパティを正確に把握した状態でUIを生成できます。

shadcn Skillsの追加
# shadcn/ui Skillをインストール
npx shadcn@latest skills add

# Claude Codeで自動的にコンテキストが補完される
# → shadcn/uiの最新APIに基づいたコードが生成される

コンポーネントのドライラン確認

shadcn CLIの新フラグ活用
# 変更内容を事前確認(ファイル変更なし)
npx shadcn@latest add button --dry-run

# 差分を確認
npx shadcn@latest add button --diff

# プリセットで設定を一括投入
npx shadcn@latest init --preset a1Dg5eFl
shadcn/uiコンポーネント生成の指示例
shadcn/uiを使って投稿フォームを作成してください。

使用コンポーネント:
- Form(react-hook-form統合版)
- Input(タイトル)
- Textarea(本文)
- Select(カテゴリ選択)
- Button(送信・下書き保存)

仕様:
- Server Actionsと接続
- バリデーションエラーをフォームフィールドに表示
- 送信中はボタンをdisabled + loading spinner表示
- 成功時にtoastで通知

Prisma 7のNext.js 16への接続設定

Prisma 7(2025年11月)はTypeScriptで再実装され、importパスが変わりました。Next.jsプロジェクトでの設定方法を解説します。

Prisma 7のインストールと設定
npm install prisma@latest @prisma/adapter-pg pg
npx prisma init --datasource-provider postgresql
src/lib/db.ts(Prisma 7対応)
import { PrismaPg } from "@prisma/adapter-pg";
// Prisma 7: importパスが変更(@prisma/client → @/generated/prisma/client)
import { PrismaClient } from "@/generated/prisma/client";
import { Pool } from "pg";

const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const adapter = new PrismaPg(pool);

const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };

export const db =
  globalForPrisma.prisma ??
  new PrismaClient({ adapter });

if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = db;
}
Prisma 7ではprisma.config.tsが新しい設定ファイルです。CLAUDE.mdに「@prisma/clientではなく@/generated/prisma/clientからimport」と書いておかないと、Claude Codeが古いimportパスを生成してしまいます。

Claude CodeがNext.jsで失敗しやすいパターンと防止策

Claude Codeが古い知識やトレーニングデータの偏りから誤ったNext.jsコードを生成しやすいパターンをまとめます。CLAUDE.mdに防止ルールを書いておくことで大半を防げます。

失敗パターン 問題 CLAUDE.mdでの防止策
'use client'を過剰に付与 不必要なClient Componentが増えてパフォーマンス低下 'use client'はonClick/useState/useEffectが必要な箇所のみ。データ取得のためにClient Componentにしない」
CRUDにAPIルートを使う Route Handlersを内部ミューテーションに使うのはNext.js 13以前の習慣 「内部ミューテーションはServer Actions。Route Handlersはwebhook・外部公開APIのみ」
paramsをawaitしない Next.js 15+でparamsがPromise型に変更。型エラー・動作不良 「params/searchParams/cookies()/headers()はすべてawaitが必要(Next.js 16)」
'use cache'内でcookies()呼び出し ビルドエラーになる 'use cache'内でcookies()/headers()を直接呼ばない。外で読んで引数として渡す」
Prisma 7の旧importパス使用 @prisma/clientは廃止 「Prisma 7: importパスは@/generated/prisma/client@prisma/clientは不可)」
useEffectでデータ取得 Server ComponentsのasyncパターンがNext.jsの推奨 「useEffectでの初期データ取得は禁止。Server Componentでasync/awaitを使う」
Tailwind v4でtailwind.config.tsを生成 Tailwind CSS v4はglobals.cssで設定 「Tailwind CSS v4: tailwind.config.tsは不要。globals.cssの@themeで設定する」

Next.js DevTools MCPでAI支援デバッグを使う

Next.js 16にはAIエージェント向けのDevTools MCP統合が追加されました。ビルドエラーやランタイムエラーをClaude Codeが直接確認してデバッグできます。

Next.js DevTools MCPの設定
# .mcp.jsonに設定を追加
{
  "mcpServers": {
    "nextjs-devtools": {
      "command": "npx",
      "args": ["@next/devtools-mcp"]
    }
  }
}
DevTools MCPを使った会話例
# Claude Codeのターミナルで
> 現在のビルドエラーの詳細を確認して原因を特定して

> /_next/data/...のこのページのハイドレーションエラーを調査して

> Turbopackのバンドル結果を確認して、バンドルサイズが大きいモジュールを特定して

# → Claude CodeがDevTools MCP経由でNext.jsのデバッグ情報に直接アクセスする

MCPの詳しい設定についてはClaude Code MCP完全ガイドをご覧ください。

フルスタックアプリを一気通貫で構築する実践ワークフロー

CLAUDE.mdを設定した後の実際の開発フローを示します。

フルスタックアプリの段階的構築プロンプト
# Step 1: スキーマ設計
「schema.prismaを作成してください。
エンティティ: User, Post(下書き/公開), Tag(多対多)
N+1対策のインデックス設計も含めてください」

# Step 2: Server Actions生成
「src/actions/post.tsにPostのCRUD Server Actionsを実装してください。
Zodバリデーション + { success, error?, data? } フォーマット統一」

# Step 3: ページとコンポーネント生成
「app/posts/page.tsxを作成してください。
- Server Componentで投稿一覧を取得
- use cacheで1時間キャッシュ
- shadcn/uiのCardコンポーネントで表示
- searchParamsによるページネーション」

# Step 4: フォームUI生成
「app/posts/new/page.tsxに投稿作成フォームを作成してください。
- shadcn/uiのForm(react-hook-form統合版)を使用
- Server Actionsと接続
- バリデーションエラー表示・成功時toast通知」

# Step 5: ビルド確認
「next buildを実行して、エラーや警告があれば修正してください」
各ステップを「一気通貫」で依頼するより、段階的に進めてビルドが通ることを確認しながら進むと安定します。特にNext.js特有の型エラー(paramsのPromise型など)はビルド時に検出されるため、Step 5を挟む習慣をつけることをおすすめします。

よくある質問

QNext.js 16の”use cache”とreact-queryはどう使い分けますか?
A'use cache'はサーバー側のキャッシング(DBクエリ・外部API呼び出しの結果を再利用)に使います。TanStack Query(react-query)はクライアント側のキャッシング・楽観的更新・リアルタイム同期に使います。ユーザー固有のデータ(認証後のデータ)はtanstack-queryが適しており、公開コンテンツのキャッシングは'use cache'が適しています。
QClaude CodeがPages Routerのコードを生成してしまいます。どうすれば防げますか?
ACLAUDE.mdに「Pages Router・getServerSideProps・getStaticPropsの使用を禁止。App Routerのみ使用」と明記してください。さらに@AGENTS.mdを読み込むことで、Next.jsの公式エージェントルール(node_modules内のドキュメントを参照する指示)が追加されます。
QPrisma 7に移行する際の主な変更点は何ですか?
A最も大きな変更はimportパスです。@prisma/clientから@/generated/prisma/clientに変わり、@prisma/adapter-pgが必須になりました。バンドルサイズは約14MBから1.6MBに削減され、findManyのパフォーマンスも大幅に改善しています。移行作業自体はschema.prismaのgeneratorを修正してimportを置換する程度で完了します。
Qshadcn/uiのコンポーネントをClaude Codeが古いAPIで生成します。どうすれば最新版を使えますか?
Anpx shadcn@latest skills addでshadcn Skillsをインストール」するとClaude Codeがshadcn/uiの最新APIを参照できるようになります。また、CLAUDE.mdに「shadcn/uiのバージョンはv4。CLIで追加したコンポーネントを直接編集しない」と明記しておくことも有効です。
QServer Actionsのエラーハンドリングはどう設計すべきですか?
A{ success: boolean, error?: string, data?: T }の統一フォーマットをCLAUDE.mdで指定することで、全Server Actionsのエラーハンドリングを一貫させられます。フロントエンド側でもこの型に合わせたエラー表示コンポーネントを作れば、Server Actions全体で同じUIパターンが使えます。

まとめ

Claude CodeとNext.js App Routerの組み合わせを最大限活かすポイントをまとめます。

  • CLAUDE.mdテンプレートの設置が最優先: Server/Client境界・params非同期化・Prisma 7のimportパスをCLAUDE.mdに書いておくだけで、生成コードの品質が大きく変わる
  • Next.js 16の新機能を積極的に使わせる: 'use cache'・Turbopackのルールを書いておけば自動的に最新パターンで生成される
  • 段階的な構築で品質を担保: スキーマ→Server Actions→UI→ビルド確認の順で進めると型エラーを早期検出できる
  • shadcn Skills + Next.js DevTools MCPで補完: UI生成の精度向上とデバッグの効率化が図れる
  • 失敗パターン7種をCLAUDE.mdで防止: 特に'use client'の乱用・paramsの非同期化漏れ・Prisma 7のimportパスは要注意

データベース連携についてはClaude Code × データベース開発ガイド、ワークフロー全体についてはClaude Codeワークフロー完全ガイドもあわせてご覧ください。