Vue3.0的优化总结


Posted in Javascript onOctober 16, 2020

1.源码优化:

a.使用monorepo来管理源码

  • Vue.js 2.x 的源码托管在 src 目录,然后依据功能拆分出了 compiler(模板编译的相关代码)、core(与平台无关的通用运行时代码)、platforms(平台专有代码)、server(服务端渲染的相关代码)、sfc(.vue 单文件解析相关代码)、shared(共享工具代码)等目录。
  • Vue.js 3.0,整个源码是通过 monorepo 的方式维护的,根据功能将不同的模块拆分到 packages 目录下面不同的子目录中,每个 package 有各自的 API、类型定义和测试。

b.使用Typescript来开发源码

  • Vue.js 2.x 选用 Flow 做类型检查,来避免一些因类型问题导致的错误,但是 Flow 对于一些复杂场景类型的检查,支持得并不好。
  • Vue.js 3.0 抛弃了 Flow ,使用 TypeScript 重构了整个项目。 TypeScript 提供了更好的类型检查,能支持复杂的类型推导;由于源码就使用 TypeScript 编写,也省去了单独维护 d.ts 文件的麻烦。

2.性能优化:

a.引入tree-shaking的技术

  • tree-shaking 依赖 ES2015 模块语法的静态结构(即 import 和 export),通过编译阶段的静态分析,找到没有引入的模块并打上标记。像我们在项目中没有引入 Transition、KeepAlive 等不常用的组件,那么它们对应的代码就不会打包进去。

b.移除了一些冷门的feature

  • Vue.js 3.0 兼容了 Vue.js 2.x 绝大部分的api,但还是移除了一些比较冷门的feature:如 keyCode 支持作为 v-on 的修饰符、$on,$off 和 $once 实例方法、filter过滤、内联模板等。

3.响应式实现优化:

a.改用proxy api做数据劫持

  • Vue.js 2.x 内部是通过 Object.defineProperty 这个 API 去劫持数据的 getter 和 setter 来实现响应式的。这个 API 有一些缺陷,它必须预先知道要拦截的 key 是什么,所以它并不能检测对象属性的添加和删除。
  • Vue.js 3.0 使用了 Proxy API 做数据劫持,它劫持的是整个对象,自然对于对象的属性的增加和删除都能检测到。

b.响应式是惰性的

  • 在 Vue.js 2.x 中,对于一个深层属性嵌套的对象,要劫持它内部深层次的变化,就需要递归遍历这个对象,执行 Object.defineProperty 把每一层对象数据都变成响应式的,这无疑会有很大的性能消耗。
  • 在 Vue.js 3.0 中,使用 Proxy API 并不能监听到对象内部深层次的属性变化,因此它的处理方式是在 getter 中去递归响应式,这样的好处是真正访问到的内部属性才会变成响应式,简单的可以说是按需实现响应式,就没有那么大的性能消耗。

4.编译优化:

a.生成block tree

  • Vue.js 2.x 的数据更新并触发重新渲染的粒度是组件级的,单个组件内部需要遍历该组件的整个 vnode 树。
  • Vue.js 3.0 做到了通过编译阶段对静态模板的分析,编译生成了 Block tree。Block tree 是一个将模版基于动态节点指令切割的嵌套区块,每个区块内部的节点结构是固定的。每个区块只需要追踪自身包含的动态节点。

b.slot编译优化

  • Vue.js 2.x 中,如果有一个组件传入了slot,那么每次父组件更新的时候,会强制使子组件update,造成性能的浪费。
  • Vue.js 3.0 优化了slot的生成,使得非动态slot中属性的更新只会触发子组件的更新。动态slot指的是在slot上面使用v-if,v-for,动态slot名字等会导致slot产生运行时动态变化但是又无法被子组件track的操作。

c.diff算法优化

语法api优化

a.优化逻辑组织

  • 使用 Vue.js 2.x 编写组件本质就是在编写一个“包含了描述组件选项的对象”,可以把它称为 Options API。我们按照 data、props、methods、computed 这些不同的选项来书写对应的代码。这种方式对于小型的组件可能代码还能一目了然,但对于大型组件要修改一个逻辑点,可能就需要在单个文件中不断上下切换和寻找逻辑代码。
  • Vue.js 3.0 提供了一种新的 API:Composition API,它有一个很好的机制去解决这样的问题,就是将某个逻辑关注点相关的代码全都放在一个函数里,这样在修改一个逻辑时,只需要改那一块的代码了。

b.优化逻辑复用

  • 在 Vue.js 2.x 中,我们一般会用 mixins 去复用逻辑。当抽离并引用了大量的mixins,你就会发现两个不可避免的问题:命名冲突和数据来源不清晰。
  • Vue.js 3.0 设计的 Composition API,在逻辑复用方面就会很有优势了。

以上就是Vue3.0的优化总结的详细内容,更多关于Vue3.0的优化详解的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
“不能执行已释放的Script代码”错误的原因及解决办法
Sep 09 Javascript
jQuery 使用手册(五)
Sep 23 Javascript
CSS+Jquery实现页面圆角框方法大全
Dec 24 Javascript
js实现快速分享功能(你的文章分享工具)
Jun 25 Javascript
JS 日期比较大小的简单实例
Jan 13 Javascript
利用jQuery实现打字机字幕效果实例代码
Sep 02 Javascript
JS比较两个数值的大小实例
Nov 25 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
Mar 23 jQuery
详解vue嵌套路由-query传递参数
May 23 Javascript
微信小程序之判断页面滚动方向的示例代码
Aug 30 Javascript
js 动态校验开始结束时间的实现代码
May 25 Javascript
简单了解Vue computed属性及watch区别
Jul 10 Javascript
JavaScript通如何过RGraph实现动态仪表盘
Oct 15 #Javascript
利用js实现简易红绿灯
Oct 15 #Javascript
关于Node.js中频繁修改代码重启服务器的问题
Oct 15 #Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 #Javascript
Node 使用express-http-proxy 做api网关的实现
Oct 15 #Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
Oct 15 #Javascript
angular共享依赖的解决方案分享
Oct 15 #Javascript
You might like
PHP XML操作类DOMDocument
2009/12/16 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
jquery html动态添加的元素绑定事件详解
2016/05/24 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
Node.js中的child_process模块详解
2018/06/08 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
python中二维阵列的变换实例
2014/10/09 Python
python实现按任意键继续执行程序
2016/12/30 Python
单链表反转python实现代码示例
2018/02/08 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
物业消防安全责任书
2014/07/23 职场文书
离婚协议书标准格式
2014/10/04 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技