【Next.js】Multiple Root Layouts
當你想在 Next.js App Router 中讓不同的頁面使用 不同的根 layout(Multiple Root Layouts),你可以透過「路由分組(Route Groups)」來達成。
這是一種官方推薦的做法,可以讓你做到:
✨ 不同路由區段有不同的外框架(Header、Sidebar、樣式主題...),互不影響。
✅ 為什麼需要 Multiple Root Layouts?
你可能有這些需求:
區塊 | 特性 |
---|---|
/ |
使用全站基本 layout |
/admin |
使用管理後台 layout(含側邊欄) |
/auth |
不需要 layout,例如登入頁 |
🎯 解法:使用 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
:
export default function SiteLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
<header>網站主選單</header>
<main>{children}</main>
<footer>頁尾</footer>
</body>
</html>
);
}
app/(admin)/layout.tsx
:
export default function AdminLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
<aside>後台選單</aside>
<section>{children}</section>
</body>
</html>
);
}
app/(auth)/layout.tsx
:
export default function AuthLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
{children} {/* 沒有 header/footer */}
</body>
</html>
);
}
📌 注意事項
問題 | 說明 |
---|---|
Group 名稱會出現在網址嗎? | ❌ 不會出現,只是用來分開 layout 結構 |
可以混用 layout 嗎? | ✅ 每個 group 是獨立 root layout |
可以共用 components 嗎? | ✅ 沒問題,只要透過 import 即可 |
🧠 小結
技術 | 說明 |
---|---|
Route Group (xxx) |
幫你在不改網址的前提下拆分 layout 結構 |
Multiple Layouts | 實現不同頁面區塊有各自獨立外觀、結構 |
頁面掛在哪個 group 就用哪個 layout | 完全分離,互不影響 |