So sánh React Server Components vs Astro Islands — Chọn đúng kiến trúc cho dự án 2025
RSC chia theo execution environment, Astro Islands chia theo interactivity. Bảng so sánh chi tiết: JS payload, hydration, navigation, DX — và khi nào chọn cái nào.

So sánh React Server Components vs Astro Islands — Chọn đúng kiến trúc cho dự án 2025
TL;DR
- React Server Components (RSC) chia component theo execution environment — server hoặc client
- Astro Islands chia theo interactivity — static HTML hoặc interactive JS
- Astro mặc định ship 0 KB JavaScript, RSC vẫn cần ~46KB React runtime
- Content site (blog, docs) → Astro Islands. App-heavy (dashboard, SaaS) → RSC
- Cả hai đều giải quyết cùng bài toán: quá nhiều JavaScript trên trình duyệt
Nếu bạn đang chọn kiến trúc cho dự án web tiếp theo trong năm 2025-2026, hai cái tên sẽ liên tục xuất hiện: React Server Components và Astro Islands. Cả hai đều hứa hẹn cùng một điều — giảm JavaScript, tăng hiệu năng, cải thiện trải nghiệm người dùng. Nhưng cách tiếp cận hoàn toàn khác nhau, và chọn sai có thể khiến bạn phải refactor toàn bộ sau vài tháng. Bài viết này sẽ so sánh từ góc nhìn thực tế của một developer đang dùng Astro cho blog cá nhân (chính trang bạn đang đọc!) và từng build dashboard SaaS với Next.js RSC. Không lý thuyết suông — chỉ có dữ liệu, code, và kinh nghiệm thật.
1. Bài toán chung: JavaScript đang giết chết trải nghiệm web
Theo HTTP Archive (2025), trang web trung bình ship khoảng 450KB JavaScript đến trình duyệt. Với SPA (Single Page Application) truyền thống, toàn bộ JS phải được tải, parse, và execute trước khi người dùng thấy bất kỳ nội dung nào. Kết quả: Time to Interactive (TTI) kéo dài, Core Web Vituals tệ hại, và Google phạt thứ hạng.
Cả RSC và Astro Islands đều sinh ra để giải quyết vấn đề này, nhưng từ hai triết lý khác nhau:
RSC: “Giữ React, nhưng chạy phần không cần interactivity trên server.”
Astro Islands: “Bắt đầu từ HTML thuần, chỉ thêm JS cho phần cần.”
2. Astro Islands: “HTML trước, JavaScript khi cần”
Astro hoạt động theo nguyên tắc Islands Architecture — toàn bộ trang web được render thành static HTML tại build time. Chỉ những component cần interactivity mới được “hydrate” (thêm JavaScript) trên client.
Cách hoạt động
Hãy tưởng tượng trang web như đại dương tĩnh lặng (HTML), với một vài hòn đảo (islands) có sự sống (JavaScript). Mỗi đảo hoàn toàn độc lập — load JS riêng, hydrate riêng, không ảnh hưởng lẫn nhau.
---
// Header.astro — static, 0 JS
---
<header>
<h1>Bug.edu.vn</h1>
<nav>...</nav>
</header>
<!-- SearchWidget cần interactivity → thêm client directive -->
<SearchWidget client:visible />
<!-- Comments load khi user idle -->
<Comments client:idle />Client Directives
| Directive | Khi nào hydrate | Use case |
|---|---|---|
client:load | Ngay lập tức khi page load | Critical interactive elements |
client:visible | Khi component scroll vào viewport | Below-the-fold widgets |
client:idle | Khi browser rảnh (idle) | Non-urgent features |
client:media | Khi media query match | Mobile-only components |
client:only | Chỉ render trên client | Components cần browser API |
Framework Agnostic
Điểm cực mạnh của Astro: bạn có thể mix nhiều framework trên cùng một trang. Một island dùng React, island khác dùng Svelte, island thứ ba dùng SolidJS — tất cả chung sống hòa bình. Đây là điều RSC không thể làm được vì nó gắn chặt với hệ sinh thái React.
Server Islands (Astro 4.x+)
Phiên bản mới nhất của Astro giới thiệu Server Islands — cho phép inject nội dung dynamic từ server vào trang static. Ví dụ: hiển thị tên user đăng nhập trên header mà không cần hydrate toàn bộ trang. Đây là giải pháp cho personalized content trên content-driven websites mà không hy sinh performance.
3. React Server Components: “Server-first React”
RSC là tính năng cốt lõi của React (từ phiên bản 18+), tích hợp sâu nhất trong Next.js (từ v13). RSC chia component tree thành hai loại rõ ràng: Server Components chạy trên server, Client Components chạy trên browser.
Cách hoạt động
Server Components render trên server, gửi HTML + serialized payload xuống client. Client Components được đánh dấu bằng directive 'use client' và được hydrate trên browser.
// page.tsx — Server Component (default)
// Có thể truy cập database trực tiếp!
import { db } from '@/lib/db';
export default async function DashboardPage() {
const stats = await db.getStats(); // fetch trên server
return (
<div>
<h1>Dashboard</h1>
<StatsDisplay data={stats} /> {/* Server Component */}
<InteractiveChart client data={stats} /> {/* Client Component */}
</div>
);
}// InteractiveChart.tsx
'use client'; // ← Chỉ component này có JS trên browser
import { useState } from 'react';
export function InteractiveChart({ data }) {
const [filter, setFilter] = useState('all');
return <Chart data={data} filter={filter} />;
}Streaming HTML
RSC hỗ trợ streaming — server gửi HTML theo từng chunk khi sẵn sàng, kết hợp với React Suspense. Người dùng thấy nội dung xuất hiện dần dần thay vì chờ đợi toàn bộ trang load xong. Điều này cải thiện đáng kể Largest Contentful Paint (LCP) vì visual feedback xuất hiện nhanh hơn — một lợi thế quan trọng mà Astro với static HTML và Multi-Page App navigation truyền thống không dễ đạt được trong các ứng dụng có dữ liệu phức tạp.
Instant Client-Side Navigation
Sau lần load đầu tiên, RSC cho phép client-side navigation — chuyển trang mà không cần full page reload. Đây là lợi thế cực lớn cho ứng dụng có nhiều tương tác như dashboard hay e-commerce, nơi người dùng liên tục navigate giữa các trang.
4. Bảng so sánh chi tiết
| Tiêu chí | Astro Islands | React Server Components |
|---|---|---|
| JS mặc định | 0 KB | ~46KB (React runtime) |
| Hydration | Selective, per-island | Bundle client components |
| Navigation | Full page (+ View Transitions) | Client-side routing |
| State sharing | Islands cô lập | Tự nhiên qua React tree |
| Data fetching | Tại build time hoặc API | Trực tiếp trên server |
| Framework | Agnostic (React, Vue, Svelte) | React only |
| Streaming | Static HTML at build | Runtime streaming |
| Learning curve | Thấp | Trung bình - Cao |
| Bundle reduction | ~100% cho static | 18-29% vs truyền thống |
| Core Web Vitals | Xuất sắc | Tốt |
| Best for | Content sites | Interactive apps |
Performance Metrics
| Metric | Astro | Next.js (RSC) |
|---|---|---|
| FCP (First Contentful Paint) | ~0.5s | ~0.8s |
| TTI (Time to Interactive) | ~0.6s (static) | ~1.2s |
| JS Transfer | 0-5 KB (tuỳ islands) | 50-150 KB |
| Lighthouse Score | 95-100 | 85-95 |
5. Khi nào chọn Astro Islands?
Astro là lựa chọn hoàn hảo khi nội dung là vua:
- Blog & Content sites — Chính trang bug.edu.vn bạn đang đọc được build bằng Astro! Lighthouse score 95+, JS gần như 0 cho trang bài viết
- Documentation — Astro Starlight (template docs chính thức) được dùng bởi chính Astro docs và nhiều dự án OSS
- Marketing & Landing pages — Load nhanh nhất có thể, SEO tối ưu
- E-commerce storefronts — Trang sản phẩm static, hydrate cart + search
Case study thực tế: bug.edu.vn
Blog bạn đang đọc được build bằng Astro 4.x. Kết quả:
- 0 KB JS cho trang bài viết (trừ analytics)
- Lighthouse Performance: 98/100
- Build time cho 23 bài viết: < 3 giây
- Mix components: React cho interactive widgets, Vanilla JS cho animations
6. Khi nào chọn React Server Components?
RSC tỏa sáng khi interactivity là ưu tiên hàng đầu:
- SaaS Dashboards — real-time data, complex forms, nhiều tương tác
- E-commerce với complex flows — cart, checkout, recommendations
- Admin panels — CRUD operations, data tables, filters
- Social platforms — feeds, comments, notifications
Khi nào RSC vượt trội hơn Astro?
Khi ứng dụng của bạn có nhiều page transitions liên tục. Astro mỗi lần chuyển trang là full page reload (dù View Transitions giảm cảm giác “giật”), còn RSC cho phép navigation mượt mà như SPA. Nếu user liên tục click qua lại giữa 10-20 trang trong 1 session, RSC cho trải nghiệm tốt hơn hẳn.
Câu hỏi thường gặp
Astro có thể dùng React Server Components không?
Không trực tiếp. Astro sử dụng React như một island framework — bạn dùng React components trong Astro, nhưng chúng chạy theo Astro’s hydration model (client directives), không phải RSC model. Tuy nhiên, Astro’s Server Islands cung cấp chức năng tương tự RSC cho nội dung dynamic.
RSC có thay thế hoàn toàn SSG không?
Không. RSC là bổ sung, không phải thay thế. Next.js vẫn hỗ trợ Static Site Generation (SSG) song song với RSC. Bạn có thể có trang static (generated at build time) và trang dynamic (RSC streaming) trong cùng một project. Chọn strategy phù hợp cho từng route.
Developer mới nên học cái nào trước?
Nếu bạn chưa biết React, hãy bắt đầu với Astro — learning curve thấp hơn đáng kể, syntax gần HTML thuần, và bạn có thể dùng bất kỳ framework nào (hoặc không dùng framework nào). Nếu đã quen React, hãy thử Next.js App Router + RSC để hiểu server/client boundary.
Kết luận
React Server Components và Astro Islands không phải đối thủ — chúng là hai giải pháp cho hai bài toán khác nhau. Astro Islands là vũ khí tối thượng cho content-driven websites, nơi mỗi kilobyte JavaScript thừa đều là tội lỗi. RSC là kiến trúc mạnh mẽ cho ứng dụng web phức tạp, nơi developer cần control grain nhỏ giữa server và client mà vẫn giữ được trải nghiệm React quen thuộc. Quyết định đúng không phải “cái nào tốt hơn” mà là “bài toán của mình thuộc loại nào” — content-first hay interaction-first. Và nếu dự án của bạn cần cả hai? Hoàn toàn khả thi: dùng Astro cho marketing site + blog, Next.js RSC cho dashboard — cùng design system, khác kiến trúc.
💡 Hành động ngay hôm nay
- Thử Astro 5 phút:
npm create astro@latest→ deploy lên Vercel/Netlify miễn phí - Thử RSC 10 phút:
npx create-next-app@latest --app→ khám phá Server/Client Components - Đọc thêm: Astro Islands Architecture và Next.js RSC docs
Nguồn tham khảo
- LogRocket — “React Server Components vs Astro Islands: A detailed comparison” (2025)
- pkgpulse.com — “Astro vs Next.js: Performance Comparison 2025”
- Vercel Blog — “Understanding React Server Components”
- Astro Documentation — “Islands Architecture”
- Dan Abramov — overreacted.io, comments on Astro’s mental model simplicity
- HTTP Archive — Web Almanac 2025, JavaScript payload statistics



