这波 React 属实被针对了

news/2024/7/10 0:34:11 标签: java, python, 大数据, vue, 编程语言

昨天在网上愉快冲浪时,看到一篇框架测评,效果属实爆炸。

作者用ReactSolid.js开发了同样的Demo。为什么用Solid.jsReact对比呢,让我们看看Solid.jsAPI

  • Hooks

  • Context、Portal API

  • Error Boundaries

不能说和React多雷同,只能说一摸一样吧。而且Solid.js也用JSX描述视图,所以一个React应用要改为Solid.js应用的成本很小。

具体测评结果怎么样呢,差了快3倍,这一波React属实被针对了。

5d10ce5414670b9510576d668cb4519e.png

本文参考SolidJS vs React: I've Built the Same App On Both Libraries.[1]

为啥差这么多

简单介绍下这个Demo,初始渲染空白列表:

d89fa6f6627ab39b59b0f13dcab89ee5.png

首次mount完成后发起请求,渲染列表数据:

fb16843bf7e6673a3f7e8dd482866469.png
Rick和Morty真爱粉无疑了

这是两个应用Chrome Dev Tools Performance面板的结果:

caaedc08b0b129a0be2d68a8d1380170.png
左React 右Solid.js

解释下其中几个关键指标:

  • Loading:发起网络请求、解析HTML的时间

  • Scripting:解析、编译、执行JS的时间(包括垃圾回收时间)

  • Rendering:stylelayout计算

  • Painting:paintcomposite、解码图片

具体关注Scripting,左475ms(React),右176ms(Solid.js

2倍多的差距,这么夸张?

130ee775ef2d69171d80236b17b0f048.png

问题出在哪

前端框架的工作流程可以简单用三个步骤总结:

  1. 触发交互

  2. 计算交互会影响哪些DOM

  3. 执行DOM操作

这里的交互可能是首屏渲染,可能是点击造成的状态变化、可能是请求数据......

React中,步骤2是在运行时完成的,而在Solid.js中是在编译时完成的。

ec33b6fd8ba7fc3f4e7d1a685cf22cfc.png

具体来说,该步骤在React中被称为reconcile,更普遍的称呼是虚拟DOMdiff算法。

Performance面板下面的Call Tree中可以看到,执行XHR Load(请求列表数据)前有个很耗时的操作(Function Call),该操作即reconcile

ef0c31d89789913f1e87ef8f9e854bc0.png

而在Solid.js应用中就没有这个耗时的操作:

107395908af2b631cb37c75e47c552ff.png

在编译时,Solid.js会将JSX直接编译为状态操作DOM的方法之间的联系。

由于JSX太过灵活,为了在编译时有更多线索建立这种联系,Solid.jsReact原有JSX组件基础上提供了一些控制流组件

ff645994590dd3f5bfc9d3b37f148c49.png

举个例子,下面是遍历列表项在两个框架中的实现区别:

// React
<ul>
  {list.map(
    item => <li>{item.name}</li>
  )}
</ul>
<ul>
  
// Solid.js
<ul>
  <For each={list}>
    {(item) => <li>{item.name}</li>}
  </For>  
</ul>

For组件替代了JS中的数组map方法。

Solid.js在编译时完成这些工作,在运行时每次更新实际只用完成步骤1和3,省去了大部分步骤2的时间。

虽然Reactreconcile有优化策略,但随着应用体积增大,或者项目成员不完全遵守最佳实践,势必会造成在步骤2上花费的时间越来越多。

Solid.js提前建立状态操作DOM的方法之间的联系,虽然需要在运行时占用更多内存保存这种对应关系,但是却省去了大部分步骤2的时间,是一种典型的空间换时间的策略。

95f8b13efa1c46264ad22f623e19ebb1.png

总结

说了这么多,虽然看起来Solid.js对比React在框架的某些方面是有优势的,但并不能撼动React的统治地位。

毕竟,React这么流行和他快不快一点关系都没有,社区生态繁荣才是最重要的。

还有个有意思的事,这里是文中的2个Demo地址:

  • Solid.js版[2]

  • React版[3]

Demo中获取数据的API的域名是rickandmortyapi.com,居然还有这种网站......

参考资料

[1]

SolidJS vs React: I've Built the Same App On Both Libraries.: https://dev.to/ogzhanolguncu/solidjs-vs-react-i-ve-built-the-same-app-on-both-libraries-4cfa

[2]

Solid.js版: https://github.com/ogzhanolguncu/rick-and-morty-solidjs

[3]

React版: https://github.com/ogzhanolguncu/react-rick

「分享」「点赞」「在看」是最大支持


http://www.niftyadmin.cn/n/1251143.html

相关文章

效率神器!UI 稿智能转换成前端代码

做前端&#xff0c;不搬砖大家好&#xff0c;我是小生方勤。从事前端五年之久&#xff0c;也算见证了前端数次变革&#xff0c;从到DW&#xff08;Dreamweaver&#xff09;到H5C3、从JQuery到MVC框架&#xff0c;无数前端大佬在为打造前端完整生态做出努力&#xff0c;由于他们…

仅仅过去 4 年,微软最终放弃了 Electron

↓推荐关注↓作者 | electron 团队编译 | InfoQ - 核子可乐、褚杏娟策划 | InfoQ - Tina2017 年时&#xff0c;Electron 可以说是 Web 应用在桌面平台发布的最佳、甚至是唯一选项&#xff0c;但如今它却成了需要被优化淘汰的对象。 微软近期宣布&#xff0c;旗下 Teams 应用活…

这一局,中国前端属实领先世界了...

让我们回到4年前&#xff0c;17年国外前端圈都发生了哪些大事&#xff1f;为了弥补web和原生应用体验的差异&#xff0c;谷歌大力推进PWA所有主流浏览器都支持WebAssemblyServerless开始流行CSS-in-JS走进主流前端视野TypeScript火爆GraphQL爆炸式增长......那么这一年&#xf…

golang 重要知识:内存管理

一、概述 内存管理在任何的编程语言里都是重头戏&#xff0c;Golang 也不例外。Go 借鉴了 Google 的 TCMalloc&#xff0c;它是高性能的用于 c 的内存分配器。其核心思想是内存池 多级对象管理 &#xff0c;能加快分配速度&#xff0c;降低资源竞争。 二、基础结构 在 Go 里…

什么?在 VSCode 里也能用 Postman了?

以前一直在用 postman 做 API 测试&#xff0c;如果你同时在使用 vscode 开发时&#xff0c;每次切出去可能比较烦&#xff0c;其实就是太懒了。。。作为一个懒人&#xff0c;所有开发的时候要做的事情都在 vscode 里面完成是最好的&#xff0c;前几天看到 Postcode&#xff0c…

真的,我现在特讨厌 Safari 浏览器

翻译&#xff1a;前端之巅 - 小盖团队原文链接&#xff1a;https://blog.perrysun.com/2021/07/15/for-developers-safari-is-crap-and-outdated/如果要说开发者最讨厌什么东西&#xff0c;那 IE 浏览器肯定是首当其冲。究其原因&#xff0c;其实也很简单&#xff0c;因为 IE 的…

新的 Vue 脚手架来了,学的动吗?

1. 前言2021 年 10 月&#xff0c;Vue 团队等主要贡献者举办了一个 Vue Contributor Days 在线会议&#xff0c;蒋豪群[1]&#xff08;知乎胖茶[2]&#xff0c;Vue.js 官方团队成员&#xff0c;Vue-CLI 核心开发&#xff09;&#xff0c;在会上公开了create-vue[3]&#xff0c;…

你是这样理解 redux 的吗?

前言开始前&#xff0c;你必须知道一些事情&#xff1a;redux 和 react 没有关系&#xff0c;redux 可以用在任何框架中&#xff0c;忘掉 react。connect 不属于 redux&#xff0c;它其实属于 react-redux&#xff0c;请先忘掉它&#xff0c;下一章节&#xff0c;我们会介绍它。…