一、Vue 3.0 性能提升主要是通过哪几方面体现的?

1. 响应式系统提升

  • vue2在初始化的时候,对data中的每个属性使用definepropery调用getter和setter使之变为响应式对象。如果属性值为对象,还会递归调用defineproperty使之变为响应式对象。
  • vue3使用proxy对象重写响应式。proxy的性能本来比defineproperty好,proxy可以拦截属性的访问、赋值、删除等操作,不需要初始化的时候遍历所有属性,另外有多层属性嵌套的话,只有访问某个属性的时候,才会递归处理下一级的属性。

优势:
可以监听动态新增的属性;
可以监听删除的属性 ;
可以监听数组的索引和 length 属性;

2. 编译优化

  • 优化编译和重写虚拟dom,让首次渲染和更新dom性能有更大的提升
    vue2 通过标记静态根节点,优化 diff 算法
    vue3 标记和提升所有静态根节点,diff 的时候只比较动态节点内容

  • Fragments, 模板里面不用创建唯一根节点,可以直接放同级标签和文本内容

  • 静态提升

  • patch flag, 跳过静态节点,直接对比动态节点

  • 缓存事件处理函数

3. 源码体积的优化

  • vue3移除了一些不常用的api,例如:inline-template、filter等
  • 使用tree-shaking

二. Vue 3.0 所采用的 Composition Api 与 Vue 2.x使用的Options Api 有什么区别?

Options Api

包含一个描述组件选项(data、methods、props等)的对象 options;
API开发复杂组件,同一个功能逻辑的代码被拆分到不同选项 ;
使用mixin重用公用代码,也有问题:命名冲突,数据来源不清晰;

composition Api

vue3 新增的一组 api,它是基于函数的 api,可以更灵活的组织组件的逻辑。
解决options api在大型项目中,options api不好拆分和重用的问题。

三. Proxy 相对于 Object.defineProperty 有哪些优点?

proxy的性能本来比defineproperty好,proxy可以拦截属性的访问、赋值、删除等操作,不需要初始化的时候遍历所有属性,另外有多层属性嵌套的话,只有访问某个属性的时候,才会递归处理下一级的属性。

可以监听数组变化
可以劫持整个对象
操作时不是对原对象操作,是 new Proxy 返回的一个新对象
可以劫持的操作有 13 种

四. Vue 3.0 在编译方面有哪些优化?

  • vue.js 3.x中标记和提升所有的静态节点,diff的时候只需要对比动态节点内容;
  • Fragments(升级vetur插件): template中不需要唯一根节点,可以直接放文本或者同级标签
  • 静态提升(hoistStatic),当使用 hoistStatic 时,所有静态的节点都被提升到 render 方法之外.只会在应用启动的时候被创建一次,之后使用只需要应用提取的静态节点,随着每次的渲染被不停的复用。
  • patch flag, 在动态标签末尾加上相应的标记,只能带 patchFlag 的节点才被认为是动态的元素,会被追踪属性的修改,能快速的找到动态节点,而不用逐个逐层遍历,提高了虚拟dom diff的性能。
  • 缓存事件处理函数cacheHandler,避免每次触发都要重新生成全新的function去更新之前的函数
  • tree shaking 通过摇树优化核心库体积,减少不必要的代码量

五. Vue.js 3.0 响应式系统的实现原理?

1. reactive

设置对象为响应式对象。接收一个参数,判断这参数是否是对象。不是对象则直接返回这个参数,不做响应式处理。
创建拦截器handerler,设置get/set/deleteproperty。
get
收集依赖(track);
如果当前 key 的值是对象,则为当前 key 的对象创建拦截器 handler, 设置 get/set/deleteProperty;
如果当前的 key 的值不是对象,则返回当前 key 的值。
set
设置的新值和老值不相等时,更新为新值,并触发更新(trigger)。
deleteProperty
当前对象有这个 key 的时候,删除这个 key 并触发更新(trigger)。

2. effect

接收一个函数作为参数。作用是:访问响应式对象属性时去收集依赖

3. track

接收两个参数:target 和 key
-如果没有 activeEffect,则说明没有创建 effect 依赖
-如果有 activeEffect,则去判断 WeakMap 集合中是否有 target 属性
-WeakMap 集合中没有 target 属性,则 set(target, (depsMap = new Map()))
-WeakMap 集合中有 target 属性,则判断 target 属性的 map 值的 depsMap 中是否有 key 属性
-depsMap 中没有 key 属性,则 set(key, (dep = new Set()))
-depsMap 中有 key 属性,则添加这个 activeEffect

4.trigger

判断 WeakMap 中是否有 target 属性,WeakMap 中有 target 属性,则判断 target 属性的 map 值中是否有 key 属性,有的话循环触发收集的 effect()。

vue3性能提升主要是通过哪几方面体现的相关推荐

  1. 2.Vue3.0 性能提升主要是通过哪几方面体现的?

    一.编译阶段 回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher ...

  2. 面试官:Vue3.0 性能提升主要是通过哪几方面体现的?

    一.编译阶段 回顾Vue2,我们知道每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把用到的数据property记录为依赖,当依赖发生改变,触发setter,则会通知watcher ...

  3. Web的现状:网页性能提升指南

    互联网发展非常迅速,所以我们创造了Web平台.通常 我们会忽视连通性等问题,但用户们却不会视而不见 .一瞥万维网的现状,可以发现我们并没有用同情心.变通意识去构建它,更不要说性能了. 所以,今天的We ...

  4. 大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)

    并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组,或者一个I ...

  5. 深度干货!如何将深度学习训练性能提升数倍?

    作者 | 车漾,阿里云高级技术专家 顾荣,南京大学副研究员 责编 | 唐小引 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 近些年,以深度学习为代表的人工智能技术 ...

  6. 性能提升3倍的树莓派4,被爆设计缺陷!

    整理 | 屠敏 转载自CSDN(ID:CSDNnews) 一直以来,素有世界最小电脑之称的 Raspberry Pi(树莓派)是一种独特的存在.它不仅只有一块信用卡般的体积,还具备主机电脑所具备的功能 ...

  7. AAAI 2020 | 滴滴东北大学提出自动结构化剪枝压缩算法框架,性能提升高达120倍...

    点击上方"视学算法",选择"星标" 快速获得最新干货 2020 年 2 月 7 日-2 月 12 日,AAAI 2020 将于美国纽约举办.不久之前,大会官方公 ...

  8. 初探性能优化--2个月到4小时的性能提升!

    作者:闪客sun  |  博客园 https://www.cnblogs.com/flashsun 一直不知道性能优化都要做些什么,从哪方面思考,直到最近接手了一个公司的小项目,可谓麻雀虽小五脏俱全. ...

  9. R语言构建xgboost模型:基于叶子索引衍生出新的特征并进行独热编码(one-hot encoding)之后构建新的模型、比较加入叶子索引特征的模型的分类性能提升

    R语言构建xgboost模型:基于叶子索引衍生出新的特征并进行独热编码(one-hot encoding)之后构建新的模型.比较加入叶子索引特征的模型的分类性能提升 目录

最新文章

  1. Bad credentials异常
  2. 米兔点读笔点读包_小米米兔点读笔评测:养成教育只要轻松一点
  3. docker修改默认存储位置
  4. 多线程中的ManualResetEvent
  5. php5.6.30源码下载,PHP 5.6.30 正式发布,安全漏洞修复
  6. 面试官:了解雪崩效应吗?了解Hystrix吗?怎么解决雪崩效应吗?(大型社死现场,教你运筹帷幄之中)
  7. TCP窗口大小的利与弊转载自
  8. Clion 远程同步设置
  9. 在.NET中使用SMTP发送邮件
  10. python 三维图片 任意切片_在python中实现将一张图片剪切成四份的方法
  11. 瑞芯微开发工具怎么刷机
  12. 用python简单处理图片(3):添加水印
  13. 云计算简介及Kubernetes云平台搭建
  14. 失传千年AE特效真经(二)
  15. 求助计算机程序员,程序员用代码求救:几近绝望时竟是老本行救了他
  16. Python学习之路:通过分片的方式修改列表的技巧(拓展知识)
  17. PYNQ-Z1 资源分析
  18. freebsd jail nginx php-fpm mysql weberp安装
  19. (五)统计分析基本算法
  20. php采集新闻数据插入数据库,PHP采集www.php.cn的文章,并存入数据库。

热门文章

  1. 从GPS角度来讲,抵押车和质押车有什么不同
  2. 梅科尔工作室-MySQL学习笔记
  3. 悄悄地,VR「起死回生」
  4. 2022年3月电子学会Python等级考试试卷(四级)答案解析
  5. 不要在虚妄的点赞和评论中迷失自己
  6. 心力——艰难环境下快乐、自由与生存力的源泉(一)
  7. matlab的三条线如何区分,股票的三条线代表什么意思?股票k线图中的三条线如何判断...
  8. 回顾 NFT 当前市场面临的问题以及未来展望
  9. oracle添加分区语句_Oracle分区详解和创建
  10. 国产蓝牙耳机哪个牌子好?国产蓝牙耳机音质排行榜