Next.js 15 App Routerマスターガイド — Server Componentsベストプラクティス
USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。
Next.js 15 App Router マスターガイド — Server Componentsベストプラクティス
Next.js 15のApp RouterはReact Server Componentsを中心とした新しいパラダイムです。2026年時点でプロダクションで検証されたベストプラクティスをまとめます。
1. ファイルシステム構造
| 項目 | 値 |
|---|---|
| 参照年 | 2026 |
| 必須ファイル | layout.tsx |
| ホームファイル | page.tsx |
| ローディングUIファイル | loading.tsx |
| エラーバウンダリファイル | error.tsx |
app/
layout.tsx # ルートレイアウト(必須)
page.tsx # ホーム /
loading.tsx # ローディングUI
error.tsx # エラーバウンダリ
not-found.tsx # 404
(marketing)/ # ルートグループ(URL影響なし)
page.tsx
blog/
[slug]/
page.tsx # /blog/xxx
api/
route.ts # RESTエンドポイントルートグループ (group):URLの構造に影響を与えずにレイアウトを共有するために使用します。
2. ServerとClientコンポーネント
サーバーがデフォルトです。 コンポーネントがクライアントコンポーネントとして扱われるには、明示的に "use client" を宣言する必要があります。
// サーバーコンポーネント(デフォルト)
async function Page() {
const user = await fetchUser() // サーバー上で直接フェッチ
return <ProfileCard user={user} />
}
// クライアントコンポーネント
"use client"
function InteractiveButton() {
const [count, setCount] = useState(0)
return <button onClick={() => setCount(count + 1)}>{count}</button>
}バウンダリの原則
"use client"はコンポーネントツリーの最も下位の葉に配置する- 上位コンポーネントはサーバーコンポーネントに保つ
- プロップスとして渡す値はシリアライズ可能である必要がある(JSON互換の型のみ)
3. データフェッチ
// 並列フェッチ
async function Page({ params }) {
const [user, posts] = await Promise.all([
fetchUser(params.id),
fetchPosts(params.id),
])
return <Dashboard user={user} posts={posts} />
}自動fetchキャッシュ:
fetch(url)— デフォルトキャッシュを使用fetch(url, { cache: "no-store" })— リクエストのたびに再フェッチfetch(url, { next: { revalidate: 60 } })— ISR、60秒ごとに再検証
4. Suspense + ストリーミング
import { Suspense } from "react"
export default function Page() {
return (
<>
<FastSection />
<Suspense fallback={<Skeleton />}>
<SlowSection />
</Suspense>
</>
)
}
async function SlowSection() {
await new Promise(r => setTimeout(r, 2000))
return <div>完了</div>
}遅いセクションのみがストリーミングされ、TTFBが即座に改善されます。
5. サーバーアクション
// app/actions.ts
"use server"
export async function createPost(formData: FormData) {
const title = formData.get("title") as string
await db.insert(posts).values({ title })
revalidatePath("/blog")
}
// app/blog/new/page.tsx
import { createPost } from "../actions"
export default function NewPost() {
return <form action={createPost}>...</form>
}REST APIなしでサーバーロジックを直接呼び出すことができ、CSRF保護は自動で処理されます。
6. エラーバウンダリ
// app/blog/error.tsx
"use client"
export default function Error({ error, reset }) {
return (
<div>
<p>{error.message}</p>
<button onClick={reset}>リトライ</button>
</div>
)
}セグメントレベルのエラーバウンダリにより、1つのパーツでエラーが発生しても残りのページは正常に機能します。
7. メタデータとSEO
export const metadata = {
title: "マイページ",
description: "...",
}
// または動的に設定
export async function generateMetadata({ params }) {
const post = await fetchPost(params.slug)
return { title: post.title }
}10のベストプラクティス
- 1サーバーをデフォルトに:
"use client"は本当に必要な場合のみ使用 - 2できるだけ上位でデータを取得:プロップスドリリングを避ける
- 3Suspenseを積極活用:ストリーミングでTTFBを最大化
- 4fetch + revalidate:Redisなしで自動キャッシュ
- 5サーバーアクション:RESTを置き換えてボイラープレートを削減
- 6dynamic = force-dynamic:パーソナライズドページのみに使用
- 7画像最適化:
コンポーネントは必須 - 8フォント最適化:
next/fontを使用 - 9
import server-only:センシティブなコードがクライアントに漏れるのを防ぐ - 10パラレルルーツ:複雑なダッシュボードには
@slotを使用
よくある間違い
- サーバーコンポーネントで
useStateを使用 → エラーが発生 - クライアントコンポーネントで
fetchを使用 → パフォーマンス低下(サーバーサイドフェッチが推奨) - プロップスとして関数またはDateを渡す → シリアライゼーションエラー
"use client"ファイルから非同期サーバーコンポーネントをインポート → 混乱を招く可能性
💡 実践的な洞察
多くのブログは「App Routerは素晴らしい、Server Componentsを使おう」で止まっていますが、プロダクション環境での重要な考慮点はCloudflare Pages / Vercel Edgeランタイムの互換性です。OpenNextでMillionsCode(18ツールサイト)を6ヶ月運営した経験から、RootLayoutや誤ったルートに export const runtime = 'edge' を配置すると即座にホワイトスクリーンが発生することが確認されています。最も安全なアプローチは設定せずにOpenNextが自動処理することです。2024年のnpmトレンドでは、App Routerの採用がPages Routerを上回っています(67% vs 33%)。新規プロジェクトではApp Routerが明確な推奨です。
まとめ
App Routerには初期の学習曲線がありますが、習得するとSPAとSSRの両方のメリットが得られる開発体験になります。2026年のNext.jsの新規プロジェクトはApp Router一択です。Pages Routerは移行対象です。
参考: Cloudflare Developer Documentation
よくある質問(FAQ)
Q1. Next.js 15 App Routerで何が変わりましたか? A. アプリ構造がServer Components・ネストされたレイアウト・ストリーミング・データキャッシュを中心に再設計されました。
Q2. App RouterとPages Router、どちらを使うべきですか? A. 新規プロジェクトではApp Routerがデフォルトです。既存サービスはルートごとに段階的に移行するのが最も現実的です。
Q3. Server Componentsのベストプラクティスは何ですか? A. コンポーネントはデフォルトでサーバーコンポーネントに保ち、インタラクティビティが必要な部分のみクライアントコンポーネントとして切り出してください。
Q4. Next.js App Routerでデータをフェッチするにはどうすればよいですか? A. サーバーコンポーネントで直接フェッチし、キャッシュ・再検証・Suspenseバウンダリを明示的に設定してください。
Q5. App Routerへの移行でよくある問題は何ですか? A. クライアントフックの配置・グローバル状態管理・メタデータの処理・キャッシュの挙動・ルーティング構造の変更などが代表的です。
Q6. Next.js 15のパフォーマンス最適化のポイントは何ですか? A. サーバーレンダリングの境界・画像最適化・キャッシュ戦略・バンドル分析・ストリーミングUXをまとめて調整することが重要です。
🔧 Related Free Tools
関連
USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
ITChatGPTで副収入を得る6つの方法 — 2026年版の実践済みマネタイズガイドUSD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
IT2026 ChatGPT vs Claude vs Gemini — AIチャットボット性能・価格・活用法を徹底比較USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...
ITウェブサイト速度最適化 2026 — Core Web Vitals 90+ 達成法USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。...