Streaming và Suspense
Agenda
Thời gian đọc ước tính: ~25 phút
Learning Outcomes
- Hiểu được Streaming là gì và tại sao nó giải quyết được điểm yếu chí mạng của Dynamic Rendering (Traditional SSR).
- Phân biệt được 3 thành phần của Initial Load: HTML stream, Component Payload và Static Shell.
- Tự tay áp dụng được Page-level Streaming (
loading.tsx) và Granular Streaming (<Suspense>). - Áp dụng được kỹ thuật "Push Dynamic Access Down" để tối ưu hóa hiệu năng.
- Giải thích được tác động của Streaming lên các chỉ số Web Vitals (TTFB, FCP, LCP).
Glossary & Vocabulary
1. Technical Terms (Thuật ngữ kỹ thuật):
| Term | Vietnamese Meaning & Quick Explain |
|---|---|
| Streaming | Truyền phát dữ liệu. Kỹ thuật gửi HTML từ Server về Client theo từng phần nhỏ (chunks) ngay khi chúng s ẵn sàng, thay vì chờ render xong toàn bộ trang. |
| Chunked Transfer Encoding | Cơ chế của giao thức HTTP/1.1 cho phép Server gửi dữ liệu thành nhiều khối (chunks) liên tiếp nhau trên cùng một kết nối. |
| Static Shell | (Vỏ bọc tĩnh). Phần khung giao diện (Header, Sidebar, Skeleton) không phụ thuộc vào dữ liệu động. Nó được gửi về ngay lập tức ở chunk đầu tiên. |
| Web Vitals | Bộ chỉ số đo lường trải nghiệm người dùng của Google (TTFB, FCP, LCP, CLS, INP). |
2. Vocabulary Support (Từ vựng học thuật/B1+):
| Word | Meaning in Context (Nghĩa trong ngữ cảnh) |
|---|---|
| Granular (adj) | Nhỏ nhặt, chi tiết, ở mức độ hạt (Ví dụ: Granular streaming = Chia nhỏ trang thành nhiều vùng để stream độc lập). |
| Decoupled (adj) | Tách rời, không bị phụ thuộc vào nhau. |
| Degradation (n) | Sự suy giảm. Graceful degradation nghĩa là hệ thống vẫn hoạt động (dù chậm hơn hoặc bớt tính năng) thay vì sập hoàn toàn khi gặp lỗi. |
1. WHY — Nỗi đau của Traditional SSR
Ở bài 1, chúng ta đã biết Dynamic Rendering (SSR truyền thống) có ưu điểm là dữ liệu luôn mới, nhưng nhược điểm chí mạng là chậm.
Vấn đề: Máy chủ (Server) phải tạo ra TOÀN BỘ file HTML rồi mới gửi về cho trình duyệt. Nếu trang web của bạn có 3 phần: Header (tĩnh), Bài viết (mất 50ms để lấy từ DB), và Gợi ý sản phẩm (mất 3000ms để gọi AI API). → Trình duyệt phải chờ đúng 3000ms nhìn màn hình trắng xóa chỉ vì phần "Gợi ý sản phẩm" quá chậm. Một "nút thắt cổ chai" (bottleneck) kéo lùi toàn bộ hệ thống.
Giải pháp của Next.js (Streaming): Đừng chờ nữa! Có gì gửi nấy.
- Gửi ngay Header (0ms) -> Trình duyệt vẽ Header.
- Gửi tiếp Bài viết (50ms) -> Trình duyệt vẽ Bài viết.
- 3000ms sau gửi nốt Gợi ý sản phẩm. Người dùng không bao giờ phải nhìn màn hình trắng.