重读 React Server Components:一年后的实践答案
组件边界、数据获取与缓存策略——RSC 落地一年后值得记住的十件事。
☰ 本文目录(3 节)
RSC 不是「服务端渲染的回归」,而是一种新的组件分类学。用了一年,记下十条最值得复述的经验。
组件边界即数据边界#
Server Component 里能直接 await 数据,但不要因此把数据获取塞进叶子组件。边界应当沿「数据所有权」划分:
export default async function Page({ params }) { const { slug } = await params const post = await getPost(slug) // 服务端直达数据层 return <ArticleBody post={post} /> // 子组件只吃 props}十条经验#
- 默认都是 Server Component,需要交互再加
"use client" - 把
use client的组件推到叶子,序列化边界越小越好 childrenprop 是穿透边界传 JSX 的正道- Server Actions 适合表单与变更,不适合高频轮询
- 缓存三件套:请求级
cache、路由段 ISR、标签revalidateTag searchParams与params都是 Promise,记得await- 流式渲染配合 Suspense,先出骨架再补数据
- 错误边界(error.tsx)必须在 Client Component 里
- 不要在 Server Component 里引用浏览器 API
- RSC payload 不等于 HTML——它是可恢复的组件树协议
一个反例#
"use client"export function CommentList({ postId }) { const [comments, setComments] = useState([]) useEffect(() => { fetch(`/api/comments?post=${postId}`) // ❌ 多一跳、多一状态机 .then(r => r.json()).then(setComments) }, [postId])}同样的数据在服务端一行就能拿到,序列化成本远低于一条额外请求加瀑布。