Server và Client Components
Agenda
Thời gian đọc ước tính: ~20 phút
Learning Outcomes
- Hiểu được sự khác biệt cốt lõi giữa Server Component và Client Component.
- Giải thích được RSC Payload là gì và Hydration diễn ra như thế nào.
- Áp dụng được các Pattern đan xen (Interleaving) giữa Server và Client Component.
- Phân biệt được lúc nào nên dùng
"use client"và lúc nào không nên. - Bảo vệ ứng dụng khỏi "Environment Poisoning" bằng
server-onlyvàclient-only.
Glossary & Vocabulary
1. Technical Terms (Thuật ngữ kỹ thuật):
| Term | Vietnamese Meaning & Quick Explain |
|---|---|
| RSC Payload | (React Server Component Payload) Phiên bản nén dạng nhị phân (binary) của các Component được render trên Server. Nó giống như một "Bản đồ thi công". |
| Hydration | Quá trình React gắn các sự kiện (event handlers như onClick) vào HTML tĩnh trên trình duyệt để làm cho trang web trở nên "Sống" (Interactive). |
| Interleaving | Đan xen. Kỹ thuật lồng ghép Server Component vào bên trong Client Component (hoặc ngược lại) một cách an toàn. |
| Boundary | Ranh giới. Nơi tách biệt giữa thế giới Server (không có window, DOM) và thế giới Client (có window, DOM). |
2. Vocabulary Support (Từ vựng học thuật/B1+):
| Word | Meaning in Context (Nghĩa trong ngữ cảnh) |
|---|---|
| Orchestrate (v) | Điều phối, sắp xếp các thành phần hoạt động nhịp nhàng với nhau. |
| Reconcile (v) | Đối chiếu và hợp nhất (Ví dụ: React đối chiếu cây Component ở Server và Client để gộp lại). |
| Poisoning (n) | Sự nhiễm độc. Ở đây ý nói việc vô tình mang mã code bí mật của Server (như API Key) chạy trên Client. |
1. WHY — Tại sao phải chia ra Server và Client Components?
Như bài trước đã đề cập, để có được hiệu năng tải trang tĩnh (HTML ngay lập tức) nhưng vẫn giữ được tính tương tác (chuyển trang mượt, có sự kiện click), Next.js và React 18+ đã giới thiệu React Server Components (RSC).
Vấn đề cốt lõi:
- Trình duyệt (Client) có thể xử lý tương tác người dùng (
onClick), nhưng nó tải dữ liệu rất chậm vì khoảng cách từ trình duyệt đến Database quá xa. - Máy chủ (Server) lấy dữ liệu cực nhanh (gần Database), nhưng nó không có DOM (Document Object Model) nên không thể gắn sự kiện
onClickhayuseState.
Giải pháp: Chia Component thành 2 loại:
- Server Components: Chạy trên máy chủ, lấy dữ liệu nhanh, bảo mật. Đầu ra là HTML tĩnh.
- Client Components: Chạy trên trình duyệt (thực ra là chạy cả ở Server lần đầu, sau đó chạy lại ở trình duyệt), đảm nhận tương tác người dùng.