理解 React Server Components
理清 RSC 到底解决了什么问题,以及"use client" 边界该怎么划。
前端1 分钟
它解决的不是性能问题
RSC 最直接的收益是组件可以在服务端执行、不进入客户端 bundle。但真正的分水岭在于:数据获取从"客户端发起请求"变回"服务端直接读数据源"。
// 服务端组件:直接读数据库,没有 API 层
export default async function Page() {
const rows = await db.query("select * from moments limit 10");
return <Feed items={rows} />;
}代价是你需要清楚地知道哪一段代码跑在哪里。
边界怎么划
判断标准只有一条:这段代码是否需要浏览器能力?
- 需要
useState/useEffect/ DOM API / 事件监听 →"use client" - 只做数据读取和渲染 → 服务端组件,不用加任何指令
客户端组件应该尽量小而靠叶子节点。常见错误是给整个页面加 "use client",那样下面的所有子组件都会被打包进客户端。
服务端组件不能做什么
- 不能用 hooks(没有状态生命周期)
- 不能传函数给客户端组件(不可序列化),只能传可序列化的数据
- 不能访问
window/localStorage
一点实践体会
把"数据获取"留在服务端、"交互"留在客户端,中间用最小的 props 连接。这样客户端 bundle 通常能压到很小,LCP 也更容易达标。