服务端组件只在服务器上执行:可以直接读数据库、调内部接口、引入大体积依赖,而这些代码永远不会被打包进客户端。RSC 也不是传统的 SSR 字符串——它向浏览器发送的是可流式解析的组件描述,客户端组件可以直接作为它的子节点嵌入,两者在树上混合渲染。
分工原则是默认用服务端组件,需要交互再加 use 客户端指令。Next.js 的 App Router 是目前最完整的落地:页面级默认 RSC,交互组件标 use client。限制同样明显:服务端组件不能用 state、不能响应用户事件,且整个体系依赖框架与打包器的深度改造,独立用很难。
// page.server.jsx —— 服务端组件:直接取数据,零客户端体积 import Db from './db'; import Counter from './Counter'; // 客户端组件 export default async function Page() { const list = await Db.query('SELECT id, title FROM posts LIMIT 10'); return ( <main> <h1>文章列表</h1> <ul>{list.map((p) => <li key={p.id}>{p.title}</li>)}</ul> <Counter label="点赞" /> {/* 客户端组件可嵌入 */} </main> ); }