DIMORI logo
← Back to the blog

Next.js Rendering: Hiểu đúng để tối ưu hiệu năng và SEO năm 2026

Làm chủ Next.js Rendering: Tại sao SSR/SSG là chưa đủ trong năm 2026?

Bạn đang xây dựng một website với Next.js. Trang chủ load cực nhanh, SEO đẹp, nhưng khi người dùng thêm sản phẩm vào giỏ hàng thì phải chờ mãi? Hoặc ngược lại: dashboard admin tương tác mượt mà nhưng Google không index được nội dung?

Đây chính là bài toán cốt lõi của rendering trong web hiện đại: Cân bằng giữa tốc độ, SEO, dữ liệu mới và tài nguyên server.

Ngày xưa, chúng ta chỉ có hai lựa chọn: render hết trên server (SSR) hoặc để client tự vẽ (CSR). Next.js đã thay đổi hoàn toàn cuộc chơi bằng cách cho phép kết hợp linh hoạt các chiến lược rendering ngay trong cùng một ứng dụng, thậm chí trong cùng một route.

Hôm nay, chúng ta sẽ đi sâu vào hành trình phát triển của các phương pháp rendering trong Next.js (dựa trên App Router – mặc định từ Next.js 13+), từ truyền thống đến hiện đại nhất: Partial Prerendering (PPR) – được coi là “vũ khí tối thượng” năm 2026.


1. Client-Side Rendering (CSR) – “Để trình duyệt tự lo”

Cách hoạt động

Server chỉ trả về một file HTML gần như trống + bundle JavaScript. Trình duyệt tải JS về, sau đó mới fetch dữ liệu qua API và tự render toàn bộ nội dung.

Đây là cách làm mặc định của các SPA thuần React trước đây.

Ưu điểm

  • Tương tác cực mượt sau khi load xong (không reload trang)
  • Giảm tải cho server (server chỉ phục vụ file tĩnh)

Nhược điểm

  • Thời gian hiển thị nội dung ban đầu (Time to First Contentful Paint) chậm
  • SEO kém vì crawler của Google khó đọc nội dung (phải chờ JS chạy)
  • Phụ thuộc nhiều vào JavaScript → người dùng chậm mạng hoặc thiết bị yếu sẽ chịu thiệt

Khi nào dùng?

Phần tương tác thuần túy: form validation phức tạp, dashboard realtime, chat widget, infinite scroll chỉ cần client-side.

Mẹo trong Next.js: Dùng 'use client' directive để đánh dấu Client Component.


2. Server-Side Rendering (SSR) – “Nấu ăn theo từng order”

Cách hoạt động

Với mỗi request, server fetch dữ liệu, render HTML đầy đủ rồi gửi về client. Sau đó xảy ra hydration (React gắn sự kiện JS vào HTML đã có).

Ưu điểm

  • SEO tuyệt vời (HTML đã có nội dung sẵn)
  • Dữ liệu luôn tươi mới (personalized theo user, cookies, headers...)

Nhược điểm

  • Tốn tài nguyên server (mỗi request phải render lại từ đầu)
  • Thời gian phản hồi (TTFB - Time to First Byte) có thể lâu nếu dữ liệu phức tạp

Khi nào dùng?

Dùng khi mỗi request cần render HTML khác nhau ngay từ server dựa trên user/cookie/auth hoặc dữ liệu thay đổi liên tục (giá, trạng thái, session) và bạn cần đảm bảo người dùng thấy dữ liệu mới nhất ngay lần load đầu mà không thể dùng cache chung như SSG/ISR.


3. Static Site Generation (SSG) – “Nấu sẵn một lần, phục vụ mãi mãi”

Cách hoạt động

Toàn bộ trang được generate thành HTML tĩnh tại build time. Khi user truy cập, server/CDN chỉ việc trả file tĩnh.

Ưu điểm

  • Tốc độ rất nhanh (TTFB cực thấp, có thể cache ở edge)
  • SEO xuất sắc
  • Tiết kiệm tài nguyên server tối đa

Nhược điểm

  • Không phù hợp với dữ liệu thay đổi thường xuyên (phải rebuild toàn bộ dự án khi có thay đổi)

Khi nào dùng?

Trang blog, tài liệu, landing page, trang sản phẩm ít thay đổi, trang “About”, pricing...


4. Incremental Static Regeneration (ISR) – “Nấu sẵn nhưng biết cách làm mới”

Cách hoạt động

Kết hợp SSG + khả năng tái tạo trang tĩnh theo định kỳ (revalidate) hoặc on-demand (khi có webhook).

Ví dụ:
revalidate: 3600 (làm mới mỗi giờ)
hoặc revalidatePath() / revalidateTag()

Ưu điểm

  • Giữ được tốc độ và SEO của SSG
  • Dữ liệu vẫn có thể cập nhật mà không cần rebuild toàn bộ

Nhược điểm

  • Có khoảng thời gian “stale” (dữ liệu cũ trong lúc regenerate)
  • Cần tính toán thời gian revalidate hợp lý

Khi nào dùng?

Trang tin tức, danh sách sản phẩm e-commerce, blog có bài mới thường xuyên.


5. Partial Prerendering (PPR) – “Vũ khí tối thượng” của Next.js 2026

PPR là bước tiến lớn nhất từ Next.js 14 (experimental) đến ổn định hoàn toàn ở Next.js 15/16.

Cách hoạt động

  • Build time: tạo static HTML shell
  • Request time: phần động (wrapped trong <Suspense>) được render và stream về client

Kết quả: nội dung tĩnh hiển thị ngay, nội dung động load dần mà không layout shift.

Ưu điểm

  • Kết hợp SSG + SSR + CSR
  • Một request duy nhất
  • Streaming mượt
  • Cache tốt ở CDN

Nhược điểm

  • Cần hiểu rõ Suspense boundaries
  • Debug phức tạp hơn một chút

Khi nào dùng?

Hầu hết các trang thực tế: e-commerce, dashboard, blog có comment động...


Bảng so sánh nhanh

Chiến lượcThời điểm renderTốc độ ban đầuSEODữ liệu tươiTải serverUse case điển hình
CSRClientChậmKémCaoThấpDashboard tương tác nặng
SSRMỗi requestTrung bìnhTốtCao nhấtCaoTrang cá nhân hóa mạnh
SSGBuild timeSiêu nhanhXuất sắcThấpRất thấpBlog, landing page
ISRBuild + revalidateSiêu nhanhXuất sắcTrung bìnhThấpTin tức, sản phẩm catalog
PPRBuild (shell) + Request (dynamic)Siêu nhanhXuất sắcCaoThấp-TrungHầu hết trang thực tế (hybrid)

Kết luận & Lời khuyên thực tế

Không có chiến lược nào là “tuyệt đối tốt nhất”. Next.js cho phép bạn kết hợp tất cả:

  • Dùng SSG + ISR cho nội dung công khai
  • Dùng PPR cho route phức tạp
  • Dùng SSR khi cần data fresh 100%
  • Dùng CSR cho phần tương tác

Lời khuyên

  • Bắt đầu với PPR + Suspense
  • Ưu tiên Server Components
  • Luôn đo performance bằng Lighthouse / Vercel Analytics

Hy vọng bài viết này giúp bạn chọn đúng “vũ khí” rendering để build app nhanh, SEO tốt và UX mượt hơn.