Vue 3 性能飞跃:解析其性能提升的关键方面

文章目录

  • 响应式系统优化
  • 静态树提升
  • diff算法优化
  • Tree Shaking优化
  • Composition API
  • 事件缓存机制

响应式系统优化

Vue双向绑定原理

Proxy 相较于 Object.defineProperty 在性能上的优势主要体现在以下几个方面:

  1. 属性检测的全面覆盖:

    • Object.defineProperty 只能针对对象已有的属性进行劫持,对于对象属性的添加或删除无法做到监听。

    • Proxy 则可以代理整个对象,无论是属性的读取、赋值,还是添加新属性、删除属性,甚至是监听数组的变化等,Proxy 都可以做到。

    因此,Proxy 提供了更全面的属性检测覆盖,减少了开发者需要手动处理特殊情况的代码量。

.

  1. 减少性能开销:

    • 由于 Object.defineProperty 是针对每个属性进行劫持的,因此当对象属性较多时,会导致大量的性能开销。

      vue2无法知道代码运行时具体会访问哪个属性,所以在初始化这个对象的时候,vue2只能采取递归遍历的方式把对象的每一层每一个属性都变成响应式,这就会影响页面的初始化渲染速度;

    • 而 Proxy 是对整个对象进行代理,无需对每个属性进行单独处理,从而减少了性能开销。

      对于多层嵌套的对象,由于proxy只能代理一层,所以vue3在真正访问到对象属性的时候,才去判断递归,而不是在初始化的时候就一股脑的递归。

    .

  2. 更好的扩展性:
    Proxy 是 ECMAScript 6 (ES6) 引入的新特性,相较于 Object.defineProperty 有着更好的扩展性和未来兼容性。

    随着 JavaScript 语言的不断发展和完善,Proxy 可能会得到更多的优化和改进,从而进一步提升性能。
    .

  3. 更高的灵活性:
    Proxy 是直接代理整个对象。这意味着 Proxy 可以更加灵活地处理对象的各种操作,而不仅仅局限于属性的读写。
    这种灵活性使得 Proxy 在处理复杂逻辑或特殊需求时更加得心应手。


静态树提升

静态树提升(Static Tree Hoisting)可以在编译阶段识别并提取出不会改变的静态节点,从而避免在每次渲染时重复计算这些节点,提高了组件的渲染性能,通过减少不必要的计算和DOM操作来加快页面的加载和更新速度。

  • 在Vue2的编译中,有一个optimize过程,会对一些不会变化的DOM做静态标记。
    一旦一个节点被标记为静态根节点,Vue就会生成一个staticRenderFns数组来缓存这些静态节点的渲染函数。
    这意味着在每次组件的渲染过程中,Vue可以直接调用这些缓存的渲染函数来生成静态节点的VNode,而不是每次都重新计算

    此外,静态节点生成的VNode会带有isStatic: true的属性。在Vue的虚拟DOM diff算法中,会跳过对带有isStatic: true属性的VNode这些节点的比较和更新,因为它们是静态的,不会改变。这进一步减少了不必要的DOM操作和比较,提高了渲染性能。

  • 在Vue 3中,静态树提升不仅仅是对单个静态节点进行优化,而是将整个静态子树(即一组嵌套的静态节点)提升到父组件的渲染过程中。这意味着,在每次父组件重新渲染时,这个静态子树都会被直接复用,而不需要重新计算和创建。

通过这种方式,静态树提升能够显著减少渲染函数的复杂性,降低不必要的运行时开销,从而提高应用的性能和响应速度。尤其是在处理包含大量静态内容的组件时,静态树提升的效果尤为显著。


diff算法优化

Vue中的diff算法

  • 静态标记与缓存
    Vue 3在编译阶段会对静态节点进行标记,并在渲染过程中缓存这些静态节点。
    这意味着在后续的更新中,Vue可以直接跳过这些静态节点的比较和渲染,从而减少了不必要的计算和DOM操作。
    这种优化在大型应用中尤为显著,可以显著提高渲染性能。

  • 动态节点的优化
    除了静态节点,Vue 3还对动态节点进行了优化。
    通过标记动态节点,Vue 3能够只对需要更新的节点进行比较和渲染,进一步提高了渲染性能。
    这种优化对于频繁更新或具有大量动态内容的组件尤为有效。

  • 事件代理与静态事件优化
    Vue 3的diff算法还针对事件监听器进行了优化。
    它采用了事件代理的方式,减少了事件监听器的数量,提高了性能。
    此外,对于静态事件,Vue 3的diff算法会跳过不必要的比较和更新,只有在事件确实发生变化时才会触发组件的更新。

  • 最长递增子序列
    Vue 3的diff算法采用了最长递增子序列(Longest Increasing Subsequence,LIS)算法来找出最小的修改偏移量,优化节点移动时的操作,进一步减少了不必要的节点比较和更新操作,提高渲染性能。
    LIS算法在diff过程中可以确定最少需要移动哪些节点来达到新的顺序,从而避免了不必要的节点重排。


Tree Shaking优化

Vue 3 提供了更好的 Tree Shaking 支持,可以消除代码中未使用的部分,减少了不必要的代码和模块,减少打包体积,从而降低了应用程序的加载时间和运行时的内存占用。

  • Vue 3通过静态树提升技术,能够在编译阶段就识别并移除模板中的静态部分,这意味着这些静态部分在最终的打包结果中不会占用任何空间。而Vue 2中,由于无法有效识别和处理静态内容,即使它们不会被使用,也会包含在最终的打包文件中,从而增加了体积。

  • Vue 3的源代码被重写为使用ES Modules格式,这使得Vue 3能够天然地支持Tree Shaking。ES Modules格式允许开发者将代码拆分成更小的、可复用的模块,并且只有在这些模块被实际使用时,才会被打包进最终的代码中。


Composition API

Vue3引入了Composition API,允许开发者将组件的逻辑分割成更小的、可复用的函数。这种模块化的设计使得代码更加清晰、易于维护,并且提高了组件的复用性,进一步提升了性能。

通过引入 Composition API,开发者可以更好地组织和复用逻辑代码,提高了代码的可维护性和可读性。

同时,Vue 3 还支持更多的特性,如片段(Fragments)、Teleport(传送门)和 Suspense(异步组件的悬挂状态)等,进一步丰富了组件的功能和用法。


事件缓存机制

Vue 3 引入了事件缓存机制,当事件被多次触发时,不会每次都执行事件处理函数,而是使用缓存的结果,从而减少了不必要的计算和处理时间,提高了应用程序的性能。

  • 在 Vue 2.x 中,当绑定 DOM 事件(如 @click)时,这些事件被视为动态变量。

    因此,每次视图更新时,Vue 都会追踪这些事件的变化,并在每次触发时重新生成新的函数。

    这种机制在事件处理上可能产生不必要的开销。

  • 在 Vue 3 中,通过引入事件缓存对象 cacheHandlers,这种机制得到了改进。

    当 cacheHandlers 开启时,@click 等绑定的事件会被标记为静态节点,并放入 cacheHandlers 中。这样,在视图更新时,Vue 不会追踪这些静态事件的变化。

    当事件再次触发时,Vue 可以直接调用缓存的事件回调方法,而无需重新生成函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

格雷希尔G80L-T系列大口径快速连接器,在汽车膨胀水箱的气密性测试密封方案

副水箱也有人称作膨胀水箱,是汽车散热系统的一个重要组成部分,当水箱里面的温度过高的时候就会产生一定的压力,而副水箱可以根据热胀冷缩来帮助水箱和发动机排出去多余的水,起到一个调节的作用,副水箱由PP/PE塑料注塑而…

spring高级篇(一)

1、ApplicationContext与BeanFactory BeanFactory是ApplicationContext的父级接口:(citlaltu查看类关系图) 在springboot的启动类中,我们通过SpringApplication.run方法拿到的是继承了ApplicationContext的ConfigurableApplicatio…

Qt使用miniblink第三方浏览器模块

文章目录 一、前言二、miniblink简介三、miniblink使用四、运行效果五、工程结构 一、前言 本文取自刘典武大师:Qt编写地图综合应用58-兼容多浏览器内核 用Qt做项目过程中,遇到需要用到浏览器控件的项目,可能都会绕不开一个问题,那…

【Web】VS Code 插件

专栏文章索引:Web 有问题可私聊:QQ:3375119339 目录 一、安装步骤 二、插件 1.Chinese (Simplified) (简体中文) 2.open in browser 3.vscode-icons 4.Live Server 5.Live Server Preview 6.翻译(英汉词典) 一、安装步骤 点击 “扩…

创纪录的里程碑!光镊阵列捕获逾6,000中性原子,量子计算再达新高

论文链接: https://arxiv.org/abs/2403.12021 2024年3月18日,研究人员成功开发出一种大规模光镊阵列,能够在12,000个位点上捕获超过6,100个中性原子,同时在几个关键性能指标上达到新的高度: 1)相干时间达到…

新零售门店、商品、会员管理指标体系总览

新零售,旨在打破传统零售业的边界,引入先进科技和数字化手段,通过整合线上线下渠道,全面提升用户体验,并实现更智能、高效、个性化的零售运营模式。这一模式不仅仅关注销售产品,更注重构建全方位的购物生态…

《中医临床诊疗术语》数据库

最新版的《中医临床诊疗术语》于2023年3月17日由国家中医药管理局提出的,由国家市场监督管理总局和国家标准化管理委员会共同发布。新版的修订是为落实相关政策文件要求,推进中医医疗服务规范化、标准化管理,提高中医医疗服务标准化水平和管理…

asyncio异步编程

参考视频:02 协程_哔哩哔哩_bilibili 1.协程:(不是计算机中真实存在的,人为创造出的概念),也可称为微线程。 本质是用一个线程在一段代码中来会切换游走的线程,是一种用户态内的上下文切换技术…

中科驭数:DPU是构建高效智算中心基础设施的必选项

4 月 15 日,在江苏省未来网络创新研究院、网络通信与安全紫金山实验室举办的“2024智算网络技术与应用创新峰会”上,中科驭数作为DPU算力基础设施领军企业,受邀出席本次峰会。中科驭数产品运营部副总经理曹辉先生在《基于DPU的高效智算中心算…

OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:2024年AI初学者需要掌握的热门技能有哪些? 0 导 读 本文主要介绍2024年AI初学者需要掌握的热门技能。 1 前 言 人工智能无疑是技…

基于java+springboot+vue实现的智慧党建系统(文末源码+Lw+ppt)23-58

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统智慧党建管理采取了人工的管理方法,但这种管…

openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置

文章目录 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置264.1 恢复BIOS出厂设置264.2 修改相关BIOS设置264.3 重启操作系统 openGauss学习笔记-264 openGauss性能调优-TPCC性能调优测试指导-BIOS配置 本章节主要介绍openGauss数据库内核基于鲲鹏服务…

BTI功能验证与异常解析

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击?什么是ROP攻击?区别与联系? 2、什么是JOP攻击?间接分支跳转指令? 3、JOP攻击的缓解技术?控制流完整性保护? 4、BTI下的JOP如何…

【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 粒子群算法(Particle Swarm Optimization,简称PSO)是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述: 基本思想: 鸟群在寻找食物时,每只鸟都…

【开发篇】十三、JVM基础参数设置与垃圾回收器的选择

文章目录 1、-Xmx 和 –Xms2、-XX:MaxMetaspaceSize 和 –XX:MetaspaceSize3、-Xss4、不建议改的参数5、其他参数6、选择GC回收器的调试思路7、CMS的并发模式失败现象的解决8、调优案例 GC问题解决方式: 优化JVM基础参数,避免频繁Full GC减少对象的产生…

ADB的基本语法及常用命令

学习网址 ADB命令的基本语法如下&#xff1a; adb [-d|-e|-s <serialNumber>] <command> 如果有多个设备/模拟器连接&#xff0c;则需要为命令指定目标设备。 参数及含义如下&#xff1a; 常用命令如下&#xff1a; 1. 启动ADB服务 adb start-server 2. 停止…

JavaScript入门--数组

JavaScript入门--数组 前言数组的操作1、在数组的尾部添加元素2、删除数组尾部的元素&#xff0c;也就是最后一个元素3、删除头部第一个元素4、在数组的前面添加元素 小案例5、数组的翻转6、数组的排序7、数组的合并8、数组的切片 前言 JS中的数组类似于python中的列表&#x…

人工智能揭示矩阵乘法的新可能性

人工智能揭示矩阵乘法的新可能性 数学家酷爱漂亮的谜题。当你尝试找到最有效的方法时&#xff0c;即使像乘法矩阵&#xff08;二维数字表&#xff09;这样抽象的东西也会感觉像玩一场游戏。这有点像尝试用尽可能少的步骤解开魔方——具有挑战性&#xff0c;但也很诱人。除了魔方…

政安晨:【深度学习神经网络基础】(九)—— 在深度学习神经网络反向传播训练中理解梯度

目录 简述 理解梯度 什么是梯度 计算梯度 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 简述 在深度…

SQL SERVER的安装

目录 1.百度SQL SERVER找到图下的所显示的&#xff0c;点击进去 2.找到图下红色框起来的&#xff0c;点击立即下载​ 3.下载好之后点开&#xff0c;选择下载介质 4.SQLSERVER下载成功之后选择打开文件夹​ 6.双击后缀名是.iso的镜像文件 7.双击setup.exe进行安装​ 8.安…