写点什么

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:441

评论

发布
暂无评论

华为云GaussDB以技术创新引领金融行业分布式转型

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

通过HTTP/2通道实时获取IoT设备状态和数据——设备管理运维类

阿里云AIoT

Java 物联网

聚势启新,赢未来!网银互联通航云计算数据中心三期盛大落地!

科技热闻

京东云总裁曹鹏:安全可控的数字基础设施提升产业链韧性

京东科技开发者

数字化 产业数字化 京东云 国产化替代 京东云峰会

用图技术搞定附近好友、时空交集等 7 个典型社交网络应用

NebulaGraph

推荐算法 图数据库 社交网络

数字音频编辑|Cockos REAPER最新破解教程

理理

Cockos Reaper破解 音频编辑

感谢大家对我的捐赠和鼓励

源字节1号

何为神经网络卷积层

华为云开发者联盟

人工智能 神经网络 华为云 华为云开发者联盟 企业号 3 月 PK 榜

Serverless:基于个性化服务画像的弹性伸缩实践

百度Geek说

云原生 成本优化 Servelress 弹性伸缩 企业号 3 月 PK 榜

Dapr实战—RabbitMQ binding

青柚1943

Docker RabbitMQ dapr 发布订阅 Binding

InstructPix2Pix: 动动嘴皮子,超越PS

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 3 月 PK 榜 文本编辑图像

谷歌Android things物联网硬件接入阿里云IoT物联网套件实战——设备接入类

阿里云AIoT

物联网 传感器 Android开发

Mac万能笔记软件Notion中文版,提高你的工作效率

理理

Mac笔记软件 Notion 中文 Notion 下载

OpenAI 发布的 GPT-4,有哪些技术上的突破?

这我可不懂

低代码 ChatGPT JNPF GPT-4

分布式存储中建立高效回收站的设计思考

焱融科技

文件存储 分布式文件存储 回收站 高性能存储 全闪存储

Selenium自动化测试

测吧(北京)科技有限公司

测试

阿里云IoT物模型-属性,服务,事件通信的topic和payload详解——设备管理运维类

阿里云AIoT

物联网

10Wqps 超高并发 API网关 架构演进之路

Java你猿哥

Java 架构 微服务 SSM框架 api 网关

PHP集成开发:phpstorm2022永久版 激活码

理理

软件 PHP开发 PhpStorm 2022激活码 PhpStorm中文版

ON1 Sky Swap AI for Mac:出色的 天空替换 照片编辑工具

理理

换天空 ON1 Sky Swap AI 2023 照片编辑软件

Trapcode Particular(AE经典粒子插件)绿色破解版

互联网搬砖工作者

经过阿里四面而形成的10万字java面试题及答案文档到底有多牛?

Java你猿哥

Java 阿里巴巴 后端 面经 八股文

依靠这份PDF面试资料文档,各种美团,阿里等大厂offer拿到手软

Java你猿哥

Java 后端 ssm 面经 八股文

flomo 浮墨笔记向飞书收购 “幕布”,不卖永久会员、不融资的“反骨”逻辑

B Impact

国内首发|焱融科技 YRCloudFile 支持 NVIDIA GPUDirect Storage(GDS)

焱融科技

人工智能 分布式存储 分布式文件存储 全闪存储 GPT-4

AltCLIP:改变语言编码器,扩展语言功能

Zilliz

计算机视觉 openai

现货合约量化机器人开发对冲交易策略

薇電13242772558

量化策略

直播 | StarRocks 实战系列第四期--查询性能优化

StarRocks

数据库

项目经理问我Tomcat 与 Undertow 怎么抉择?此文教她选

Java你猿哥

Java jdk Spring Boot ssm

阿里云IoT物联网平台基础版和高级版数据进入规则引擎的流转详解——普及类

阿里云AIoT

物联网

智维数据荣获2022金融科技应用创新奖

智维数据

金融科技 智能运维 金融电子化 智维数据

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