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との連携まで、フルスタック開発の全工程をカバーします。
- Claude CodeとNext.js App Routerが相性よい理由
- コピペで使えるCLAUDE.mdテンプレート(Next.js 16対応)
- Server Components / Client Componentsの境界をClaude Codeに正しく指示する
- Server Actionsをきれいに自動生成させる
- ‘use cache’ディレクティブをClaude Codeに使わせる(Next.js 16)
- shadcn/ui CLI v4とClaude Codeの連携(2026年3月最新)
- Prisma 7のNext.js 16への接続設定
- Claude CodeがNext.jsで失敗しやすいパターンと防止策
- Next.js DevTools MCPでAI支援デバッグを使う
- フルスタックアプリを一気通貫で構築する実践ワークフロー
- よくある質問
- まとめ
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の構成を想定しています。
# 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()
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として分離」
// 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={<div>読み込み中...</div>}>
<UserList users={users} />
</Suspense>
</div>
);
}
params・searchParamsはNext.js 15以降でPromise型になりました。Claude CodeにCLAUDE.mdを読ませておけば自動的にawaitつきのコードを生成します。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()を返す
"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<T = void> = {
success: boolean;
error?: string;
data?: T;
};
export async function createPost(
formData: FormData
): Promise<ActionResult<{ id: string }>> {
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オプションよりも細かい制御ができます。
src/lib/queries.tsにブログ投稿の取得関数を実装してください。 キャッシング要件: - 投稿一覧: 1時間キャッシュ。投稿が変更されたら無効化 - 投稿詳細: 1日キャッシュ。その投稿が更新されたら無効化 - Next.js 16の"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 } } },
});
}
"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/ui Skillをインストール npx shadcn@latest skills add # Claude Codeで自動的にコンテキストが補完される # → shadcn/uiの最新APIに基づいたコードが生成される
コンポーネントのドライラン確認
# 変更内容を事前確認(ファイル変更なし) npx shadcn@latest add button --dry-run # 差分を確認 npx shadcn@latest add button --diff # プリセットで設定を一括投入 npx shadcn@latest init --preset a1Dg5eFl
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プロジェクトでの設定方法を解説します。
npm install prisma@latest @prisma/adapter-pg pg npx prisma init --datasource-provider postgresql
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.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が直接確認してデバッグできます。
# .mcp.jsonに設定を追加
{
"mcpServers": {
"nextjs-devtools": {
"command": "npx",
"args": ["@next/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を実行して、エラーや警告があれば修正してください」
よくある質問
'use cache'はサーバー側のキャッシング(DBクエリ・外部API呼び出しの結果を再利用)に使います。TanStack Query(react-query)はクライアント側のキャッシング・楽観的更新・リアルタイム同期に使います。ユーザー固有のデータ(認証後のデータ)はtanstack-queryが適しており、公開コンテンツのキャッシングは'use cache'が適しています。@AGENTS.mdを読み込むことで、Next.jsの公式エージェントルール(node_modules内のドキュメントを参照する指示)が追加されます。@prisma/clientから@/generated/prisma/clientに変わり、@prisma/adapter-pgが必須になりました。バンドルサイズは約14MBから1.6MBに削減され、findManyのパフォーマンスも大幅に改善しています。移行作業自体はschema.prismaのgeneratorを修正してimportを置換する程度で完了します。npx shadcn@latest skills addでshadcn Skillsをインストール」するとClaude Codeがshadcn/uiの最新APIを参照できるようになります。また、CLAUDE.mdに「shadcn/uiのバージョンはv4。CLIで追加したコンポーネントを直接編集しない」と明記しておくことも有効です。まとめ
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ワークフロー完全ガイドもあわせてご覧ください。

