内容提要
React Server Components(RSC)将无需交互的代码移至服务端,以减小客户端体积、提升性能。Next.js激进推进RSC生产化引发社区分歧:反对者认为“两个React”增加学习成本、React更新缓慢且过度绑定Vercel;支持者Dan Abramov主张开放包容、在实践中迭代。作者认同拥抱变革,认为RSC推动全栈化,提升前端职业天花板。
延伸解读
RSC 的性能优势与适用场景
文章通过 markdown 渲染示例说明,将无需交互的代码移至服务端可显著减少客户端包体积。例如,marked 和 sanitize-html 依赖在客户端打包时超过 200KB,而使用 RSC 后这些依赖零打包,客户端只需接收渲染结果。这提示开发者,对于内容展示类、数据获取类等无交互需求的组件,优先考虑使用服务端组件,以提升加载速度和响应性能。
社区分歧的根源:两个 React 的认知负担
RSC 引入了服务端组件与客户端组件的明确分野,两者在 hooks 使用、浏览器 API 访问权限上存在显著差异。反对者如 Cassidy Williams 认为,这种分裂增加了学习成本和混淆,尤其当 Next.js 在 RSC 仍为金丝雀版本时便激进推进生产化,导致开发者面临“两个 React”的困惑。这提醒团队在技术选型时需评估成员对双组件模型的理解成本。
React 生态的治理争议与框架绑定
文章指出,React 核心团队与 Next.js 团队交集过多,使 Vercel 获得领先优势,而 Remix 等其他框架可能受 React 已修复但未发布错误的影响。同时,React 自 2022 年 6 月以来未有新版本发布,却鼓励使用上层框架,这引发了对 React 更新缓慢和过度绑定 Vercel 的批评。开发者需关注这种生态集中度对技术选型长期灵活性的潜在影响。
拥抱变革:RSC 推动前端全栈化
作者认同 Dan Abramov 的开放态度,认为 RSC 提升了大型应用性能并优化数据获取流程,比传统 SSR 更便捷。随着 Node v20 和 RSC 的应用,前端与后端界限进一步模糊,前端工程师将更多处理数据查询优化、服务器资源管理等后端工作。这为前端开发者打开了全栈开发的大门,有望提高职业天花板和拓宽工作广度。
Q&A
React Server Components 是什么?它有什么好处?
React Server Components(RSC)是只在服务端运行的 React 组件,可以调用服务端方法、访问数据库等。它们预渲染后把 HTML 发送到客户端,由客户端进行水合。好处是原本要打包在客户端 JavaScript 里的代码可以放在服务端运行,从而减小客户端体积,提升应用性能和响应速度。
为什么社区对 React Server Components 产生分歧?
分歧的根本原因是 React 引入了服务端概念,导致服务端组件和客户端组件有明显差异:服务端组件不能用 useState、useEffect 等 hook,无权访问浏览器 API;客户端组件则相反。Next.js 在 v13/v14 中将仍是金丝雀版本的 RSC 搬到生产环境,'use client' 和 'use server' 引发讨论,开发者认为出现了“两个 React”,社区开始争吵 React 是在进步还是退步。
反对 RSC 和 Next.js 激进推进的主要观点有哪些?
反对者包括 Cassidy Williams、Tanner Linsley 和 Tom MacWright。Cassidy 认为“两个 React”带来新概念混淆和学习障碍,React 自 2022 年 6 月以来没有新发布,还鼓励使用上层框架,且疏于更新文档。Tanner 认为 React 过分专注少数概念,对日常用户价值影响甚微,对客户端性能追求减弱。Tom 批评 React 更新缓慢,上层框架 Remix 和 Next.js 竞争,React 团队与 Next.js 团队交集过多让 Vercel 获得优势,其他框架受未发布错误影响。
Dan Abramov 如何回应社区对 RSC 的批评?
Dan Abramov 对技术变革持开放态度。他认为 Next.js 的 App Router 有雄心但处于初期,未来会迭代更好。他解释客户端组件的工作是 UI = f(state),服务端组件是 UI = f(data),React 希望组合二者实现 UI = f(data, state)。对于 Next.js 将 RSC 发布到生产,他认为“生产就绪”是主观判断,虽然 RSC 还是金丝雀版本,但 Facebook 已大量使用,在实践中验证才能更快完善技术。他号召社区放下偏见,共同在实践中摸索 React 下一阶段的变革。
RSC 对前端开发者的职业发展有什么影响?
随着 Node v20 的发布和 RSC 的应用,前端和服务端的距离进一步缩小,前端工作出现“后端化”趋势——前端工程师会处理更多传统上属于后端的工作,如数据查询优化、服务器资源管理等。这为前端工程师打开了一扇门,有机会更全面掌握整个 Web 应用开发流程,即“全栈开发”,从而提高前端的职业天花板和扩大工作广度。
RSC 如何优化客户端包体积?能举个例子吗?
RSC 将不需要交互的代码放在服务端运行,从而减少客户端 JavaScript 打包体积。例如渲染 markdown 内容时,客户端组件需要引入 marked(35.9K,gzipped 11.2K)和 sanitize-html(206K,gzipped 63.3K),客户端至少下载 200 多 K 文件;而使用 RSC,这些依赖包放在服务端,打包大小为 0,服务端只返回用户需要看到的内容,客户端包一下子小了 200 多 K。