Họ đang đo gì
Bạn có chọn chiến lược render theo yêu cầu của trang không, và có hiểu vì sao mismatch lại nguy hiểm.
Trả lời ngắn~30 giây
CSR: server trả HTML rỗng, JavaScript dựng mọi thứ trên trình duyệt — tệ cho SEO và cho lần tải đầu. SSR: dựng HTML mỗi request, dữ liệu luôn mới, tốn tài nguyên server. SSG: dựng lúc build, nhanh nhất, nhưng dữ liệu đứng yên tới lần build sau. ISR: SSG cộng khả năng làm mới nền theo thời hạn hoặc theo tag. Hydration mismatch là khi HTML server dựng khác với thứ React dựng lần đầu ở client — React sẽ vứt HTML đó và render lại từ đầu.
Giải thích sâu
Mismatch nguy hiểm không phải vì cảnh báo trong console mà vì hậu quả hiệu năng: React 18 xử lý bằng cách bỏ toàn bộ HTML đã nhận và render lại phía client, nên bạn mất sạch lợi ích của SSR trên đúng trang đó — LCP tệ đi rõ rệt, và người dùng thấy nội dung nhấp nháy. Nghĩa là một dòng code vô hại có thể xoá bỏ toàn bộ chiến lược render của trang.
Nguyên nhân gần như luôn là một trong bốn: dùng Date.now() hoặc new Date() trong render, dùng Math.random(), đọc window/localStorage trong lần render đầu, hoặc HTML không hợp lệ khiến trình duyệt tự sửa cấu trúc (<div> bên trong <p> là ví dụ kinh điển — trình duyệt tự đóng thẻ <p> và cây DOM khác hẳn cây React mong đợi).
Cách xử lý đúng cho dữ liệu chỉ có ở client là render nó ở lần render THỨ HAI: giữ một state mounted bật lên trong effect, hoặc dùng useSyncExternalStore với server snapshot là giá trị mặc định. Cách sau tốt hơn vì nó diễn đạt đúng ý định — “giá trị này khác nhau giữa server và client, và đây là giá trị server” — thay vì lách bằng một cờ.
Câu hỏi tiếp theo họ sẽ hỏi
?Server Component khác Client Component ra sao?
Server Component chạy ở server, không gửi JavaScript của nó xuống trình duyệt, truy cập được database trực tiếp, nhưng không có state hay event handler. Client Component thì ngược lại. Ranh giới đặt ở đâu quyết định kích thước bundle, nên quy tắc thực dụng là đẩy "use client" xuống càng sâu càng tốt.
Trả lời thế này là mất điểm
- Bọc
suppressHydrationWarningđể hết cảnh báo. Nó giấu triệu chứng chứ không sửa việc React vứt HTML đi.