我对 React Server Components 的看法:方向对了,代价被低估了
聊聊 React Server Components。这个话题我被问过太多次,干脆写下来。
RSC 解决的是真问题
先说立场:我认为 RSC 的方向是对的。
客户端 bundle 无限膨胀是前端这十年最大的债。一个内容型页面,用户要下载渲染逻辑、数据请求逻辑、甚至 Markdown 解析器,只为看一篇静态文章——这是荒谬的。RSC 把「只在服务端有意义的代码」留在服务端,是对这种荒谬的系统性纠正。
数据获取和组件的合并也是真提升。async 组件直接 await 数据,比 useEffect + loading state 的瀑布流干净太多。
但代价被严重低估了
我倾向于认为,RSC 的推广宣传低估了三个代价:
1. 心智模型的撕裂
「这个组件跑在哪」变成了每个 React 开发者时刻要回答的问题。server / client 边界处处存在:不能传函数、不能传类实例、use client 的传染性……这些规则单个都不难,叠在一起就是持续的认知税。
2. 生态的割裂
大量成熟的库假设自己跑在客户端。RSC 时代它们要么重写、要么被隔离在 client 边界内。这个迁移的时间尺度是以年计的,期间所有人都要忍受「这个库能不能在 server component 里用」的反复确认。
3. 调试体验的倒退
跨越网络边界的组件树,报错栈变得难以理解。序列化边界上的错误信息至今仍然对新手极不友好。
我的建议
如果你在做内容型、电商型网站,RSC(配合成熟框架)值得上。如果你在做重交互的 dashboard 类应用,我不确定收益能覆盖迁移成本——传统 SPA + 代码分割可能仍是更务实的选择。
另外说一句:React Router 现在的 SSR + loader 模式,其实已经拿到了 RSC 的大部分收益(服务端取数、减少客户端瀑布流),而心智模型简单得多。这也是这个博客用它的原因。
技术选型永远是权衡。方向正确不等于此刻就该 all in。
相关文章
- 前端工程师应该学 Rust 吗?我的答案是:看动机
工具链已经 Rust 化,但「工具链用 Rust」和「你要写 Rust」是两回事。
- 如何监听 div 是否渲染完成
本文介绍了在Next.js中使用NextMarkdownPreview组件时,如何通过MutationObserver监听div的ref对象来解决按需加载导致的加载慢问题。通过监听childList变化,可以及时获取容器内容变化,优化用户体验。
- react-monaco-markdown 操作手册
react-monaco-markdown是一个React组件,集成了Monaco编辑器和Markdown解析,支持实时预览和编辑Markdown文档。支持npm、pnpm、yarn安装。提供多种配置选项,如主题、只读模式、自定义渲染等。适用于Next.js等SSR环境。MIT许可。