本文不是要辩论 Vue 好还是 React 好,而是要看看这两个框架在低层次上是如何选择的。

我知道有些开发者在选择框架之前会倾向于看基准。然而,这并不是最关键的方面,因为99%的性能都来自于你写的代码,而不是你使用的框架。

那么,我是如何得出这个结论的呢?

这里选取了三个常见的web应用程序问题,并检查了Vue和React在每个场景中的响应情况。

项目

这里有一个类似 TODO 的项目,不过这里添加的不是事项而是水果。

下面是 React 代码:

Vue 代码:

测试1:静态模块

在第一个测试中,我们将比较 React 和 Vue 是如何编译静态部分的。

先来看看React:

如上图所示,在 JSX 中,编译器是非常简单的。所有的 JSX 元素都被替换成 React ​ ​的createElement​ ​ 函数。它将在应用程序的每次状态更新时重新渲染所有静态元素。

再来看看 Vue 中是怎么做的:

可能看起来有些复杂,但这里注意一下 hoisted_1 变量和 setup 方法。正如我们所看到的,hoisted_1变量包含了我们的静态内容,并被定义在 setup 函数之外。

在编译过程中,Vue检测所有不依赖于应用程序状态的静态节点,并将变量提升到组件设置之外,这样它就不必在每次渲染后重新生成这些静态节点。

小结

React 只将 JSX 编译为JS,而 Vue 通过提升有效地优化了静态块。这种优化对具有许多节点和深层树状结构的大页面是有益的。

测试2:重新渲染

React 和 Vue 之间的显著差异在这第二个测试中显现出来。

当我们在文本输入中输入 "TEST "时,React 应用程序的控制台:

我们可以看到,MyFruits组件被渲染了五次。

  • 在父组件的第一次渲染时一次
  • 在输入中每按一次键,就有四次(test 的个数)。

再来看看 Vue 的情况:

MyFruits 组件只渲染了一次。

默认情况下,Vue中的任何孩子组件都是有缓存。只有当它的 props 发生变化时,它才会被重新渲染。

React 中无论 props是否改变,都会重新渲染。

因此,Vue 中的同等代码比 React 的性能更强:sunglasses:。

React 是怎么来解决这个问题的?

在React中,开发者可以选择通过使用memo helper来启用 memoization。可以通过下面的代码来完成:

然而,这需要额外的代码来达到相同的性能。

测试 3:计算属性

在Vue中,一个计算属性是一个将根据其他属性而被重新计算粜的的值。例如,一个 hashed password 只有在 password 被改变时才会被重新计算。

在 React 中:

每次渲染时都会调用 hash 。

在Vue中,只有在使用 hashed 时才会重新执行。如果该值在模板中不是必需的,就不会重新执行。此外,Vue 隐含地检测到了依赖关系,只有在 password  改变时才会进行计算。

这在 React中也是可行的,也也是需要额外的代码:

我们需要调用 useMemo 并提供一个依赖数组。此外,React 无法检测到模板中是否使用了 hashed 变量,并会在第一次渲染时计算 hash 。

这是一个非常简单的例子,但要考虑复杂的操作。这将极大地影响组件的渲染时间,特别是当计算的属性在初始渲染时没有被使用时。

所以 Vue > React?

不,经过上面所有的例子,你可能认为 Vue 比 Reac t的性能更好。但这是错误的。事实上,这两个库有不同的理念。Vue 是隐式的,而 React 是显式的。

怎么说?

Vue 是老好人,倾向于将尽可能多的事情自动化,因此开发者可以专注于业务逻辑。Vue 默认提供更好的性能。

另一方面,如果我们想开发更复杂的功能,这也会导致缺乏一些灵活性。如果你没有真正掌握 Vue组件的生命周期,你可能会花很多时间来调试一些愚蠢的代码。

另外,React 比较懒,需要开发者自己动手,不过,这样也给我们带来更多的灵活性。但也会多写些代码,像上面的三个例子一样,才能达到与Vue相同的性能。

综上,如果是新手,可以先从 vue 上手,比较好入手。相比之下,React 适合那些已经有基于组件的框架工作经验的开发者。

为什么Vue(默认情况下)比React性能更好相关推荐

  1. vue xss 存在_默认情况下,Vue是否为XSS提供安全性或防御XSS?

    我试图找出如何保护, 角度的 Vue 反应 抵抗XSS攻击.当我访问Angular官方文档时, , 它说: 为了系统地阻止XSS错误,默认情况下,Angular将所有值视为不可信.当通过属性,属性,样 ...

  2. python使用matplotlib可视化函数曲线、设置y轴为对数坐标(log scale)、默认情况下坐标轴为线性坐标

    python使用matplotlib可视化函数曲线.设置y轴为对数坐标(log scale).默认情况下坐标轴为线性坐标 目录

  3. c# 的 textbox 默认情况下是有最大字符长度限制的

    c# 的 textbox 默认情况下是有最大字符长度限制的 偶然发现还以为是以前的 windows 本身控件的限制,一查 msdn 居然是 C#(.net)自己限制的. " 属性值 类型:S ...

  4. android弹出选择usb,android 解决:默认情况下用于该USB设备 自动获取USB操作权限...

    很多android 的应用在使用USB设备时,总会遇到一个很烦人的问题. 即每次都会弹出对话框: 每次插入USB设备,都会弹出.每次选上默认情况下使用该USB设备.但总还是会弹出.用户体验很差. 似乎 ...

  5. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  6. target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件...

    target存放的是编译后的.class文件地方 默认情况下不会讲非class文件放入进入 如果要使用非.class文件 需要通过增加配置方式自动加入文件 转载于:https://www.cnblog ...

  7. ios numlock_从“提示”框:默认情况下启用NumLock,无广告的iOS应用和立体声供电的派对灯...

    ios numlock Once a week we round up some of the great tips readers have sent into the tip box. This ...

  8. android textview 白色,android – AutoCompleteTextview默认情况下,颜色设置为白色

    我在我的Android应用程序中使用了一个AutoCompleteTextView,它正常工作.我唯一遇到的问题是,默认情况下,建议的颜色为白色,我无法看到任何建议.所以当我开始打字时,列表会以白色条 ...

  9. Suggestion [3,General]: 找不到命令 webpack,但它确实存在于当前位置。默认情况下,Windows PowerShell 不会从当前位置加载命令。如果信任此命令,请改为键

    Suggestion [3,General]: 找不到命令 webpack,但它确实存在于当前位置.默认情况下,Windows PowerShell 不会从当前位置加载命令.如果信任此命令,请改为键入 ...

最新文章

  1. C#/Net代码精简优化技巧(3)
  2. mysql 多表查询or_MySQL 多表查询
  3. c+和python的区别-与C ++相比,Python中方法和函数之间的差异
  4. 用饮水机教你什么是RAID [转]
  5. call / apply / bind
  6. n分频器 verilog_时钟分频系列——分数分频电路的Verilog实现
  7. 第1节 flume:15、flume案例二,通过自定义拦截器实现数据的脱敏
  8. HLS之TS码流封装
  9. 陈纪修老师《数学分析》 第09章:数项级数 笔记
  10. office哪个版本最好用?都有哪些版本
  11. PhD-Debate 预告 | 底层视觉研究,我们应该往哪走?
  12. 英文转换-在线英文批量转换器免费
  13. unity疯狂牧场完整项目源码 - Frenzy Farming time management game kit V1.0
  14. 统计之均值中位数众数全距四分位数以及箱线图展示
  15. pycharm显示全部数据_【数据可视化】BI工程师岗位分析
  16. 人工智能 02. 图像识别
  17. 使用frp配置内网机器访问
  18. Java面试指北!13个认证授权常见面试题/知识点总结!| JavaGuide
  19. 【GNSS】GNSS原理:GF组合探测周跳
  20. EXCEL随机函数实例

热门文章

  1. 某人写的openCV学习笔记
  2. Doxygen+Graphviz生成函数调用流程图
  3. 回溯算法(回溯搜索法)
  4. 放飞自我的体验,真无线耳机该如何让选择
  5. (区块链溯源)基于Hyperledger Fabric 的农产品区块链溯源方法
  6. appJSON[tabBar][borderStyle] 字段需为 black 或 white console.error @ VM1402:1 (anonymous) @ VM1415:2
  7. c语言编程练习题及答案
  8. 深入浅出的 Adaboost算法
  9. git本地仓库关联远程仓库的两种方式
  10. 【ROS2】【机器人导航navigation2】参数调整分析