速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

React 服务器组件会毁了 React 吗?

  • 2024-10-16
    北京
  • 本文字数:3125 字

    阅读完需:约 10 分钟

大小:1.54M时长:08:56
React服务器组件会毁了React吗?

“在我看来,React Server Components 将会毁掉 React,”Angular 联合作者、Cloudflare 高级工程总监 Igor Minar 如是说。然而,也有不同的声音,特别是前端云服务公司 Vercel,认为 React Server Components“强化了 React 的根基”。那么究竟谁的观点才是对的呢?

 

React Server Components(RSC)是在服务器端运行的组件。React 团队在 2022 年 3 月解释说,当 React 18 能够稳定支持这种“新组件”,RSC 会“提前运行,并且不会被包含在客户端 JavaScript 中”。Vercel 在 2022 年 10 月发布的 Next.js 13 开始支持 RSC,是第一个宣布支持 RSC 的主流框架。这个版本的 Next.js 将 RSC 作为其新 App Router 架构的一部分。

 

RSC 的利弊

 

对于 Next.js 的用户而言,RSC 可能很有用。YouTube 博主 Theo Browne 在 2024 年 React 峰会的演讲中对 RSC 赞不绝口,他的公司已经使用了 RSC 一年多时间。

 

“我强烈推荐 Server Components。”

——Theo Browne,YouTube 博主、Ping Labs CEO

 

“如果你想学点新东西,并且不担心它可能不会成为下一个大热门,我强烈推荐你尝试 RSC,”Browne 在总结时说道。“说实话,如果 RSC 不会成为我们未来开发软件的方式,我会感到非常惊讶。”

 

然而,也有人认为适应 RSC 更具挑战性。“自从 RSC 发布以来,混合客户端/服务器架构给开发者带来的认知负担一直是我对 RSC 最大的顾虑,”Vue.js 作者尤雨溪在 6 月份发的一个推特中表示。

 

RSC 在推广过程中还面临着其他挑战。一个使采用变得困难的因素是,要迁移到这种架构,应用程序需要相应的基础设施支持,并且——根据使用 React 的情况——可能需要扩展配置和集成额外的中间件,这可能与客户端应用程序当前的部署和托管模型不兼容。

 

RSC“造成了一种 JavaScript 延迟伏击效应。”

——Alex Russell,微软 Edge 产品经理

 

尽管 RSC 在一些 Next.js 用户中很受欢迎,但这项技术在更广泛的 Web 开发领域内一直备受争议。除了 Minar,我也在尝试联系微软的 Alex Russell,探讨他的“HTML 优先”哲学。Russell 一直是 React 的批评者,所以我想问问他对 RSC 的看法。Russell 通过邮件回复了有关 RSC 的问题,并解释了他不看好它们的原因:

 

“RSC 的目的是为了减少需要预先发送到浏览器的代码量,因为这些代码通常是糟糕的 Core Web Vitals 指标的根源。它在服务器端执行 React 应用程序的组件子树,直到开发者指定了‘use client’指令。此时,服务器将该组件下的所有内容标记为‘客户端’,然后将所有子树中定义组件的代码连同它们的依赖一起发送出去。这就造成了一种 JavaScript 延迟伏击效应。”

 


即使 Next.js 有 App Router,它的 Core Web Vitals 指标表现仍然落后于竞争对手。这是根据 HTTP Archive 的 Core Web Vitals 技术报告得出的结论。

 

但也有一些开发者认为 RSC 是一项有用的演变。在 The New Stack 四月份的一篇文章中,Paul Scanlon 写道,RSC 使得“在组件内部轻松获取数据”成为可能。他指出,RSC“有助于理解应用程序的逻辑,因为逻辑、数据和用户界面元素都被整洁地整合在同一个文件里,这通常能提供比追踪 props 和数据流更好的开发者体验。”

 

更好的数据获取能力是 Igor Minar 喜欢 RSC 的一个地方。“这种在组件中包含数据获取逻辑的改进是 RSC 的一个积极的方面(也许是唯一的一个?)。”他表示,“我们应该努力留住这一特性,并让它成为整个 Web 开发生态系统的标准,但要避开 RSC 引入的其他缺点。”

 

RSC 是怎么来的

 

让我们回顾一下 React 团队开发 RSC 的初衷。这项技术最早是在 2020 年 12 月由 React 项目提出,作为 React 的数据获取方案。其核心思想是将 React 组件的数据处理从客户端转移到服务器端。

“React 以前确实可以在服务器端运行,尽管效率不高,”Minar 提到。“RSC 的不同之处在于让某些组件只在服务器端运行,这是前所未有的。有了 RSC,你必须在服务器端运行 React 应用程序,而在 RSC 之前,尽管你可以将 React 部署在服务器端作为性能优化的一种选择,但大多数 React 生态系统中的应用程序没有这么做。”

 

正如 React 工程师 Dan Abramov 在 2020 年 12 月的演示视频中所解释的那样,“这些仍然是标准的 React 组件,但我们将它们称为服务器组件,因为它们只在服务器端运行,而且只能在服务器端——它们永远不会被发送到客户端。”

 


Dan Abramov 在 2020 年 12 月介绍 RSC。

 

RSC 的核心理念在于,如果一个组件需要数据获取或执行不涉及客户端交互的任务,通常更适合在服务器端处理,而不是作为普通的客户端组件。

 

到目前为止,这个理念听起来很合理。毕竟,这就是 20 世纪 90 年代浏览器组件的工作方式——还记得 CGI、PHP 和 ASP 吗?只是现在并非所有任务都需要在服务器端完成。React 本来就是为了让客户端能够更容易地完成更多工作而诞生的。现在有了 RSC,React 正在赋予开发者更大的自主权,让他们可以决定应用程序的哪些部分应该在服务器端运行,哪些部分应该在客户端运行。

 

进展如何

 

那么,问题出在哪里?Igor Minar 认为,开发者在采用 RSC 时遇到了困难。

 

"RSC 将会给 React 社区带来很多困扰,以至于开发者们会开始寻求其他解决方案。"

——Igor Minar,Angular 联合作者、Web 和 OSS 爱好者、Cloudflare 高级工程总监

 

“我个人认为 RSC 将会摧毁 React,因为从技术角度来看,它是一项有缺陷、不成熟且与当前 React 生态系统不兼容的技术,”Minar 表示。“这是对现有 React 生态系统的一次重大且破坏性的变化,这种变化并没有经过深思熟虑就强推给 React 开发者。所以,我预计 RSC 将会给 React 社区带来很多困扰,以至于开发者们会开始寻找其他选择。”

 

微软的 Alex Russell 更关注性能问题。

 

“那些在性能方面可能从 RSC 获益的网站,是那些已经拥有高管理成熟度实践的网站。”他通过邮件解释说。“除了这些网站,任何一个‘use client’指令,组件树中的任何一个点,任何一个依赖,都有可能彻底恶化网站性能。”

 

Russell 对 React 团队最初引入 RSC 的动机持怀疑态度。“我个人认为,RSC 是 React 社区为了适应不断变化的 Core Web Vitals 标准而做出的最小努力,”他说道。“RSC 的目的是在不影响(相对宽松的)INP 指标的前提下,或者至少让 React 社区相信,他们无需放弃 React 就能实现可接受的性能。”

 


HTTP Archive Core Web Vitals 技术报告

 

即使是 RSC 的拥趸者 Theo Browne 也承认,仅凭 RSC 自身并不足以成功推广这项技术。他特别提到,他的公司使用了 Next.js App Router,并在 React 峰会上指出,这是“目前唯一真正能在生产环境中安全运行服务器组件的方式。”

 

他在 React 峰会的 FAQ 环节表示,他“遭遇了性能方面的挑战,特别是在没有部分预渲染的情况下”,并且“还面临了开发者服务器性能以及服务器和客户端组件的包集成问题。”

 

尽管在使用 RSC 过程中遇到了这些问题,Browne 最终还是表达了对它的支持。正如他在 YouTube 的视频中所强调的,“服务器组件可以让你无需更新那些本不需要更新的内容,这对差异计算也非常有用。”他还展示了一些使用 RSC 实现的酷炫的功能。

 

RSC 的两极分化

 

"React 19 即将到来,"Vercel 在最近的博文中提到。RSC 将成为“React 19 新特性的基石”,文章列举了其预期的优势,包括更快的初始加载速度、代码可移植性和对 SEO 的优化等。

 

然而,正如之前所说的,开发者们对 RSC 的体验呈现出明显的两极分化。RSC 确实引入了一些创新点——例如封装了数据获取的能力——但同时也带来了一些问题,例如采用难度大和(用 Russell 的话说)“JavaScript 延迟伏击效应”。

 

核心问题在于:这种分歧是否会损害 React 最宝贵的资产——它的生态系统和社区?考虑到 RSC 对 React 生态系统即将产生的影响,以及早期采用者和专家们对它截然不同的态度,观察 React 社区如何接纳 RSC 以及 RSC 是否将驱使一些 Web 开发者寻求更佳的替代方案将是一件有趣的事情。

 

【声明:本文由 InfoQ 翻译,未经许可禁止转载。】

 

原文链接:https://thenewstack.io/frontend-schism-will-react-server-components-destroy-react/

2024-10-16 16:4410005

评论

发布
暂无评论
发现更多内容

《卡片笔记写作法》:用卡片积累思考

郭明

贝叶斯网络

5月月更

亚马逊AWS特约评委揭秘FinClip黑客松获胜秘诀

Geek_99967b

hackathon 小程序开发

⭐万字长篇超详细的图解Tomcat中间件方方面面储备知识⭐

jiangxl

tomcat Java web

正则表达式知识点梳理

真嗣

正则表达式

极客训练营模块一作业

Geek__猫猫头

微信业务架构图和学生管理系统架构设计

Geek_7a789a

[模块一作业]

wuli洋

【LeetCode】链表的中间结点Java题解

Albert

LeetCode 5月月更

【架构训练营】模块一作业

知北游

学生管理系统架构设计

Justin1024

架构训练营 模块一作业

小马

「架构实战营」

5月25日,阿里云开源 PolarDB-X 将迎来重磅升级发布

阿里云数据库开源

开源 开源数据库 国产数据库 PolarDB-X 数据库·

架构实战营 - 第 6 期 模块六课后作业

乐邦

「架构实战营」

LSM-Tree - LevelDb 源码解析

懒时小窝

Lsm LSM树 LSM-Tree level

JAVA程序对应不同的部署环境针对配置文件如何管理

jiangxl

Java tomcat

基于Redis6.2.6版本部署Redis Cluster集群

jiangxl

实现 LRU 缓存算法

Se7en

Redis Cluster集群收缩主从节点详细教程

jiangxl

开启Tomcat管理注主页功能

jiangxl

tomcat

Linux环境下部署Jpress大型博客网站

jiangxl

五、浅谈容器逃逸

穿过生命散发芬芳

5月月更 容器逃逸

架构实战营-模块1作业

Gavin.Yang

druid 源码阅读 8——过一下流程图的init

张大彪

架构实战营 7 期「模块一」为何架构设计能力难以提升

Steve_bot

druid 源码阅读(九)Druid removeAbandoned参数

爱晒太阳的大白

5月月更

在FinClip Hackathon中夺冠是一种什么样的体验?

Geek_99967b

hackathon 小程序开发

JavaWeb MyBatis

Emperor_LawD

mybatis javaWeb 5月月更

设计模式之学习命令模式

乌龟哥哥

5月月更

架构实战营模块 1 作业

Naoki

架构实战营

代码之外:关于校招 Offer 选择的问题

宇宙之一粟

offer 代码之外 5月月更

React服务器组件会毁了React吗?_架构/框架_Richard MacManus_InfoQ精选文章