# 【Next.js】Multiple Root Layouts

當你想在 **Next.js App Router** 中讓不同的頁面使用 **不同的根 layout（Multiple Root Layouts）**，你可以透過「**路由分組（Route Groups）**」來達成。

這是一種官方推薦的做法，可以讓你做到：

> ✨ **不同路由區段有不同的外框架（Header、Sidebar、樣式主題...）**，互不影響。

---

## ✅ 為什麼需要 Multiple Root Layouts？

你可能有這些需求：

<table id="bkmrk-%E5%8D%80%E5%A1%8A-%E7%89%B9%E6%80%A7-%2F-%E4%BD%BF%E7%94%A8%E5%85%A8%E7%AB%99%E5%9F%BA%E6%9C%AC-layou"><thead><tr><th>區塊</th><th>特性</th></tr></thead><tbody><tr><td>`/`</td><td>使用全站基本 layout</td></tr><tr><td>`/admin`</td><td>使用管理後台 layout（含側邊欄）</td></tr><tr><td>`/auth`</td><td>不需要 layout，例如登入頁</td></tr></tbody></table>

---

## 🎯 解法：使用 Route Groups 分離 layout

### ✅ 語法關鍵：`(group-name)` ← 這是 **Route Group**

它：

- ✅ 不會出現在 URL 中
- ✅ 可以定義自己的 `layout.tsx`
- ✅ 可以做到多個「Root Layout」共存

---

## 📁 範例結構：三個 Root Layouts

```
app/
├── (site)/
│   ├── layout.tsx         ← 公開區域 layout
│   ├── page.tsx           ← `/`
│   └── about/
│       └── page.tsx       ← `/about`
│
├── (admin)/
│   ├── layout.tsx         ← 管理區 layout（有側邊欄）
│   └── dashboard/
│       └── page.tsx       ← `/dashboard`
│
├── (auth)/
│   ├── layout.tsx         ← 登入註冊 layout（極簡）
│   └── login/
│       └── page.tsx       ← `/login`

```

---

## 🧩 每個 layout.tsx 都是**自己的根 layout**

### `app/(site)/layout.tsx`：

```tsx
export default function SiteLayout({ children }: { children: React.ReactNode }) {
  return (
    <html>
      <body>
        <header>網站主選單</header>
        <main>{children}</main>
        <footer>頁尾</footer>
      </body>
    </html>
  );
}

```

---

### `app/(admin)/layout.tsx`：

```tsx
export default function AdminLayout({ children }: { children: React.ReactNode }) {
  return (
    <html>
      <body>
        <aside>後台選單</aside>
        <section>{children}</section>
      </body>
    </html>
  );
}

```

---

### `app/(auth)/layout.tsx`：

```tsx
export default function AuthLayout({ children }: { children: React.ReactNode }) {
  return (
    <html>
      <body>
        {children} {/* 沒有 header/footer */}
      </body>
    </html>
  );
}

```

---

## 📌 注意事項

<table id="bkmrk-%E5%95%8F%E9%A1%8C-%E8%AA%AA%E6%98%8E-group-%E5%90%8D%E7%A8%B1%E6%9C%83%E5%87%BA%E7%8F%BE%E5%9C%A8%E7%B6%B2%E5%9D%80"><thead><tr><th>問題</th><th>說明</th></tr></thead><tbody><tr><td>Group 名稱會出現在網址嗎？</td><td>❌ 不會出現，只是用來分開 layout 結構</td></tr><tr><td>可以混用 layout 嗎？</td><td>✅ 每個 group 是獨立 root layout</td></tr><tr><td>可以共用 components 嗎？</td><td>✅ 沒問題，只要透過 import 即可</td></tr></tbody></table>

---

## 🧠 小結

<table id="bkmrk-%E6%8A%80%E8%A1%93-%E8%AA%AA%E6%98%8E-route-group-%28x"><thead><tr><th>技術</th><th>說明</th></tr></thead><tbody><tr><td>Route Group `(xxx)`</td><td>幫你在不改網址的前提下拆分 layout 結構</td></tr><tr><td>Multiple Layouts</td><td>實現不同頁面區塊有各自獨立外觀、結構</td></tr><tr><td>頁面掛在哪個 group 就用哪個 layout</td><td>完全分離，互不影響</td></tr></tbody></table>

</body></html>