引言

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 应用具有重要意义。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部