【Next.js】路由機制
Next.js 使用檔案結構(File System Routing)搭配 page.tsx
(或 page.jsx
)自動產生路由,這是 Next.js 的一大特色,讓你不需手動寫 route config,只要建立檔案與資料夾就能對應 URL。
🗂️ Next.js App Router 的路由機制(以 app/
為根)
app/
├── page.tsx → /
├── about/
│ └── page.tsx → /about
├── blog/
│ ├── page.tsx → /blog
│ └── [slug]/
│ └── page.tsx → /blog/hello、/blog/123
├── dashboard/
│ ├── layout.tsx → 包住 dashboard 所有子路由
│ ├── page.tsx → /dashboard
│ └── settings/
│ └── page.tsx → /dashboard/settings
🔑 路由對應邏輯
檔案名稱 | 對應路徑 (URL) | 說明 |
---|---|---|
app/page.tsx |
/ |
首頁 |
app/about/page.tsx |
/about |
靜態路由 |
app/blog/[slug]/page.tsx |
/blog/:slug |
動態路由 |
app/dashboard/page.tsx |
/dashboard |
支援巢狀路由 |
app/dashboard/settings/page.tsx |
/dashboard/settings |
巢狀子頁面 |
📌 動態路由(Dynamic Routes)
範例:
app/product/[id]/page.tsx
訪問 /product/123
、/product/abc
都會進到這個頁面。
如何在 component 中取得參數:
import { useParams } from 'next/navigation'
export default function ProductPage() {
const params = useParams()
return <div>商品 ID:{params.id}</div>
}
⛓️ 巢狀路由與 Layout 配合
app/
├── layout.tsx // 全站 layout
├── dashboard/
│ ├── layout.tsx // dashboard 專屬 layout
│ └── settings/
│ └── page.tsx // 會套用兩層 layout
➡ 這樣 /dashboard/settings
的畫面會被兩層 layout 包起來。
🚫 注意事項
限制 | 說明 |
---|---|
page.tsx 為必要頁面進入點 |
每個路由至少需要一個 page.tsx |
不支援動態 catch-all * |
請使用 [...slug] |
app/ 下不能使用 pages/ |
App Router 與 Pages Router 不能共存 |
✨ 小技巧
目的 | 實作方式 |
---|---|
動態路由(product/:id) | app/product/[id]/page.tsx |
可選參數(可有可無) | app/product/[[id]]/page.tsx |
Catch-all 路由 | app/docs/[...slug]/page.tsx |
自定 metadata(如 title) | 使用 export const metadata |
✅ 結論
Next.js 的路由系統基於檔案結構:
-
目錄名代表 URL 路徑
-
page.tsx
是每個路由的「入口」 -
巢狀結構代表巢狀路由
-
使用
[]
定義動態路由
如果你有具體的頁面結構想設計,我可以幫你列出完整檔案路徑與對應 URL 對照表。