📁 บทที่ 2: File-based Routing
เรียนรู้ระบบการนำทางที่ใช้ไฟล์และโฟลเดอร์ในการสร้าง routes
วัตถุประสงค์การเรียนรู้
เข้าใจความแตกต่างระหว่าง Pages Router และ App Router
สามารถสร้าง Static Routes และ Dynamic Routes ได้
รู้จักการใช้ Route Groups และ Special Files
เข้าใจโครงสร้าง Nested Routes และ Catch-all Routes
🤔 File-based Routing คืออะไร?
File-based Routing เป็นระบบการสร้าง routes โดยใช้โครงสร้างไฟล์และโฟลเดอร์ แทนการเขียนการตั้งค่า routing แบบ manual ทำให้การจัดการ routes ง่ายและเป็นระเบียบมากขึ้น
🔄 Pages Router vs App Router
📂 Pages Router (Next.js 12 และเก่ากว่า)
ใช้โฟลเดอร์ `pages/` และไฟล์แต่ละไฟล์เป็น route
pages/
├── index.js → /
├── about.js → /about
├── blog/
│ ├── index.js → /blog
│ └── [slug].js → /blog/:slug
└── api/
└── users.js → /api/users🛣️ ประเภทของ Routes
หน้าแบบคงที่ สร้างโดยการใส่ไฟล์ page.tsx ในโฟลเดอร์ (จะมี Static Route Indicator ใน Next.js 15)
// app/about/page.tsx
export default function AboutPage() {
return (
<div>
<h1>เกี่ยวกับเรา</h1>
<p>ยินดีต้อนรับสู่เว็บไซต์ของเรา</p>
</div>
);
}Route ที่รับพารามิเตอร์แบบไดนามิก ใน Next.js 15 params เป็น async
// app/blog/[slug]/page.tsx
interface Props {
params: Promise<{ slug: string }>;
}
export default async function BlogPost({ params }: Props) {
const { slug } = await params;
return (
<div>
<h1>บทความ: {slug}</h1>
<p>เนื้อหาบทความ...</p>
</div>
);
}Route ที่ซ้อนกันหลายระดับ เหมาะสำหรับโครงสร้างที่ซับซ้อน (Next.js 15 async params)
// app/blog/category/[id]/page.tsx
interface Props {
params: Promise<{ id: string }>;
}
export default async function CategoryPage({ params }: Props) {
const { id } = await params;
return (
<div>
<h1>หมวดหมู่: {id}</h1>
<p>รายการบทความในหมวดหมู่นี้</p>
</div>
);
}Route ที่จับพารามิเตอร์แบบหลายระดับ ใช้ [...slug] (Next.js 15 async params)
// app/docs/[...slug]/page.tsx
interface Props {
params: Promise<{ slug: string[] }>;
}
export default async function DocsPage({ params }: Props) {
const { slug } = await params;
const path = slug.join('/');
return (
<div>
<h1>เอกสาร: {path}</h1>
<p>เนื้อหาเอกสาร...</p>
</div>
);
}📦 Route Groups
Route Groups ช่วยให้เราจัดกลุ่ม routes โดยไม่ส่งผลต่อ URL structure โดยใช้วงเล็บ () ครอบชื่อโฟลเดอร์
(marketing)
กลุ่ม routes สำหรับหน้า marketing ไม่ส่งผลต่อ URL
app/(marketing)/about/page.tsx → /about
app/(marketing)/pricing/page.tsx → /pricing
app/(marketing)/contact/page.tsx → /contact
(auth)
กลุ่ม routes สำหรับระบบ authentication
app/(auth)/login/page.tsx → /login
app/(auth)/register/page.tsx → /register
app/(auth)/forgot-password/page.tsx → /forgot-password
(dashboard)
กลุ่ม routes สำหรับหน้า dashboard
app/(dashboard)/admin/page.tsx → /admin
app/(dashboard)/settings/page.tsx → /settings
app/(dashboard)/profile/page.tsx → /profile
📄 Special Files
App Router มีไฟล์พิเศษที่มีหน้าที่เฉพาะ ช่วยให้เราสร้าง UX ที่ดีขึ้น
layout.tsx
Layout ที่ใช้ร่วมกันสำหรับ routes ในโฟลเดอร์นั้นๆ
page.tsx
หน้าเว็บหลักของ route นั้นๆ
loading.tsx
UI ที่แสดงขณะกำลังโหลดข้อมูล
error.tsx
หน้าที่แสดงเมื่อเกิดข้อผิดพลาด
not-found.tsx
หน้าที่แสดงเมื่อไม่พบ route (404)
🛠️ ตัวอย่างการใช้งานจริง
มาลองสร้างโครงสร้าง routes สำหรับเว็บไซต์ e-commerce กัน
app/
├── (marketing)/
│ ├── layout.tsx # Layout สำหรับ marketing pages
│ ├── page.tsx # หน้าแรก (/)
│ ├── about/
│ │ └── page.tsx # เกี่ยวกับเรา (/about)
│ └── contact/
│ └── page.tsx # ติดต่อเรา (/contact)
├── (shop)/
│ ├── layout.tsx # Layout สำหรับ shop pages
│ ├── products/
│ │ ├── page.tsx # รายการสินค้า (/products)
│ │ └── [id]/
│ │ ├── page.tsx # รายละเอียดสินค้า (/products/123)
│ │ └── reviews/
│ │ └── page.tsx # รีวิวสินค้า (/products/123/reviews)
│ └── cart/
│ └── page.tsx # ตะกร้าสินค้า (/cart)
├── (auth)/
│ ├── login/
│ │ └── page.tsx # เข้าสู่ระบบ (/login)
│ └── register/
│ └── page.tsx # สมัครสมาชิก (/register)
└── api/
├── products/
│ └── route.ts # API สำหรับสินค้า
└── auth/
└── route.ts # API สำหรับ authentication💡 ข้อดีของโครงสร้างนี้:
แยก layout ตามประเภทหน้า (marketing, shop, auth)
โครงสร้างชัดเจน เข้าใจง่าย
สามารถปรับแต่ง layout แต่ละกลุ่มได้อิสระ
รองรับ nested routes ที่ซับซ้อน
✋ ฝึกปฏิบัติ: สร้าง Routes
ลองทำตามขั้นตอนนี้เพื่อสร้าง routes ต่างๆ ในโปรเจค Next.js ของคุณ
สร้าง Static Route
สร้างหน้า About โดยการสร้างโฟลเดอร์และไฟล์ดังนี้:
$ mkdir -p app/about
$ touch app/about/page.tsx
// app/about/page.tsx
export default function AboutPage() {
return (
<div>
<h1>เกี่ยวกับเรา</h1>
<p>ยินดีต้อนรับสู่เว็บไซต์ของเรา</p>
</div>
);
}สร้าง Dynamic Route
สร้าง Route Group
🎯 สรุปบทเรียน
ในบทนี้คุณได้เรียนรู้ File-based Routing ซึ่งเป็นหัวใจสำคัญของ Next.js ที่ทำให้การจัดการ routes ง่ายและมีระเบียบ