QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

评论

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

听 GPT 讲 client-go 源代码 (10)

fliter

接手外包团队开发的微服务项目,人麻了!

伤感汤姆布利柏

OpenTiny Vue 组件库适配微前端可能遇到的4个问题

OpenTiny社区

开源 Vue 前端 微前端 组件库

今日必读的9篇大模型论文

学术头条

人工智能 论文 大模型

inBuilder低代码平台新特性推荐-第十六期

inBuilder低代码平台

开源 低代码

【论文解读】transformer小目标检测综述

合合技术团队

目标检测 Transformer 深度学习、

拼多多商品优惠券数据采集

tbapi

拼多多 拼多多商品详情接口 拼多多商品数据采集

k8s-权限管理

EquatorCoco

Kubernetes 云原生 k8s

OpenAI的Sora亮相:AI视频生成的新用场

算AI

人工智能 创业 创新 sora

QCN9274 QCN6274 IPQ9574|What Does Wi-Fi 7 Actually Bring?

wallyslilly

qcn9274 qcn6274 ipq9574

自动化测试创新:AI 驱动的测试策略变革

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

测试

区块链游戏解说:什么是 Planet IX

Footprint Analytics

web3

2023 re:Invent 用 PartyRock 10 分钟构建你的 AI 应用

亚马逊云科技 (Amazon Web Services)

亚马逊云科技 生成式人工智能 Amazon CodeWhisperer Amazon Bedrock Amazon Q

大语言模型支持:开发个性化 AI 应用

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

测试

AI 优化学习路径:个性化推荐与辅助学习

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

测试

面试官:如何实现多级缓存?

不在线第一只蜗牛

缓存 程序员 面试

企业定制化 AI 解决方案:满足企业需求的智能服务

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

测试

盘一盘制造业最受欢迎的9个IT岗位

伤感汤姆布利柏

你好,iLogtail 2.0!

阿里巴巴云原生

阿里云 云原生 iLogtail

揭秘 LLMs 时代向量数据库的 3 大实用场景

Zilliz

Milvus 向量数据库 LLM zillizcloud rag

听 GPT 讲 client-go 源代码 (9)

fliter

解锁Mysql中的JSON数据类型,怎一个爽字了得

不在线第一只蜗牛

json MySQL 数据库 开发语言

EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持

EMQ映云科技

mqtt emqx mqtt broker

开发竞猜比分与专家分析功能:如何为体育直播平台注入新活力

软件开发-梦幻运营部

龙蜥系统运维联盟:Kindling-OriginX 如何集成 DeepFlow 的数据增强网络故障的解释力

OpenAnolis小助手

deepflow 开源 系统运维 ebpf 龙蜥社区

马斯克称首位受试者可凭思维操控鼠标;字节低调推出视频模型丨 RTE 开发者日报 Vol.148

声网

测试流程智能化:AI 技术赋能测试领域

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

测试

京东商品优惠券数据采集

tbapi

京东 京东API接口 京东商品优惠券数据 京东商品详情数据

CORS就是跨域吗?

EquatorCoco

CORS web开发 跨域

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