Pages Router เทียบกับ App Router
เปรียบเทียบแนวทางการกำหนดเส้นทางของ Next.js ได้แก่ Pages Router ที่อิงตามไฟล์กับ App Router รุ่นใหม่ที่มีเลย์เอาต์ซ้อนกัน สถานะกำลังโหลด และขอบเขตข้อผิดพลาด
Pages Router เทียบกับ App Router เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
เราเตอร์สองแบบในเฟรมเวิร์กเดียว
Next.js มีระบบกำหนดเส้นทางสองระบบ ได้แก่ Pages Router แบบดั้งเดิม (ไดเรกทอรี pages/) และ App Router แบบใหม่กว่า (ไดเรกทอรี app/ ตั้งแต่ Next 13 เป็นต้นไป) ทั้งสองระบบยังใช้งานได้ใน Next 14/15
Pages Router — การกำหนดเส้นทางตามไฟล์
ไฟล์แต่ละไฟล์ภายใต้ pages/ จะกลายเป็นเส้นทางหนึ่งเส้นทาง ส่วนของเส้นทางแบบไดนามิกใช้วงเล็บเหลี่ยม: pages/users/[id].tsx จะจับคู่กับ /users/123
pages/
index.tsx // route: /
about.tsx // route: /about
blog/
index.tsx // route: /blog
[slug].tsx // route: /blog/:slug
api/
users.ts // API route: /api/usersPages Router — การดึงข้อมูล
การส่งออกแบบพิเศษใช้ประกาศพฤติกรรมการดึงข้อมูล ได้แก่ getStaticProps (SSG), getServerSideProps (SSR) และ getStaticPaths (SSG ที่มีเส้นทางแบบไดนามิก)
// pages/posts/[slug].tsx
export async function getStaticPaths() {
const slugs = await fetchAllSlugs();
return { paths: slugs.map(s => ({ params: { slug: s } })), fallback: false };
}
export async function getStaticProps({ params }) {
const post = await fetchPost(params.slug);
return { props: { post }, revalidate: 60 };
}
export default function Post({ post }) {
return <article>{post.body}</article>;
}App Router — การกำหนดเส้นทางตามโฟลเดอร์
App Router ใช้โฟลเดอร์เป็นส่วนของเส้นทาง ไฟล์ page.tsx ภายในโฟลเดอร์จะกำหนดหน้าเว็บ
app/
layout.tsx // shared root layout
page.tsx // route: /
about/
page.tsx // route: /about
blog/
page.tsx // route: /blog
[slug]/
page.tsx // route: /blog/:slugApp Router — ไฟล์พิเศษ
ไฟล์แยกตามแต่ละส่วนของเส้นทางมอบความสามารถพื้นฐานที่ทรงพลัง ได้แก่ layout.tsx (ส่วนติดต่อถาวรที่ครอบเนื้อหาลูก) loading.tsx (เนื้อหาสำรองของ Suspense) error.tsx (ขอบเขตดักจับข้อผิดพลาด) และ not-found.tsx
เลย์เอาต์ซ้อนกัน
เลย์เอาต์ของ App Router จะครอบเส้นทางที่ซ้อนกันและคงอยู่ตลอดการเปลี่ยนหน้า โดยไม่เมานต์ใหม่
// app/dashboard/layout.tsx
export default function DashboardLayout({ children }) {
return (
<div className="dashboard">
<Sidebar />
<main>{children}</main>
</div>
);
}
// app/dashboard/settings/page.tsx renders inside the Sidebar layoutการดึงข้อมูลใน App Router
คอมโพเนนต์เซิร์ฟเวอร์สามารถทำงานแบบอะซิงโครนัสและดึงข้อมูลได้โดยตรง จึงไม่ต้องใช้ getServerSideProps หรือ getStaticProps คอมโพเนนต์จะทำงานบนเซิร์ฟเวอร์และส่งให้ไคลเอนต์เฉพาะ HTML
// app/posts/[slug]/page.tsx (Server Component by default)
export default async function Post({ params }) {
const post = await fetch(`https://api/posts/${params.slug}`, {
next: { revalidate: 60 } // ISR-like caching
}).then(r => r.json());
return <article>{post.body}</article>;
}คอมโพเนนต์ไคลเอนต์ใน App Router
เพิ่ม 'use client' ที่ด้านบนของไฟล์เพื่อกำหนดให้คอมโพเนนต์เป็นคอมโพเนนต์ไคลเอนต์ ซึ่งโต้ตอบได้และทำงานในเบราว์เซอร์
// app/Counter.tsx
'use client';
import { useState } from 'react';
export default function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}API Routes เทียบกับ Route Handlers
Pages Router: pages/api/users.ts ส่งออกฟังก์ชันเริ่มต้นที่มี req/res ส่วน App Router: app/api/users/route.ts ส่งออกเมธอด HTTP (GET, POST) แบบมีชื่อ โดยใช้ Request/Response มาตรฐาน
// app/api/users/route.ts
export async function GET(request: Request) {
const users = await db.users.findMany();
return Response.json(users);
}
export async function POST(request: Request) {
const body = await request.json();
const user = await db.users.create({ data: body });
return Response.json(user, { status: 201 });
}กลยุทธ์การย้ายระบบ
เราเตอร์ทั้งสองแบบอยู่ร่วมกันในโปรเจกต์เดียวได้ ให้ย้ายหน้าเว็บทีละหน้าอย่างค่อยเป็นค่อยไป เมื่อเกิดข้อขัดแย้ง App Router จะมีลำดับความสำคัญก่อน
ควรใช้แบบใดเมื่อใด
โปรเจกต์ใหม่: ใช้ App Router ซึ่งมีความสามารถมากกว่าและเป็นจุดมุ่งเน้นการพัฒนาในปัจจุบัน โปรเจกต์เดิมที่ใช้ Pages Router: ใช้ต่อไปหรือค่อย ๆ ย้ายระบบ ส่วนเว็บไซต์สแตติกขนาดเล็กที่ไม่ต้องใช้เลย์เอาต์หรือ RSC ใช้แบบใดก็ได้
ตรวจสอบความเข้าใจ
คุณจะกำหนดให้คอมโพเนนต์เป็นคอมโพเนนต์ฝั่งไคลเอนต์ในตัวจัดการเส้นทางของแอป Next.js ได้อย่างไร
ทบทวน: ตัวจัดการเส้นทางแบบหน้าเทียบกับตัวจัดการเส้นทางของแอป
ตัวจัดการเส้นทางแบบหน้า: ใช้ไฟล์เป็นพื้นฐาน และใช้ getStaticProps/getServerSideProps ตัวจัดการเส้นทางของแอป (ตั้งแต่ Next.js 13 ขึ้นไป): ใช้โฟลเดอร์เป็นพื้นฐาน มีคอมโพเนนต์ฝั่งเซิร์ฟเวอร์แบบอะซิงโครนัส เลย์เอาต์ซ้อนกัน และไฟล์สำหรับการโหลดหรือข้อผิดพลาด ระบุการโต้ตอบฝั่งไคลเอนต์ด้วย 'use client' เส้นทาง API: ใช้ pages/api/* เทียบกับ app/api/*/route.ts ซึ่งส่งออกเมธอด HTTP แบบมีชื่อ ทั้งสองแบบใช้งานร่วมกันได้ แต่ตัวจัดการเส้นทางของแอปได้รับการพัฒนาอย่างต่อเนื่อง
คำถามที่พบบ่อย
บทเรียน “Pages Router เทียบกับ App Router” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Pages Router เทียบกับ App Router” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Pages Router เทียบกับ App Router”
เปรียบเทียบแนวทางการกำหนดเส้นทางของ Next.js ได้แก่ Pages Router ที่อิงตามไฟล์กับ App Router รุ่นใหม่ที่มีเลย์เอาต์ซ้อนกัน สถานะกำลังโหลด และขอบเขตข้อผิดพลาด คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “Pages Router เทียบกับ App Router” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม
ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Pages Router เทียบกับ App Router
- คอมโพเนนต์เซิร์ฟเวอร์และคอมโพเนนต์ไคลเอนต์
- SSG, SSR และ ISR
- เส้นทาง API และมิดเดิลแวร์ของ Next.js