当前位置:首页 > 每日看点 > 正文内容

为什么有人说React和Vue可能是最后的前端框架了?

卡卷网1年前 (2024-12-22)每日看点217

前言

曾经面试时碰到过一个问题:为什么现有的Vue框架开发可以淘汰之前的JQuery?

我回答:Vue框架无需自己操作DOM,可以避免自己频繁的操作DOM

面试官接着反问我:Vue框架无需自己操作DOM,有什么优势吗,不用操作DOM就一定是好的吗?

我懵了,在我的认知里Vue框架无需自己操作DOM性能是一定优于自己来操作DOM元素的,其实并不是的.....

声明式框架与命令式框架

首先我们得了解声明式框架和命令式框架的区别

命令式框架关注过程

JQuery就是典型的命令式框架

例如我们来看如下一段代码

$( "button.continue" ).html( "Next Step..." ).on('click', () => { alert('next') })

这段代码的含义就是先获取一个类名为continue的button元素,它的内容为 Next Step...,并为它绑定一个点击事件。可以看到自然语言描述与代码是一一对应的,这更符合我们做事的逻辑

声明式框架更关注结果

现有的Vue,React都是典型的声明式框架

接着来看一段Vue的代码

<button class="continue" @click="() => alert('next')">Next Step...</button>

这是一段类HTML模板,它更像是直接提供一个结果。至于怎么实现这个结果,就交给Vue内部来实现,开发者不用关心

性能比较

首先告诉大家结论:声明式代码性能不优于命令式代码性能

即:声明式代码性能 <= 命令式代码性能

为什么会这样呢?

还是拿上面的代码举例

假设我们要将button的内容改为 pre Step,那么命令式的实现就是:

button.textContent = "pre Step"

很简单,就是直接修改

声明式的实现就是:

<!--之前 --> <button class="continue" @click="() => alert('next')">Next Step...</button> <!--现在 --> <button class="continue" @click="() => alert('next')">pre Step</button>

对于声明式框架来说,它需要找到更改前后的差异并只更新变化的地方。但是最终更新的代码仍然是

button.textContent = "pre Step"

假设直接修改的性能消耗为 A, 找出差异的性能消耗为 B, 那么就有:

  • 命令式代码的更新性能消耗 = A
  • 声明式代码的更新性能消耗 = A + B

可以看到声明式代码永远要比命令式代码要多出找差异的性能消耗

那既然声明式代码的性能无法超越命令式代码的性能,为什么我们还要选择声明式代码呢?这就要考虑到代码可维护性的问题了。当项目庞大之后,手动完成dom的创建,更新与删除明显需要更多的时间和精力。而声明式代码框架虽然牺牲了一点性能,但是大大提高了项目的可维护性降低了开发人员的心智负担

那么,有没有办法能同时兼顾性能和可维护性呢? 有!那就是使用虚拟dom

虚拟Dom

首先声明一个点,命令式代码只是理论上会比声明式代码性能高。因为在实际开发过程中,尤其是项目庞大之后,开发人员很难写出绝对优化的命令式代码。 而Vue框架内部使用虚拟Dom + 内部封装Dom元素操作的方式,能让我们不用付出太多精力的同时,还能保证程序的性能下限,甚至逼近命令式代码的性能

在讨论虚拟Dom的性能之前,我们首先要说明一个点:JavaScript层面的计算所需时间要远低于Dom层面的计算所需时间 看过浏览器渲染与解析机制的同学应该很明白为什么会这样。

我们在使用原生JavaScript编写页面时,很喜欢使用innerHTML,这个方法非常特殊,下面我们来比较一下使用虚拟Dom和使用innerHTML的性能差异

创建页面时

我们在使用innerHTML创建页面时,通常是这样的:

const data = "hello" const htmlString = `<div>${data}</div>` domcument.querySelect('.target').innerHTML = htmlString

这个过程需要先通过JavaScript层的字符串运算,然后是Dom层的innerHTML的Dom运算 (将字符串赋值给Dom元素的innerHTML属性时会将字符串解析为Dom树)

而使用虚拟Dom的方式通常是编译用户编写的类html模板得到虚拟Dom(JavaScript对象),然后遍历虚拟Dom树创建真实Dom对象

两者比较:

innerHTML虚拟Dom
JavaScript层面运算计算拼接HTML字符串创建JavaScript对象(虚拟Dom)
Dom层面运算新建所有Dom元素新建所有Dom元素

可以看到两者在创建页面阶段的性能差异不大。尽管在JavaScript层面,创建虚拟Dom对象貌似更耗时间,但是总体来说,Dom层面的运算是一致的,两者属于同一数量级,宏观来看可认为没有差异

更新页面时

使用innerHTML更新页面,通常是这样:

//更新 const newData = "hello world" const newHtmlString = `<div>${newData}</div>` domcument.querySelect('.target').innerHTML = newHtmlString

这个过程同样是先通过JavaScript层的字符串运算,然后是Dom层的innerHTML的Dom运算。但是它在Dom层的运算是销毁所有旧的DOM元素,再全量创建新的DOM元素

而使用虚拟Dom的方式通常是重新创建新的虚拟Dom(JavaScript对象),然后比较新旧虚拟Dom,找到需要更改的地方并更新Dom元素

两者比较:

innerHTML虚拟Dom
JavaScript层面运算计算拼接HTML字符串创建JavaScript对象(虚拟Dom)+ Diff算法
Dom层面运算销毁所有旧的Dom元素,新建所有新的DOM元素必要的DOM更新

可以看到虚拟DOM在JavaScript层面虽然多出一个Diff算法的性能消耗,但这毕竟是JavaScript层面的运算,不会产生数量级的差异。而在DOM层,虚拟DOM可以只更新差异部分,对比innerHTML的全量卸载与全量更新性能消耗要小得多。所以模板越大,元素越多,虚拟DOM在更新页面的性能上就越有优势

总结

现在我们可以回答这位面试官的问题了:JQuery属于命令式框架,Vue属于声明式框架。在理论上,声明式代码性能是不优于命令式代码性能的,甚至差于命令式代码的性能。但是声明式框架无需用户手动操作DOM,用户只需关注数据的变化。声明式框架在牺牲了一点性能的情况下,大大降低了开发难度,提高了项目的可维护性,且声明式框架通常使用虚拟DOM的方式,使其在更新页面时的性能大大提升。综合来说,声明式框架仍旧是更好的选择


作者:yep
链接:juejin.cn/post/74251213

为什么有人说React和Vue可能是最后的前端框架了?  第1张

完整版pdf须要的【点击此处】即可免费获取

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/5197.html

分享给朋友:

相关文章

开发了个小程序,咋推广呢?

要是开发了个小程序,想推广的话,可以先从自己的朋友圈子下手,让亲戚朋友都帮忙转发宣传,这样能先有点人气。然后去一些跟你的小程序相关的论坛、社区啥的,发帖子介绍介绍,吸引有兴趣的人。还能找些网红、博主合作,要是他们觉得你的小程序不错,帮忙推荐...

台积电通知其中国客户,从下周开始,所有 7nm 及以下芯片出货将停止。如何看待这一行为?

台积电通知其中国客户,从下周开始,所有 7nm 及以下芯片出货将停止。如何看待这一行为?

我说美国快要没招了,你信么?这次台积电宣布停止向中国大陆客户供应7纳米及更先进AI芯片,再加上前段时间台积电对华为的制裁,我们基本可以认为,台积电在高端芯片领域,已经彻底把大陆给拉黑了,这也意味着中美芯片战已经到了最关键的时刻,一旦我们克服...

都是前端框架,为什么用 React 的人会有优越感?

都是前端框架,为什么用 React 的人会有优越感?

上家公司一直搞react,最近第一次写个vue3项目。老板朋友来了看了下页面说:这用vue写的吧。我:是...老板朋友:一看就知道是vue做的。这tm你看一眼页面就知道用的啥框架?这感觉就是,我一直用苹果,偶尔用了下华为打电话,有个人离老远...

如何看待 Luv Letter 表示影视飓风专业性实在是让人失望?

一点儿新进展,另外以下有部分需要关注对于统一变量的问题。这个我在对比上面有写小字解释,我在一开始使用ffmpeg来控制变量。但是发现了不少问题,比如因为遗留bug,会强制将非整数帧的素材转码为VFR导致无法正确帧间对比,因此不考虑,同时尽量...

抖音小店三个月了一单没出,也没有流量,一个星期好像都没有一个点击,怎么办?

抖音小店三个月了一单没出,也没有流量,一个星期好像都没有一个点击,怎么办?

好消息,你有毅力上200多个品,还能坚持三个月坏消息,一单没出我感觉你还是别碰抖店了,甚至电商平台都别碰 你没这个缘分我要是这样,我得用一百辆叉车叉死我自己你如果还想坚持,我直接给你这套至少价值19800学来的新思路简单来说就是 你做的好的...

常微分方程的理论对偏微分方程的研究有没有帮助?

常微分方程的理论对偏微分方程的研究有没有帮助?

之前看到过一句话,好像是 Bourgain 说的,大意是做 ode 的做到深处就到了 pde,做 pde 的做到深处就到了 ode,ode 和 pde 最后是相通的。以我目前有限的知识,只知道下面两个方向:1. Hamilton 系统在现代...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。