Explore all courses in this category.
Explore all courses in this category.
Nguyễn Đình Cường
0 comment
09 Nov, 2026
Khi mới học Next.js, bạn sẽ gặp một chuỗi từ viết tắt: CSR, SSR, SSG, ISR. Chúng đều trả lời cùng một câu hỏi: trang HTML được tạo ra ở đâu và vào lúc nào. Chọn đúng cách ảnh hưởng đến tốc độ tải, khả năng được tìm thấy trên công cụ tìm kiếm và chi phí vận hành.
Client-Side Rendering là cách ứng dụng React thuần chạy: máy chủ gửi một file HTML gần như trống cùng gói JavaScript, trình duyệt chạy JavaScript rồi mới vẽ nội dung. Ưu điểm là tương tác sau đó mượt, máy chủ đơn giản. Nhược điểm là lúc đầu người dùng có thể thấy trang trống một lúc, và nội dung không có sẵn trong HTML ban đầu nên bất lợi cho SEO và chia sẻ liên kết (dù các công cụ tìm kiếm hiện đại có thể chạy JavaScript, việc này không phải lúc nào cũng đáng tin).
Server-Side Rendering tạo HTML đầy đủ trên máy chủ cho mỗi yêu cầu. Người dùng nhận trang có nội dung ngay, sau đó JavaScript "tiếp quản" (hydration) để trang tương tác được.
Static Site Generation tạo trước các file HTML tại thời điểm build, sau đó phục vụ như file tĩnh, có thể đặt lên CDN. Cực nhanh và rẻ.
Incremental Static Regeneration là lai giữa hai kiểu trên: trang được dựng tĩnh, nhưng sau một khoảng thời gian bạn quy định (hoặc khi bạn kích hoạt thủ công) nó được dựng lại ở nền. Người dùng luôn nhận trang tĩnh nhanh, còn nội dung vẫn được làm mới định kỳ. Cách này thích hợp cho trang sản phẩm hoặc bài viết có cập nhật thỉnh thoảng.
Next.js hiện đại dùng App Router, nơi các component mặc định là Server Component, và bạn điều khiển cách render thông qua cách lấy dữ liệu và các tùy chọn đoạn (route segment). Đây là minh họa mang tính khái niệm, bạn cần đối chiếu tài liệu phiên bản bạn dùng vì các mặc định có thể thay đổi giữa các phiên bản:
// app/bai-viet/page.js
export const revalidate = 3600; // làm mới tối đa mỗi giờ (kiểu ISR)
export default async function Page() {
const res = await fetch('https://api.example.com/posts');
const bai = await res.json();
return (
<ul>
{bai.map(b => <li key={b.id}>{b.tieuDe}</li>)}
</ul>
);
}Component này chạy trên máy chủ, có thể await trực tiếp dữ liệu, và kết quả gửi về trình duyệt dưới dạng HTML. Nếu cần tương tác như state hay sự kiện, bạn tách phần đó ra component riêng khai báo 'use client' ở đầu file.
| Cách | HTML tạo lúc nào | Tốc độ | Nội dung động |
|---|---|---|---|
| CSR | Trong trình duyệt | Tải đầu chậm hơn | Rất tốt |
| SSR | Mỗi yêu cầu | Phụ thuộc máy chủ | Rất tốt |
| SSG | Lúc build | Rất nhanh | Hạn chế |
| ISR | Lúc build, làm mới định kỳ | Rất nhanh | Khá tốt |
Trong thực tế, một ứng dụng Next.js thường kết hợp nhiều cách: trang chủ tĩnh, trang sản phẩm ISR, giỏ hàng CSR.
Dù chọn cách render nào, có vài điểm thực tế nên nhớ. Thứ nhất, nội dung ở dạng HTML ngay từ đầu giúp trình thu thập của công cụ tìm kiếm và trình xem trước liên kết trên mạng xã hội đọc dễ dàng, đây là lý do chính nhiều trang chọn SSR hoặc SSG. Thứ hai, hydration cần HTML từ máy chủ và kết quả render ban đầu ở trình duyệt khớp nhau, nếu bạn dùng giá trị như thời gian hiện tại hoặc số ngẫu nhiên trong lúc render, có thể gặp cảnh báo hydration mismatch. Thứ ba, hãy đo đạc thực tế bằng công cụ như Lighthouse thay vì đoán, vì chênh lệch tốc độ phụ thuộc rất nhiều vào dữ liệu và hạ tầng của bạn.
Đừng học thuộc từ viết tắt, hãy nhớ câu hỏi "HTML được tạo khi nào, ở đâu?". Với mỗi trang, trả lời câu hỏi đó rồi chọn cách phù hợp giữa tốc độ, độ tươi của dữ liệu và chi phí.
Nếu muốn thực hành Next.js từ đầu đến khi triển khai, bạn có thể xem các khóa học trên codebem.com.
Nguyễn Đình Cường
0 comment