0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

React Server Components: Thay Đổi Cách Phát Triển Ứng Dụng

Đăng vào 3 giờ trước

• 5 phút đọc

React Server Components: Thay Đổi Cách Phát Triển Ứng Dụng

Giới thiệu

Bạn đã nghe nhiều về React Server Components (RSCs) và thậm chí đã thử sử dụng chúng, nhưng có thể bạn vẫn còn mơ hồ về chúng. RSCs sẽ thay đổi cách mà chúng ta phát triển ứng dụng React, với những lợi ích lớn về hiệu suất và kiến trúc.

Vấn đề: "Thác Nước" Đáng Sợ

Hãy tưởng tượng một ứng dụng React điển hình. Bạn có một trang cần lấy danh sách bài viết blog, và cho mỗi bài viết, bạn cần lấy thông tin tác giả. Trong một ứng dụng React truyền thống (kể cả với SSR), điều này tạo ra một "thác nước mạng" rắc rối.

Ví dụ về ứng dụng Client-side

javascript Copy
// React Client-side (sử dụng useEffect)
const BlogPage = () => {
  const [posts, setPosts] = useState(null);

  useEffect(() => {
    fetchPosts().then((data) => setPosts(data)); // 1. Lấy danh sách bài viết
  }, []);

  if (!posts) return <p>Đang tải bài viết...</p>;

  return (
    <div>
      {posts.map((post) => (
        <PostCard key={post.id} post={post} /> // 2. Mỗi PostCard lấy thông tin tác giả
      ))}
    </div>
  );
};

const PostCard = ({ post }) => {
  const [author, setAuthor] = useState(null);

  useEffect(() => {
    fetchAuthor(post.authorId).then((data) => setAuthor(data)); // 3. Lấy thông tin tác giả
  }, [post.authorId]);

  return (
    <article>
      <h1>{post.title}</h1>
      {author ? <p>By: {author.name}</p> : <p>Đang tải thông tin tác giả...</p>} {/* 4. Cuối cùng hiển thị */}
    </article>
  );
};

Quá trình này rất tuần tự. Việc lấy thông tin tác giả không thể bắt đầu cho đến khi dữ liệu bài viết đã được tải. Người dùng sẽ thấy một loạt các biểu tượng loading gây khó chịu.

Giải pháp: Một Lần Gọi Đến Server

React Server Components đảo ngược mô hình này. Chúng là các thành phần chạy hoàn toàn trên server, không tái render và không sử dụng state hay effects. Nhiệm vụ của chúng là lấy dữ liệu và mô tả UI.

Ví dụ với RSCs

javascript Copy
// app/blog/page.js
// Đây là một Server Component theo mặc định
async function BlogPage() {
  const posts = await fetchPosts(); // 1. Lấy dữ liệu trên server

  return (
    <div>
      {posts.map((post) => (
        <PostCard key={post.id} post={post} />
      ))}
    </div>
  );
}

// app/components/PostCard.js
async function PostCard({ post }) {
  const author = await fetchAuthor(post.authorId); // 2. Cũng lấy dữ liệu trên server!

  return (
    <article>
      <h1>{post.title}</h1>
      <p>By: {author.name}</p> {/* 3. Không cần trạng thái loading! */}
    </article>
  );
}

Chờ đã, await ngay bên trong thành phần? Đúng vậy! Đây là điều kỳ diệu. Cả hai cuộc gọi dữ liệu đều diễn ra trên server, trong cùng một môi trường. Không có độ trễ mạng. Giống như đọc từ bộ nhớ cache cục bộ, nhưng cho cơ sở dữ liệu của bạn.

Server giờ đây có thể giải quyết tất cả dữ liệu trong một lần và gửi một cấu trúc HTML hoàn chỉnh đến client. Thác nước đã biến mất.

Hình dung sự khác biệt

Sự chuyển đổi kiến trúc này là cực kỳ quan trọng. Sự khác biệt về Thời gian Tương tác (TTI) là rất lớn. Mô hình client-side bị cản trở bởi nhiều yêu cầu mạng tuần tự. Mô hình RSC hoàn thành tất cả công việc dữ liệu trong một ngữ cảnh thực thi trên server.

Tại sao điều này quan trọng: Những lợi ích lớn

  1. Cải thiện hiệu suất đáng kể: Không còn thác nước lấy dữ liệu trên client. Tăng tốc độ First Contentful Paint (FCP) và Time-To-Interactive (TTI).
  2. Giảm kích thước bundle client: JavaScript cho Server Components không bao giờ được gửi đến client, giảm đáng kể kích thước bundle. Thư viện nặng mà bạn sử dụng để render Markdown? Nó vẫn ở trên server.
  3. Truy cập backend trực tiếp: Bạn có thể truy cập cơ sở dữ liệu, API nội bộ hoặc hệ thống tệp trực tiếp từ các thành phần mà không cần xây dựng một endpoint REST/GraphQL riêng trước.
  4. Caching tự động: Kết quả đã render của Server Components có thể tự động được cache bởi framework (như Next.js), giúp các yêu cầu sau rất nhanh.

Cái khó (Không phải mọi thứ đều hoàn hảo)

  • Sự phức tạp về mặt tư duy: Rào cản lớn nhất. Giờ đây bạn có hai loại thành phần và phải luôn suy nghĩ về nơi mà mã của bạn đang thực thi.
  • Phức tạp: Điều này tạo ra một lớp phức tạp mới cho React, vốn đã rất nhiều cho người mới bắt đầu.
  • Hỗ trợ thư viện: Không phải tất cả thư viện bên thứ ba đều tương thích với Server Components. Bạn thường cần bọc chúng trong một Client Component.

Kết luận: Bạn có nên quan tâm?

Chắc chắn rồi. Mặc dù độ dốc học hỏi là dốc, React Server Components đại diện cho tương lai của phát triển ứng dụng React trong các ứng dụng nặng về dữ liệu. Chúng giải quyết các vấn đề thực tế về hiệu suất và kiến trúc một cách tinh tế.

Chúng không chỉ là một "tính năng mới"; chúng là một mô hình mới. Bắt đầu bằng cách hiểu mô hình tư duy phân chia ứng dụng của bạn thành các phần tĩnh (Server) và tương tác (Client). Lợi ích về hiệu suất và UX là quá lớn để bỏ qua.

Các câu hỏi thường gặp (FAQ)

1. React Server Components có tương thích với các thư viện bên thứ ba không?
Không phải tất cả. Bạn có thể cần bọc chúng trong Client Components.

2. Lợi ích lớn nhất của RSC là gì?
Cải thiện hiệu suất và giảm kích thước bundle client.

3. Làm thế nào để bắt đầu với RSC?
Hãy tìm hiểu cách phân chia ứng dụng của bạn thành Server Components và Client Components.

Nếu bạn đã từng sử dụng Server Components trong sản phẩm, hãy cho tôi biết trải nghiệm của bạn trong phần bình luận bên dưới! Nếu bạn muốn hỗ trợ nội dung của tôi, bạn có thể mua cho tôi một ly cà phê tại đây: Mua Cà Phê.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào