0Pricing
Frontend Academy · บทเรียน

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/users

Pages 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/:slug

App 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Pages Router เทียบกับ App Router
  2. คอมโพเนนต์เซิร์ฟเวอร์และคอมโพเนนต์ไคลเอนต์
  3. SSG, SSR และ ISR
  4. เส้นทาง API และมิดเดิลแวร์ของ Next.js
← กลับไปที่ Frontend Academy