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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Pages Router เทียบกับ App Router
- คอมโพเนนต์เซิร์ฟเวอร์และคอมโพเนนต์ไคลเอนต์
- SSG, SSR และ ISR
- เส้นทาง API และมิดเดิลแวร์ของ Next.js