深入理解 React Server Components

4 min

1. React Server Components (RSC) 是什么?

React Server Components (RSC) 是一种新的 React 组件类型,它在 构建时或在服务器上 被渲染。与传统的在客户端浏览器中渲染的组件(现在称为 “Client Components”)不同,RSC 的代码永远不会被发送到客户端。浏览器接收到的仅仅是渲染好的 HTML 或一种特殊的流式格式。

这标志着 React 从一个纯粹的客户端库,演变为一个可以在服务器和客户端之间无缝工作的全栈框架。

2. RSC 解决了哪些问题?

RSC 的出现主要为了解决以下几个核心痛点:

  • 巨大的 JavaScript 包体积: 传统 React 应用会将所有组件的 JS 代码(包括那些不直接交互的)打包发送到客户端,导致初始加载缓慢。RSC 允许我们将大量组件(如文本、布局、数据展示)保留在服务端,从而实现 零 JS 体积
  • 请求瀑布 (Request Waterfalls): 在客户端获取数据的典型模式是:渲染组件 -> useEffect -> 发起请求 -> 等待数据 -> 再次渲染。如果组件嵌套层级很深,就会形成请求瀑布,拖慢页面呈现速度。RSC 可以在服务端直接 async/await 数据获取,将数据和组件一起流式传输到客户端,从根本上解决了这个问题。
  • 直接访问后端资源: RSC 运行在服务端环境中(如 Node.js),这意味着它们可以直接、安全地访问数据库、文件系统或内部 API,无需再暴露额外的 API 端点给客户端。

3. Server Components vs. Client Components

理解两者的区别是掌握 RSC 的关键。

特性Server Components (服务端组件)Client Components (客户端组件)
运行环境服务器 (Node.js 等)客户端 (浏览器)
JS 发送到客户端
状态 (State)不支持 (e.g., useState)支持
生命周期/Hooks不支持 (e.g., useEffect)支持
交互 (Events)不支持 (e.g., onClick)支持
数据获取支持 async/await通过 useEffect 或数据获取库
导入规则不能导入客户端组件可以导入服务端组件 (作为 childrenprop)

经验法则: 默认将所有组件视为 Server Components。只有当你的组件需要使用 useState, useEffect 或处理用户事件 (onClick 等) 时,才在文件顶部添加 "use client"; 指令,将其标记为 Client Component。

4. 它们如何协同工作?

一个现代 React 应用会是两者的混合体。例如,一个博客文章页面:

  • PageLayout (服务端组件): 负责整体布局。
  • ArticleContent (服务端组件): 从数据库或 Markdown 文件中获取文章数据并渲染。
  • LikeButton (客户端组件): 包含 useStateonClick 事件来处理点赞交互。
  • Comments (客户端组件): 获取并显示评论,包含表单提交等交互。

服务端组件可以在服务端“持有”客户端组件的“坑位”,最终在浏览器中将两者无缝地拼接在一起。

结论

React Server Components 是一次深刻的范式转变,它将 React 的能力从浏览器扩展到了服务器,带来了显著的性能优势和更优的开发体验。虽然它引入了新的心智模型,但通过 Next.js App Router 等框架的实践,RSC 正在快速成为构建高性能、可扩展 Web 应用的新标准。