引言
React Server Components(RSC)是 React 团队近年来提出的最具颠覆性的技术方案之一。它不仅仅是一个新 API,而是一种全新的组件模型——让组件可以在服务端渲染并流式传输到客户端,从而在保持交互性的同时大幅减少客户端 JavaScript 体积。
一、RSC 的设计哲学
在传统 SSR 中,服务器渲染 HTML 后,客户端需要 hydration(注水)过程来绑定事件和处理交互。这意味着即使是不需要交互的静态内容,也要打包相应的 JavaScript 发送到客户端。RSC 的核心洞察是:不是所有组件都需要在客户端运行。
RSC 将组件分为两类:
- Server Components:只在服务端运行,可以直接访问数据库、文件系统等后端资源,零客户端 JS 开销
- Client Components:需要交互性的组件(事件处理器、State、Effects),在客户端 hydrate
二、双模块图架构
RSC 引入了一个关键概念——双模块图(Dual Module Graph)。服务端维护两个模块树:客户端树包含所有 Client Components 及其依赖,服务端树包含全量组件。React Server 运行服务端树,渲染过程中遇到 Client Components 时,会将其替换为占位符,并引用对应的客户端 chunk。
三、流式渲染与选择性 Hydration
RSC 的流式传输机制允许服务器将组件树以分块(chunk)形式发送到客户端。这意味着用户可以在页面完全渲染前就看到部分内容。结合 React 18 的选择性 Hydration(Selective Hydration),即使某些部分的 JS 还未加载,用户也可以与已加载部分进行交互。
四、Next.js App Router 实战
Next.js 13+ 的 App Router 是 RSC 理念的工程化实现。默认情况下,app/ 目录下的所有组件都是 Server Components:
// app/posts/page.tsx — 默认是 Server Component
async function getPosts() {
const res = await fetch('https://api.example.com/posts');
return res.json();
}
export default async function PostsPage() {
const posts = await getPosts();
return (
<ul>
{posts.map(post => <li key={post.id}>{post.title}</li>)}
</ul>
);
}
需要交互时,通过 'use client' 指令切换为 Client Component:
'use client';
import { useState } from 'react';
export default function LikeButton() {
const [liked, setLiked] = useState(false);
return <button onClick={() => setLiked(!liked)}>{liked ? '❤️' : '🤍'}</button>;
}
五、Server Actions:RPC 级别的互操作
RSC 的另一核心创新是 Server Actions。它允许客户端组件直接调用服务端函数,就像调用本地函数一样:
// app/actions.ts
'use server';
export async function createPost(formData: FormData) {
const title = formData.get('title');
await db.posts.create({ title });
revalidatePath('/posts');
}
// app/new-post/page.tsx (Client Component)
'use client';
import { createPost } from './actions';
export default function NewPost() {
return <form action={createPost}>
<input name="title" />
<button type="submit">发布</button>
</form>;
}
六、性能对比与实际收益
根据 Vercel 的基准测试,在典型内容型网站场景下,RSC 方案相比传统 SPA 方案有显著优势:
- 首屏 JavaScript 减少 60-80%(纯服务端组件零 JS)
- TTI(可交互时间)提升 30-50%(更少的 JS 解析与执行)
- 数据库查询延迟降低 40%(组件直连数据库,无中间 API 层)
七、限制与注意事项
Server Components 并非银弹,需要注意以下限制:
- 不能使用
useState、useEffect等 Hook - 不能访问浏览器 API(
window、document等) - 不能直接使用事件处理器(
onClick等) - 需要合理划分服务端/客户端边界,避免过度碎片化
八、未来展望
RSC 的设计哲学正在引发更广泛的思考框架。React 团队提出的 "React Forget" 编译器将自动处理 memoization,进一步减少开发者心智负担。同时,RSC 与 Partial Prerendering(部分预渲染)的结合将为性能优化开辟新的可能性。
RSC 代表了前端架构从 "一切在客户端" 向 "按需分发计算" 的范式转变。理解并掌握这一技术,对于构建下一代高性能 Web 应用具有重要意义。

发表评论 取消回复