
Việc phát hành React Server Components (RSC) đã thay đổi cơ bản các mô hình kiến trúc của ứng dụng React. Trước RSC, React chủ yếu tập trung vào việc hiển thị các component tương tác trong trình duyệt (hoặc đôi khi pre-render chúng thành HTML thông qua SSR). Với React Server Components, giờ đây chúng ta có một sự phân chia rõ ràng: các component chỉ chạy trên máy chủ và các component chạy trên máy khách.
Bài viết so sánh trực tiếp các đặc tính kiến trúc cốt lõi, lợi ích kiến trúc của phương pháp kết hợp này và ma trận quyết định khi nào nên sử dụng Server Component so với Client Component.
React Server Components là các component chỉ chạy trên máy chủ. Chúng không bao giờ được gửi đến trình duyệt dưới dạng JavaScript. Thay vào đó, máy chủ thực thi logic của React component, tìm nạp mọi dữ liệu cần thiết trực tiếp từ cơ sở dữ liệu hoặc API nội bộ và truyền trực tiếp HTML/UI kết quả đến máy khách.
useEffect các vấn đề về tìm nạp dữ liệu.Vì Server Components không bao giờ chạy trong trình duyệt, chúng không thể sử dụng các API chỉ dành cho trình duyệt hoặc các React hook phụ thuộc vào trạng thái phía máy khách. Bạn không thể sử dụng useState, useEffect, onClick hoặc window.localStorage bên trong Server Component.
Client Components là các React component tiêu chuẩn mà bạn đã quen thuộc. Chúng được gửi đến trình duyệt dưới dạng JavaScript, nơi chúng được thực thi và hydrate để cung cấp khả năng tương tác phong phú. Trong Next.js App Router, bạn đánh dấu rõ ràng một component là Client Component bằng cách đặt chỉ thị "use client" ở đầu tệp.
Bạn phải sử dụng Client Components bất cứ khi nào UI của bạn yêu cầu tính tương tác hoặc trạng thái phía máy khách:
onClick, onChange hoặc gửi biểu mẫu.useState hoặc logic phức tạp với useReducer.useEffect (ví dụ: đăng ký WebSocket hoặc tương tác với DOM).Geolocation hoặc IntersectionObserver.Sức mạnh thực sự của React hiện đại nằm ở việc kết hợp cả hai mô hình. Thực hành tốt nhất là xây dựng toàn bộ cây ứng dụng từ Server Components, sau đó "rắc" Client Components chỉ vào các lá cụ thể của cây yêu cầu tính tương tác.
Hãy tưởng tượng xây dựng một trang bài đăng blog.
onClick và trạng thái phía máy khách. Bạn sẽ trích xuất chỉ những phần này vào các tệp riêng biệt, đánh dấu chúng bằng "use client" và nhập chúng vào bố cục Server Component của bạn.// This is a Server Component (default in Next.js)
import db from '@/lib/db';
import LikeButton from './LikeButton'; // Client Component
export default async function BlogPost({ id }) {
// Direct, secure database access
const post = await db.post.findUnique({ where: { id } });
return (
<article>
<h1>{post.title}</h1>
<div dangerouslySetInnerHTML={{ __html: post.content }} />
{/* We pass static data to an interactive Client Component */}
<LikeButton initialLikes={post.likes} postId={post.id} />
</article>
);
}
Đọc thêm: Nếu bạn đang gặp khó khăn với SSR, hãy xem hướng dẫn này về cách khắc phục Lỗi Hydration của Next.js.
Không. Vì Client Components chạy trong trình duyệt, bất kỳ component nào chúng nhập cũng sẽ buộc phải chạy trong trình duyệt (và được bao gồm trong gói JS). Tuy nhiên, bạn có thể truyền Server Component dưới dạng prop children cho Client Component, giữ nguyên môi trường của Server Component.
Có! Trong các framework như Next.js, Client Components vẫn được pre-render trên máy chủ để tạo HTML ban đầu (SSR), nhưng chúng cũng được gửi đến máy khách để được hydrate với khả năng tương tác. Mặt khác, Server Components chỉ được render trên máy chủ và không bao giờ được hydrate trên máy khách.
Server Components là không trạng thái. Bạn có thể truyền dữ liệu tĩnh (như kết quả truy vấn cơ sở dữ liệu) xuống Client Component thông qua props. Nếu bạn cần trạng thái tương tác toàn cục (như giỏ hàng hoặc chủ đề người dùng), trạng thái đó phải được quản lý hoàn toàn trong cây Client Component bằng cách sử dụng các thư viện như Zustand, Jotai hoặc React Context.
Làm sạch log AI CLI, tạo biểu thức cron, giải mã JWT và tính quyền chmod offline.

Nắm vững cách debug lỗi React hydration mismatch với Server Components, tránh sự khác biệt markup giữa client-server và loại bỏ lỗi hydration trong Next.js.
Đọc tiếp
Hướng dẫn toàn diện về giao thức React Server Components Flight: định dạng truyền tải luồng, tuần tự hóa & hydration chọn lọc với kiến trúc cấp độ sản xuất và ví dụ mã.
Đọc tiếp
Tìm hiểu sâu về cách quản lý form trong Next.js 14 bằng Server Actions, useFormState, useFormStatus và Zod để xác thực schema, giúp bạn xây dựng các form hiện đại, nâng cao dần mà không mệt mỏi với JavaScript phía client.
Đọc tiếp