mcpField
N
nextjs

nextjs

github.com/secondsky開発244285 回インストール6 週間前に更新
リポジトリ

nextjs について

Next.js アプリの開発や保守向けに、App Router の本番パターンをまとめたスキルです。Next.js 16 の変更点、サーバー機能、キャッシュ、ルーティング、パフォーマンス、問題の診断を扱います。

主な機能

  1. 01Next.js 16 の移行ガイド
  2. 02Server Components と Server Actions
  3. 03キャッシュ API と Cache Components
  4. 04Route Handlers と proxy パターン
  5. 05Metadata、画像、フォントの最適化
  6. 06エラー資料とテンプレート

活用シーン

  1. 01App Router プロジェクトを Next.js 15 から 16 に移行
  2. 02Server Actions によるフォームの実装
  3. 03キャッシュ無効化と再検証の設定
  4. 04ルーティングやハイドレーションのエラー診断

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/secondsky/claude-skills --skill nextjs

インストール後、Claude Code で/nextjsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
caching-apis.md
error-catalog.md
next-16-migration-guide.md
server-actions-patterns.md
top-errors.md
scripts/
check-versions.sh
templates/
app-router-async-params.tsx
async-params-page.tsx
cache-component-use-cache.tsx
package.json
parallel-routes-with-default.tsx
proxy-migration.ts
route-handler-api.ts
server-action-form.tsx
server-actions-form.tsx

詳細

Next.js App Router - 本番環境向けパターン

バージョン: Next.js 16.2.0 React バージョン: 19.2.0 Node.js: 20.9+ 最終確認日: 2025-11-21

目次

  1. このスキルを使用する場面
  2. このスキルを使用しない場面
  3. Next.js 16 の破壊的変更
  4. Cache Components とキャッシュ API
  5. サーバーコンポーネント
  6. サーバーアクション
  7. ルートハンドラー
  8. React 19.2 の機能
  9. メタデータ API
  10. 画像とフォントの最適化
  11. 重大なエラーの上位 5 件
  12. パフォーマンスパターン
  13. TypeScript の設定

このスキルを使用する場面

次のことが必要な場合に、このスキルを使用してください。

  • Next.js 16 App Router のパターン(レイアウト、読み込み、エラーバウンダリー、ルーティング)
  • サーバーコンポーネントのベストプラクティス(データ取得、合成、ストリーミング)
  • サーバーアクションのパターン(フォーム、ミューテーション、再検証、エラー処理)
  • "use cache" ディレクティブを使用した Cache Components(Next.js 16 の新機能)
  • 新しいキャッシュ API:revalidateTag()、updateTag()、refresh()(Next.js 16 で更新)
  • Next.js 15 から 16 への移行(非同期 params、proxy.ts、並列ルート)
  • ルートハンドラー(API エンドポイント、Webhook、ストリーミングレスポンス)
  • プロキシパターン(Next.js 16 では proxy.ts が middleware.ts に置き換わります)
  • 非同期ルート params(params、searchParams、cookies()、headers() が非同期になりました)
  • default.js を使用した並列ルート(Next.js 16 での破壊的変更)
  • React 19.2 の機能(View Transitions、useEffectEvent()、React Compiler)
  • メタデータ API(SEO、Open Graph、Twitter カード、サイトマップ)
  • 画像の最適化(Next.js 16 でデフォルト設定が更新された next/image)
  • パフォーマンスの最適化(遅延読み込み、コード分割、PPR、ISR)

このスキルを使用しない場面

次の用途には、このスキルを使用しないでください。

  • Cloudflare Workers へのデプロイ → cloudflare-nextjs スキルを使用してください(OpenNext アダプター:@opennextjs/cloudflare、getCloudflareContext、キャッシュ階層、Workers 固有のエラー)。注:cloudflare-nextjs は Cloudflare における proxy.ts の例外を扱います(そこでは middleware.ts を使用してください)。
  • Pages Router のパターン → このスキルが対象とするのは App Router のみです(Pages Router はレガシーです)
  • 認証ライブラリ → clerk-auth、auth-js、または認証に特化した他のスキルを使用してください
  • データベース統合 → cloudflare-d1、drizzle-orm-d1、またはデータベースに特化したスキルを使用してください
  • UI コンポーネントライブラリ → Tailwind + shadcn/ui には tailwind-v4-shadcn スキルを使用してください
  • 状態管理 → zustand-state-management、tanstack-query スキルを使用してください
  • フォームライブラリ → react-hook-form-zod スキルを使用してください

Next.js 16 の破壊的変更

重要:Next.js 16 には複数の破壊的変更があります。詳細な移行手順については、references/next-16-migration-guide.md を参照してください。

破壊的変更変更前変更後
非同期 paramsparams.slugconst { slug } = await params
非同期ヘッダーcookies() 同期await cookies()
Middlewaremiddleware.tsproxy.ts(名称変更)
並列ルートdefault.js は任意default.js 必須
キャッシュfetch を自動キャッシュ"use cache" で明示的に有効化
revalidateTag()引数 1 つ引数 2 つ(tag + cacheLife)
Node.js18.x+20.9+ が必須
React18.x19.2+ が必須

非同期 params のクイック修正:

// ✅ Next.js 16 pattern
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
  const { id } = await params
  return <div>{id}</div>
}

Codemod:bunx @next/codemod@canary upgrade latest

参照:例を含む完全な移行ガイドについては、references/next-16-migration-guide.md を参照してください。


Cache Components とキャッシュ API

"use cache" ディレクティブ(Next.js 16 の新機能)
'use cache'

export async function BlogPosts() {
  const posts = await db.posts.findMany()
  return posts.map(post => <article key={post.id}>{post.title}</article>)
}
キャッシュ API の概要
API目的例
"use cache"コンポーネント/関数のキャッシュをオプトイン'use cache' を先頭に記述
revalidateTag()タグで無効化revalidateTag('posts', 'max')
updateTag()再検証せずにキャッシュを更新updateTag('posts', newData)
refresh()現在のページを更新refresh()
revalidatePath()パスで無効化revalidatePath('/posts')
PPR(部分的なプリレンダリング)
// next.config.ts
const config = { experimental: { ppr: true } }

// page.tsx
export const experimental_ppr = true

export default function Page() {
  return (
    <>
      <StaticHeader />
      <Suspense fallback={<Skeleton />}>
        <DynamicContent />
      </Suspense>
    </>
  )
}

参照先:ISR、タグベースの再検証、高度なパターンを含むキャッシュ API の完全なリファレンスについては、references/caching-apis.md をご覧ください。


サーバーコンポーネント

App Router では、サーバーコンポーネントがデフォルトです。サーバー上で実行され、データの取得やデータベースへのアクセスができ、ロジックをサーバー側に保持できます。

// app/posts/page.tsx (Server Component by default)
export default async function PostsPage() {
  const posts = await db.posts.findMany()
  return <div>{posts.map(p => <article key={p.id}>{p.title}</article>)}</div>
}
Suspense によるストリーミング
import { Suspense } from 'react'

export default function Page() {
  return (
    <div>
      <Header />
      <Suspense fallback={<Skeleton />}>
        <Posts />
      </Suspense>
    </div>
  )
}
サーバーコンポーネントとクライアントコンポーネント
サーバーコンポーネントクライアントコンポーネント
データ取得、DB アクセスインタラクティブ性(onClick)
機密性の高いロジックReact フック(useState)
大きな依存関係ブラウザー API
静的コンテンツリアルタイム更新

クライアントコンポーネント('use client' が必要):

'use client'
import { useState } from 'react'
export function Counter() {
  const [count, setCount] = useState(0)
  return <button onClick={() => setCount(count + 1)}>{count}</button>
}

サーバーアクション

サーバーアクションは、サーバー上で実行され、クライアントコンポーネントまたはサーバーコンポーネントから呼び出せる非同期関数です。

基本的なサーバーアクション
// app/actions.ts
'use server'

import { revalidatePath } from 'next/cache'

export async function createPost(formData: FormData) {
  const title = formData.get('title') as string
  await db.posts.create({ data: { title } })
  revalidatePath('/posts')
}
フォーム処理
// Server Component Form (simplest)
import { createPost } from './actions'

export default function NewPostPage() {
  return (
    <form action={createPost}>
      <input name="title" required />
      <button type="submit">Create</button>
    </form>
  )
}
利用可能なパターン
パターン用途参照先
ローディング表示付きクライアントフォームuseFormState + useFormStatustemplates/server-action-form.tsx
エラー処理{ error } または { success } を返すreferences/server-actions-patterns.md
楽観的更新useOptimistic フックreferences/server-actions-patterns.md
ファイルアップロードFormData + blob ストレージreferences/server-actions-patterns.md
アクション後のリダイレクトredirect() 関数references/server-actions-patterns.md

参照先:エラー処理、楽観的更新、ファイルアップロード、高度なパターンについては、references/server-actions-patterns.md をご覧ください。


ルートハンドラー

ルートハンドラーは、App Router における API Routes に相当します。

// app/api/posts/route.ts
export async function GET(request: Request) {
  const posts = await db.posts.findMany()
  return Response.json({ posts })
}

export async function POST(request: Request) {
  const body = await request.json()
  const post = await db.posts.create({ data: body })
  return Response.json({ post }, { status: 201 })
}

動的ルート(非同期 params を使用):

// app/api/posts/[id]/route.ts
export async function GET(
  request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  const { id } = await params // Await in Next.js 16
  const post = await db.posts.findUnique({ where: { id } })
  return post ? Response.json({ post }) : Response.json({ error: 'Not found' }, { status: 404 })
}

参照先:検索パラメーター、Webhook、ストリーミングのパターンについては、templates/route-handler-api.ts をご覧ください。


React 19.2 の機能

機能使用方法
React Compilerexperimental: { reactCompiler: true } - 自動メモ化
View TransitionsuseTransition() + router.push()
useEffectEventdeps を指定せずに安定したイベントハンドラーを使用

メタデータ API

// Static metadata
export const metadata: Metadata = {
  title: 'My Blog',
  description: 'A blog about Next.js',
  openGraph: { title: 'My Blog', images: ['/og-image.jpg'] },
}

// Dynamic metadata (await params in Next.js 16)
export async function generateMetadata({ params }: { params: Promise<{ id: string }> }) {
  const { id } = await params
  const post = await db.posts.findUnique({ where: { id } })
  return { title: post.title, description: post.excerpt }
}

画像とフォントの最適化

// next/image
import Image from 'next/image'
<Image src="/profile.jpg" alt="Profile" width={500} height={500} priority />

// next/font
import { Inter } from 'next/font/google'
const inter = Inter({ subsets: ['latin'], variable: '--font-inter' })
<html className={inter.variable}>

リモート画像:next.config.ts で images.remotePatterns を設定します。


重大なエラー上位 5 件

エラー 1:params は Promise です

エラー:Type 'Promise<{ id: string }>' is not assignable to type '{ id: string }'

解決策:Next.js 16 では params を await します:

export default async function Page({ params }: { params: Promise<{ id: string }> }) {
  const { id } = await params
}

エラー 2:middleware.ts は非推奨です

警告:middleware.ts is deprecated. Use proxy.ts instead.

解決策:ファイル名と関数名を変更します:

// Rename: middleware.ts → proxy.ts
// Rename function: middleware → proxy
export function proxy(request: NextRequest) {
  // Same logic
}

エラー 3:並列ルートに default.js がありません

エラー:Parallel route @modal was matched but no default.js was found

解決策:default.tsx を追加します:

// app/@modal/default.tsx
export default function ModalDefault() {
  return null
}

エラー 4:サーバーコンポーネントでは React フックを使用できません

エラー:You're importing a component that needs useState. It only works in a Client Component

解決策:'use client' を追加します:

'use client'

import { useState } from 'react'

export function Counter() {
  const [count, setCount] = useState(0)
  return <button onClick={() => setCount(count + 1)}>{count}</button>
}

エラー 5:fetch() がキャッシュされません

原因:Next.js 16 では "use cache" によるオプトイン方式のキャッシュが使用されます。

解決策:"use cache" ディレクティブを追加します:

'use cache'

export async function getPosts() {
  const response = await fetch('/api/posts')
  return response.json()
}

18 件のエラーすべてを参照:references/error-catalog.md


パフォーマンスパターン

パターン用途
遅延読み込みconst HeavyComp = dynamic(() => import('./Heavy'), { ssr: false })
コード分割ルートごとに自動で分割されます。各 page.tsx は独自のバンドルを取得します
TurbopackNext.js 16 ではデフォルトです。--webpack フラグで無効にできます
PPRexperimental: { ppr: true } と <Suspense> 境界を使用します

TypeScript の設定

{
  "compilerOptions": {
    "strict": true,
    "baseUrl": ".",
    "paths": { "@/*": ["./*"] }
  }
}

リファレンスを読み込むタイミング

リファレンス読み込むタイミング
next-16-migration-guide.mdNext.js 15 からの移行時、非同期パラメーターのエラー発生時、proxy.ts の設定時
server-actions-patterns.mdエラー処理、楽観的更新、ファイルのアップロード、高度なフォームを扱うとき
caching-apis.mdISR、タグベースの再検証、updateTag()、refresh()、PPR の詳細を確認するとき
error-catalog.mdNext.js のエラーをデバッグするとき、包括的なエラー解決策を確認するとき
top-errors.md最もよくある Next.js のエラー 5 件をすばやく修正するとき

同梱リソース

種類ファイル
リファレンスerror-catalog.md、top-errors.md、next-16-migration-guide.md、server-actions-patterns.md、caching-apis.md
テンプレートasync-params-page.tsx、server-action-form.tsx、route-handler-api.ts、cache-component-use-cache.tsx、parallel-routes-with-default.tsx、proxy-migration.ts

関連スキル

スキル目的
cloudflare-nextjsOpenNext アダプター(@opennextjs/cloudflare)を介して Cloudflare Workers にデプロイします
tailwind-v4-shadcnスタイリング
clerk-auth認証
drizzle-orm-d1データベース
react-hook-form-zodフォーム
zustand-state-managementクライアントの状態管理

公式ドキュメント:https://nextjs.org/docs | App Router:https://nextjs.org/docs/app


バージョン:Next.js 16.2.0 | React 19.2.0 | Node.js 20.9+ | TypeScript 5.9+ 本番環境でのテスト済み:E コマース、SaaS、コンテンツサイト | トークン削減率:65-70%

コメント