查看原文
其他

React 劝退贴!

ConardLi code秘密花园 2023-02-21

大家好,我是 ConardLi

在前端圈,一个亘古不变的话题就是前端框架之争,开发者们热衷于吹捧自己喜欢的框架,同时批评其他的框架。其中站在风口浪尖的框架就是 React 了,它作为当前前端框架的 “老大” ,多年来一直在承受着各种批评和争议,同时也在这些批评中不断成长。

今天的文章很有意思,文章中总结了从 2014 年以来 React 成熟的多个重大的争议和批评,所以这篇 “React 劝退贴” 名副其实了~ 其中有一些点已经得到了解决,还有些似乎还在摇摆不定,想要入坑或者已经入坑 React 的小伙伴推荐好好读一读~

本文的多个观点取自 Zach 的个人总结:https://www.zachleat.com/web/react-criticism/

注:本文只是汇总网络上对 React 批评的观点,我个人对 React 还是比较喜爱的 ~

[2014-12-12] 研究 JavaScript MVC 框架的性能成本

【研究 JavaScript MVC 框架的性能成本】https://www.filamentgroup.com/lab/mv-initial-load-times

本文观点主要集中在对客户端渲染性能的质疑。据我所知,这是对 SPA/客户端渲染模型 的第一个有数据支撑的批评。测试结果显示 React3G 移动设备上首次渲染的平均性能基准为 1.26 秒,而推荐的性能指南建议的目标是在一秒内完成首次渲染。

FacebookCEO 马克·扎克伯格曾在 2012 年的讲话中表示在移动端 HTML5 上下了太多赌注,他的原话是这样说的:

我们今天已经可以使用一些实用的方法来可靠地产生非常快的渲染时间,但是我认为 HTML 内容从服务器端交付而不是仅在客户端生成,是最有效的方式。除了性能之外,这种方法还有利于用户体验的许多其他领域……

但值得注意的是,在这篇文章撰写 8.2 年之后,React 文档仍然在主要推荐客户端渲染:

“如果您正在学习 React,我们建议您使用 Create React App。这是尝试 React 和构建新的单页客户端应用程序的最流行方式”

有趣的是,他们在最新的 Beta 文档中指定 Next.js 作为官方选择的全栈框架。

[2015-04-10] DOM 并不慢,抽象让它变慢

【DOM 并不慢,抽象让它变慢】https://webreflection.blogspot.com/2015/04/the-dom-is-not-slow-your-abstraction-is.html?m=1

DOM 本身的速度是非常快的,但是过度的抽象让它变慢,主要是反驳《操作 DOM 很慢》这样的观点。在 Reactunderscore、paperclip 以及原生 DOM 操作的性能测试结果中显示,React 的性能最差。

当然看待一个框架不能只停留在性能上,本文的观点比较片面,框架的抽象还给我们带来了编码设计、复用、封装等上面的优势。

[2015-07-03] React + Performance = ?

React + Performance = ?https://aerotwist.com/blog/react-plus-performance-equals-what/

作者分别用一台 PC 设备(MacBook Pro)和一台移动设备( Nexus 5)中对 React 和原生 DOM 操作进行了性能测试。

下边的结果体现了让 React 一次添加 100 张图片(每张图片大约有 5 个 DOM 元素,包括名称、链接等),从 100 张开始添加到 1200 张的时间变化。

ReactPC 设备上(性能表现波动不大):

原生 DOM 操作在 PC 设备上(耗时比较稳定,而且耗时比 React 操作要快很多)

React 在移动设备上(随着 DOM 元素的增多,渲染时间逐渐上涨):

原生 DOM 操作在 移动 设备上(且耗时比 React 操作要快很多,而且随着节点的增多,渲染时间居然有所下降,这可能是源自 V8 的某种优化措施)

在本文的测试结果中表现了 React 的性能成本非常高,在移动端设备上尤为突出。

[2016-06-13] React 首页变化

https://fosstodon.org/@thomasapowell/109819540720439366

React 的主页发生了变化,删除了宣传 Virtual DOM 性能优势的文案,转而关注效率。

在此更改之前,它声明:

React 抽象出了虚拟 DOM,提供更简单的编程模型和更好的性能。

[2016-07-16] 百度要求内部全面停止使用 React / React Native

https://www.zhihu.com/question/65437198

20167 月,React.js 开源许可协议中的附加专利条款引起了激烈争论。

大概意思如下:

如果您正在或考虑在项目中使用 React,您可能需要咨询律师。由于专利条款,您不得做任何构成与 Facebook 竞争的事情。如果你采取法律行动或以其他方式挑战 Facebook,你使用 React 的许可将立即被撤销。如果您与使用 React 的任何其他公司发生法律纠纷,如果您有任何法律纠纷,您的许可证也会被撤销。

Facebook 有竞争关系的公司都有可能被取消 React 许可?所以引发了国内很多科技公司对 React 的 “弃用潮”。

[2016-12-10] 当一切都很重要时,什么都不重要

【当一切都很重要时,什么都不重要】 https://aerotwist.com/blog/when-everything-is-important-nothing-is/

这篇文章很早就批评了使用虚拟 DOM 的服务端渲染框架如何仍然以非常糟糕的方式阻塞主线程:

客户端渲染性能对比
服务端渲染性能对比

SSR 通常会让你更快地完成 First Meaningful Paint。这对于感知性能来说非常好,但是对于使用虚拟 DOM 的库/框架来说,TTI 似乎又被推迟了。我想通过 Diff 真正的 DOM 来制作 VDOM 是不是比完全重新创建 DOM 的成本要更大?

这篇文章的渐进式引导部分很像是现在被推崇的 Islands 架构的前身,它们都更多地推荐使用 requestIdleCallback 来优化渲染,当然后来的 React18 也借鉴了类似的优化方式。

[2017-07-15] React 被归类为 Category-X 许可证

2017 年 7 月 15 日 React 的开源许可证(带有专利条款)被 Apache 软件基金会归类为 Category-X(有问题的)许可证,这意味着它不能用于 Apache.org 相关的项目。

在随后的一个月后,WordPress 的创始人写了一篇文章,指出 WordPress 的一些正在开发中的大型项目 CalpysoGutenberg 将停止使用 React

在随后的几天后,Facebook 决定在 React16 版本中推翻自己的专利条款...

但是, Facebook 的许多其他开源项目(以及 React 的所有先前版本),专利条款仍然有效。

[2017-08-24] React 的兼容性问题

https://github.com/facebook/react/issues/11347

Rob Dodson 提交了一个 RFCPlan for custom element attributes/properties in React 17、18、19,在其中指出了很多 Web 组件和 React 之间的兼容性问题。

时至今日,在 React18beta 版本中,React 仍然有很多兼容性问题:

[2029-04-21] Javascript 框架的成本

JavaScript CPU 耗时

430 万个 PC 和 540 万个移动端 URL 的研究测试表明,与使用 Angular、Vue.jsjQuery 构建的网站相比,React 网站在主线程上花费的脚本相关 CPU 时间要多得多。

[2021-10-14] JavaScript 框架 TodoMVC 打包大小

【JavaScript 框架 TodoMVC 打包大小】https://dev.to/this-is-learning/javascript-framework-todomvc-size-comparison-504f

在这篇文章中分析了使用不同的 JavaScript 框架实现一个 TodoMVC 项目,最后打包出的包大小比较 (下面的结果中展示的是经过 Brotli 压缩后的包体积)。

对比结果很尴尬,Preact、Svelte、Solid 这些框架的运行时都非常小,而 Reactvendor 包体积要比它们都大出 10 倍以上,当然这个结果统计不太客观,上面只是统计一个在实现一个简单项目的打包情况,下面还有实现不同 TodoMVC 组件数量对应包体积的大小变化:

可见,在小型项目中 React 包体积的问题比较明显,当项目逐渐变大,React 才逐渐体现一些优势。

[2022-09-20] React 我爱你,但你太让我失望了

React 我爱你,但你太让我失望了

这篇文章很有意思,以一个第一人称的角度表达了对 React API 设计和一些其他用法设计的吐槽,包括以下这些方面:

  • 表单处理困难:开发者必须在 受控输入非受控输入 之间做出选择,受控组件的推荐写法非常冗长;

  • 访问 DOM 困难:框架不推荐开发者直接访问 DOM,然后推荐使用 ref,代码库经常可以见到上下传递 ref 的情况,react.forwardRef 设计的也很难用;

  • 上下文敏感:由于在设计上可能会出现重复渲染的问题,强迫开发者自己使用 useMemouseCallback ,这大大增加了框架的理解和使用成本;

  • API 理解困难:useEffect 设计的非常复杂,存在很多使用不当的情况,为了理解它,有开发者写出了 53 页的论文;

  • 核心 API 不断膨胀:为了解决 useEffectAPI 带来的问题,又推出了 useEvent、useInsertionEffect、useDeferredValue、useyncwithexternalstore 等等新的用法,对开发者来讲好像在给猪身上涂口红;

[2023-02-06] Core Web Vitals 网站分析报告

【Core Web Vitals 网站分析报告】https://lookerstudio.google.com/reporting/55bc8fad-44c2-4280-aa0b-5f3f0cd3d2be?s=lD9m_MQgyGU

在一项对大约 930 万个网站的 Core Web Vitals 性能指标的统计分析报告中表明,使用了 ReactNext.js 网站的 Core Web Vitals 的表现要比所有网站的指标平均统计结果要更差。

Core Web VitalsGoogle 推荐的网页核心性能指标,了解更多可以看我这篇文章:解读新一代 Web 性能体验和质量指标

纵坐标表示具有优秀 Core Web Vitals 指标的网站占比

目前只有 25.7% 使用 Next.js 的网站以及 30.7% 使用 React 的网具有比较良好的 Core Web Vitals,低于数据集中所有站点的统计数据(38.5%)

最后

「怎么样,阅读完这些劝退观点之后,你对 React 的热爱是否动摇了呢?欢迎在评论区留下你的观点。」

参考链接

  • https://www.zachleat.com/web/react-criticism/
  • https://github.com/krausest/js-framework-benchmark
  • https://www.youtube.com/watch?v=uCHZJy2n8Qs
  • https://www.swyx.io/svelte-static
  • https://emmas.site/blog/2020/09/12/react-is-a-subsidy

如果这篇文章帮助到了你,欢迎点赞和关注。

如果你想加入高质量前端交流群,或者你有任何其他事情想和我交流也可以添加我的个人微信 ConardLi

点赞在看是最大的支持⬇️❤️⬇️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存