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

SSG, SSR และ ISR

สร้างหน้าเว็บแบบสแตติกขณะบิลด์ เรนเดอร์บนเซิร์ฟเวอร์ตามแต่ละคำขอ หรือทำให้หน้าเว็บที่แคชไว้ได้รับการตรวจสอบใหม่ตามกำหนดเวลาด้วย Incremental Static Regeneration

SSG, SSR และ ISR เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

กลยุทธ์การแสดงผลสามแบบ

Next.js รองรับการแสดงผลหน้าเว็บสามวิธี: SSG (การสร้างเว็บไซต์แบบสแตติก), SSR (การแสดงผลฝั่งเซิร์ฟเวอร์) และ ISR (การสร้างเว็บไซต์แบบสแตติกใหม่เป็นระยะ) แต่ละแบบมีข้อแลกเปลี่ยนแตกต่างกัน

SSG — การสร้างเมื่อสร้างแอป

หน้าจะถูกสร้างเป็น HTML แบบสแตติกในเวลาสร้างแอป และให้บริการจาก CDN ทำให้ส่งข้อมูลได้เร็วที่สุด เหมาะสำหรับหน้าการตลาด บล็อก และเอกสารประกอบ

SSG ในตัวจัดการเส้นทางแบบหน้า

ส่งออก getStaticProps จากหน้า ฟังก์ชันนี้จะทำงานในเวลาสร้างแอปและส่งพร็อพให้คอมโพเนนต์

// pages/blog/[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 } };
}

SSG ในตัวจัดการเส้นทางของแอป

ตามค่าเริ่มต้น คอมโพเนนต์ฝั่งเซิร์ฟเวอร์แบบอะซิงโครนัสจะดึงข้อมูลในเวลาสร้างแอป ใช้ generateStaticParams สำหรับเส้นทางแบบไดนามิก

// app/blog/[slug]/page.tsx
export async function generateStaticParams() {
  const posts = await fetchAllPosts();
  return posts.map(p => ({ slug: p.slug }));
}

export default async function Post({ params }) {
  const post = await fetchPost(params.slug);
  return <article>{post.body}</article>;
}

SSR — การสร้างต่อคำขอ

หน้าจะถูกแสดงผลใหม่ทุกครั้งที่มีคำขอ ใช้เมื่อเนื้อหาแตกต่างกันตามผู้ใช้หรือเปลี่ยนแปลงบ่อยเกินกว่าจะแคชได้

SSR ในตัวจัดการเส้นทางแบบหน้า

ส่งออก getServerSideProps

// pages/dashboard.tsx
export async function getServerSideProps({ req }) {
  const userId = req.cookies.userId;
  const data = await fetchUserDashboard(userId);
  return { props: { data } };
}

SSR ในตัวจัดการเส้นทางของแอป

บังคับให้แสดงผลต่อคำขอด้วย dynamic = 'force-dynamic' หรืออ่านคุกกี้หรือส่วนหัว ซึ่งจะยกเลิกการเลือกใช้การแสดงผลแบบสแตติกโดยอัตโนมัติ

// app/dashboard/page.tsx
import { cookies } from 'next/headers';

export default async function Dashboard() {
  const userId = cookies().get('userId')?.value;
  const data = await fetchUserDashboard(userId);
  return <pre>{JSON.stringify(data, null, 2)}</pre>;
}

// Or explicit:
export const dynamic = 'force-dynamic';

ISR — ข้อดีของทั้งสองแบบ

ISR คือการให้บริการหน้าแบบสแตติก แต่สร้างหน้าใหม่ในเบื้องหลังทุก ๆ N วินาที จึงรวมความเร็วของ SSG เข้ากับข้อมูลที่ค่อนข้างใหม่

ISR ในตัวจัดการเส้นทางแบบหน้า

เพิ่ม revalidate ให้กับ getStaticProps

export async function getStaticProps() {
  const posts = await fetchPosts();
  return {
    props: { posts },
    revalidate: 60  // regenerate at most every 60 seconds
  };
}

ISR ในตัวจัดการเส้นทางของแอป

ใช้ next: { revalidate: N } ในตัวเลือกของ fetch หรือกำหนด export const revalidate = N ในหน้า

// Option A: per fetch
const posts = await fetch('https://api/posts', { next: { revalidate: 60 } })
  .then(r => r.json());

// Option B: whole page
export const revalidate = 60;

export default async function Page() {
  const posts = await fetch('https://api/posts').then(r => r.json());
  return <Feed posts={posts} />;
}

การตรวจสอบใหม่ตามคำขอ

เรียกให้สร้างหน้าใหม่ด้วยตนเอง เช่น จากเว็บฮุกของ CMS โดยไม่ต้องรอให้ครบช่วงเวลา

// pages/api/revalidate.ts (Pages) or app/api/revalidate/route.ts (App)
import { revalidatePath, revalidateTag } from 'next/cache';

export async function POST(req) {
  const { slug } = await req.json();
  revalidatePath(`/blog/${slug}`);
  return Response.json({ revalidated: true });
}

การเลือกกลยุทธ์ที่เหมาะสม

ใช้ SSG เมื่อข้อมูลเปลี่ยนแปลงไม่บ่อย เช่น หน้าการตลาด เอกสาร หรือบล็อก ใช้ ISR เมื่อข้อมูลอัปเดตเป็นครั้งคราว เช่น เว็บไซต์ที่ขับเคลื่อนด้วย CMS และรายการสินค้าอีคอมเมิร์ซ ใช้ SSR สำหรับเนื้อหาที่แตกต่างกันตามผู้ใช้ เช่น แดชบอร์ดและหน้าบัญชี

ตรวจสอบความเข้าใจ

ISR (การสร้างเว็บไซต์แบบสแตติกใหม่เป็นระยะ) ทำสิ่งใดที่ SSG แบบล้วน ๆ ทำไม่ได้

ทบทวน: SSG, SSR, ISR

SSG: สร้างในเวลาสร้างแอป เร็วที่สุด แต่เนื้อหาคงที่ SSR: สร้างต่อคำขอ เนื้อหาเปลี่ยนแปลงได้ แต่ช้ากว่า ISR: SSG พร้อมการสร้างใหม่ในเบื้องหลังตามกำหนดเวลา จึงได้ข้อมูลค่อนข้างใหม่และยังรวดเร็ว ตัวจัดการเส้นทางแบบหน้าใช้ getStaticProps/getServerSideProps ตัวจัดการเส้นทางของแอปใช้คอมโพเนนต์ฝั่งเซิร์ฟเวอร์แบบอะซิงโครนัสร่วมกับ fetch revalidate หรือค่าคงที่ revalidate ระดับหน้า ใช้ revalidatePath/แท็กสำหรับการอัปเดตตามคำขอ

คำถามที่พบบ่อย

บทเรียน “SSG, SSR และ ISR” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “SSG, SSR และ ISR” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “SSG, SSR และ ISR”

สร้างหน้าเว็บแบบสแตติกขณะบิลด์ เรนเดอร์บนเซิร์ฟเวอร์ตามแต่ละคำขอ หรือทำให้หน้าเว็บที่แคชไว้ได้รับการตรวจสอบใหม่ตามกำหนดเวลาด้วย Incremental Static Regeneration คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “SSG, SSR และ ISR” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม

ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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