© TOOLS BOX — Next.js / React / TypeScript コードサンプル集

サンプルガイド
←サンプル一覧
nextjsrouting

Next.js の Route Groups で layout を分ける

Route Groups(括弧付きディレクトリ)を使い、URL 構造を変えずに異なる layout を適用する実装例。

難易度: 初級·更新: 2026-04-17

対応バージョン

nextjs 15

前提環境

Next.js App Router のディレクトリ構成(layout.tsx / page.tsx)を理解していること

概要

(folderName) の形式でディレクトリを作ると、そのフォルダ名は URL に含まれず、グループ内に独立した layout.tsx を置ける。 認証済みユーザー用レイアウト(サイドバーあり)と未認証ページ(ログイン画面)で異なる UI を適用するのが代表的なユースケース。

インストール

# 追加インストールは不要

ディレクトリ構成

src/app/
├── (marketing)/          ← URL に含まれない
│   ├── layout.tsx        ← マーケティング用 layout
│   ├── page.tsx          → /
│   └── about/
│       └── page.tsx      → /about
├── (dashboard)/          ← URL に含まれない
│   ├── layout.tsx        ← ダッシュボード用 layout(サイドバーあり)
│   ├── dashboard/
│   │   └── page.tsx      → /dashboard
│   └── settings/
│       └── page.tsx      → /settings
└── layout.tsx            ← ルート layout(全グループ共通)

実装例

// src/app/(marketing)/layout.tsx
export default function MarketingLayout({ children }: { children: React.ReactNode }) {
  return (
    <div>
      <header className="border-b px-6 py-4 text-sm font-medium">TOOLS BOX</header>
      <main className="mx-auto max-w-4xl px-6 py-8">{children}</main>
    </div>
  );
}
// src/app/(dashboard)/layout.tsx
export default function DashboardLayout({ children }: { children: React.ReactNode }) {
  return (
    <div className="flex min-h-screen">
      <nav className="w-56 border-r p-4 text-sm">
        <ul className="space-y-1">
          <li>
            <a href="/dashboard" className="block rounded px-3 py-2 hover:bg-gray-100">
              ダッシュボード
            </a>
          </li>
          <li>
            <a href="/settings" className="block rounded px-3 py-2 hover:bg-gray-100">
              設定
            </a>
          </li>
        </ul>
      </nav>
      <main className="flex-1 p-6">{children}</main>
    </div>
  );
}
// src/app/(dashboard)/dashboard/page.tsx
export default function DashboardPage() {
  return <h1 className="text-lg font-bold">ダッシュボード</h1>;
}

ポイント

  • (marketing) / (dashboard) はフォルダ名だが URL に現れない(/dashboard で直接アクセスできる)
  • グループごとに独立した layout.tsx を持てるため、ヘッダー・サイドバー・フッターの構成を分けられる
  • ルートの src/app/layout.tsx は全グループに共通して適用される(<html> / <body> はここに書く)
  • 認証フローと組み合わせる場合は middleware.ts で保護対象パスを制御する

注意点

Route Groups のディレクトリ名(括弧部分)は URL に含まれない。認証済みページと未認証ページで layout を分けるユースケースが代表的。同一階層に複数の layout.tsx を持てる。

関連サンプル

同じテーマや技術スタックを使った実装例

  • Next.js の Parallel Routes で複数スロットを同時表示する

    @スロット記法を使い、同一ページに複数の独立したルートコンテンツを並列表示する実装例。

  • Next.js Intercepting Routes で URL 付きモーダルを実装する

    Intercepting Routes((..) 記法)と Parallel Routes を組み合わせ、リスト画面の URL を維持したままモーダルで詳細を表示する実装例。

  • Next.js で not-found.tsx を使ってカスタム 404 ページを作る

    notFound() 関数と not-found.tsx を組み合わせてカスタム 404 ページを実装する例。動的ルートでリソースが存在しない場合の処理パターンを示す。

  • Next.js App Router の layout で認証チェックして配下ページを保護する

    App Router の layout.tsx でセッション Cookie を確認し、未認証ユーザーをログインページへ redirect することで配下のすべてのページを一括保護する例。

  • Next.js App Router の loading.tsx と Suspense でローディング UI を実装する

    loading.tsx を配置するだけでルートセグメント単位のローディング UI が自動適用される仕組みと、Suspense を使った部分的な待機表示の実装例。

関連仕様

このサンプルを理解するのに役立つ仕様や概念

  • FrameworkNext.jsReact ベースのフルスタックフレームワーク。SSR・SSG・App Router・API Routes を提供する。
←サンプル一覧に戻る