RSC dành cho nhà phát triển Astro
(overreacted.io)- Astro và React Server Components (RSC) đều triển khai theo cách tương tự trong việc tách mã phía server và phía client
- Trong Astro, Astro Component và Client Island mỗi bên đảm nhiệm vai trò chức năng riêng
- RSC chia cùng một khái niệm thành Server Component và Client Component, đồng thời dùng chỉ thị
'use client'để thiết lập ranh giới - So với Astro, RSC linh hoạt hơn trong việc xây dựng UI tương tác và chia sẻ mã
- Cả hai mô hình đều có cấu trúc với luồng dữ liệu một chiều từ server sang client
Giới thiệu và khái niệm cơ bản
- Astro cung cấp hai loại component chính là Astro Component và Client Island
- Astro Component có phần mở rộng
.astro, chỉ chạy trên server hoặc tại thời điểm build, và có thể thực hiện những việc mà phía client không làm được như truy cập file system, truy vấn DB, hay gọi dịch vụ nội bộ - Client Island là component dành cho React, Vue... chạy trong trình duyệt và đảm nhiệm phần tương tác với người dùng
- Có thể render Client Island bên trong Astro Component, nhưng không thể gọi Astro Component từ Client Island
- Cấu trúc này đảm bảo tính một chiều khi dữ liệu luôn chỉ chảy từ server sang client
Ví dụ mã và phân chia vai trò
- Trong ví dụ mã,
PostPreview.astrođọc file trên server để lấy tiêu đề, sau đó truyền dữ liệu đó vào Client Island - LikeButton được viết bằng React, sau khi trình duyệt tải xong sẽ xử lý thay đổi trạng thái và sự kiện click của người dùng
- Astro Component và Client Island hoạt động trong hai thế giới khác nhau, và việc truyền dữ liệu cũng chỉ diễn ra theo chiều đi xuống từ Astro Component
So sánh với React Server Components (RSC)
- Trong RSC cũng giống Astro, có sự phân chia thành server component (Server Component) và client component (Client Component)
- Trong React Server Component, server component được khai báo bằng hàm JavaScript, và dùng chỉ thị 'use client' để chỉ rõ nơi mã phía client bắt đầu
- Trong RSC, cùng một file component có thể đảm nhiệm cả vai trò server lẫn client; không cần tách riêng bằng phần mở rộng file như Astro, mà có thể di chuyển ranh giới chỉ với khai báo
'use client'khi cần - Nếu component dùng tính năng chỉ dành cho client (ví dụ: useState) hoặc chỉ dành cho server (như truy cập DB), thì khi dùng sai môi trường sẽ phát sinh lỗi build, giúp nhận được phản hồi rõ ràng
Khác biệt về mặt trực quan và cấu trúc giữa Astro và RSC
- Astro có ranh giới rõ ràng nhờ phân biệt file
.astrovà file JS/TS - RSC về cơ bản mọi thứ đều là React nên vượt trội hơn nhiều về khả năng chia sẻ mã và tính linh hoạt
- Ví dụ, những component trung lập không dùng state hay chức năng phía server (như parser Markdown) có thể được dùng ở cả hai phía
- Trong RSC, component sẽ tự động được quyết định chạy ở thế giới nào tùy theo đường dẫn import
Ưu điểm và giới hạn của mô hình RSC
- Ưu điểm của RSC nằm ở khả năng tái sử dụng mã và sự linh hoạt trong việc chuyển vai trò
- Bất kỳ component nào cũng có thể dễ dàng dịch chuyển ranh giới chỉ bằng khai báo
'use client'khi cần - Trong Astro, khi tính chất tĩnh/động của UI thay đổi, việc chuyển đổi mã có thể khá phiền phức; còn RSC giải quyết việc này một cách đơn giản
- Bất kỳ component nào cũng có thể dễ dàng dịch chuyển ranh giới chỉ bằng khai báo
- Nhược điểm của RSC là độ khó học cao hơn
- Lập trình viên phải liên tục để ý mình đang ở “thế giới nào”, nhưng nếu mắc lỗi thì sẽ nhận được phản hồi nhanh thông qua lỗi build
- Trong Astro, khi phần động của UI tăng lên thì cấu trúc trở nên phức tạp hơn, còn RSC có toàn bộ cây React được hợp nhất, nên việc truyền state và context (Context) diễn ra tự nhiên hơn
Astro lấy HTML làm trung tâm và RSC lấy cây React làm trung tâm
- Kết quả đầu ra của Astro là HTML, nên mỗi lần chuyển trang sẽ tải lại toàn bộ và không mang đến trải nghiệm SPA hoàn chỉnh
- Kết quả đầu ra của RSC là cây React (ban đầu là HTML, khi điều hướng thì được truyền dưới dạng JSON...)
- Nhờ vậy, có thể kết hợp ưu điểm của SPA và MPA
- Có thể thực hiện làm mới từng phần khi chỉ cập nhật trực tiếp một phần UI từ server, nhờ đó cũng dễ nhận dữ liệu động và giữ nguyên state phía client hơn
Hỗ trợ các tính năng React nâng cao
- Với cấu trúc cây pha trộn server-client, các tính năng nâng cao của React (ví dụ:
<Suspense>, view transition...) được tích hợp hỗ trợ một cách tự nhiên - Cũng có thể quản lý trạng thái loading được xử lý theo kiểu declarative ở phía client, cũng như việc trì hoãn font/image/JavaScript/style
- Mọi tính năng của React đều hoạt động end-to-end mà không bị ngắt quãng bởi ranh giới server-client
Vị thế của RSC và Astro
- Astro là một framework hoàn chỉnh, còn RSC gần với khối xây dựng hoặc tiêu chuẩn dành cho framework hơn
- Các triển khai RSC chính thức gồm có Next.js App Router và Parcel RSC
Kết luận và gợi ý
- Trải nghiệm lập trình viên (DX) của RSC hiện vẫn còn khá thô, nhưng rất đáng để học
- Nếu bạn chưa từng trải nghiệm Astro thì rất đáng thử; với những lập trình viên thấy RSC khó tiếp cận, Astro sẽ là con đường nhập môn nhẹ nhàng hơn
- Ngay cả với các lập trình viên chỉ dùng React phía client từ trước đến nay, Astro cũng có thể mang lại trải nghiệm giải quyết vấn đề ngoài dự đoán
3 bình luận
Hiện tôi đang refactor một ứng dụng React cũ sang Astro.
Trong bài viết, tác giả nhấn mạnh "ngữ cảnh tích hợp". Cần hiểu rằng "ngữ cảnh tích hợp" giúp xây dựng dịch vụ nhanh hơn, nhưng rồi đến lúc nào đó có thể trở thành nợ kỹ thuật.
Từ góc độ bảo trì dài hạn của dịch vụ, "liên kết lỏng giữa các mô-đun độc lập" tốt hơn "liên kết chặt tích hợp".
Và Astro chính là framework linh hoạt nhất cho điều đó.
Astro: phân phối JavaScript ở mức tối thiểu
Phát hành Astro 3.0
Ý kiến trên Hacker News
use clientcủa React