类别:vue / 日期:2022-09-26 / 浏览:234 / 评论:0
1、编译阶段优化
回顾Vue2
,我们知道每个组件实例都对应一个 watcher 实例
,它会在组件渲染的过程中把用到的数据property
记录为依赖,当依赖发生改变,触发setter
,则会通知watcher
,从而使关联的组件重新渲染。
因此,Vue3
在编译阶段,做了进一步优化:
① diff算法优化
vue3
在diff
算法中相比vue2
增加了静态标记
,其作用是为了会发生变化的地方添加一个flag标记
,下次发生变化的时候直接
找该地方进行比较。
② 静态提升
Vue3中对不参与更新
的元素,会做静态提升,只会被创建一次
,在渲染时直接复用。免去了重复的创建操作,优化内存。
没做静态提升之前,未参与更新的元素也在render函数
内部,会重复创建阶段
。
做了静态提升后,未参与更新的元素,被放置在render 函数外
,每次渲染的时候只要取出
即可。同时该元素会被打上静态标记值为-1
,特殊标志是负整数
表示永远不会用于 Diff
。
③ 事件监听缓存
默认情况下绑定事件行为会被视为动态绑定(没开启事件监听器缓存
),所以每次
都会去追踪它的变化。开启事件侦听器缓存
后,没有了静态标记。也就是说下次diff算法
的时候直接使用
。
④ SSR优化
当静态内容大到一定量级时候,会用createStaticVNode
方法在客户端去生成一个static node
,这些静态node
,会被直接innerHtml
,就不需要创建对象,然后根据对象渲染。
2、源码体积
相比Vue2
,Vue3
整体体积变小
了,除了移出一些不常用的API
,最重要的是Tree shanking
。
任何一个函数,如ref、reavtived、computed
等,仅仅在用到
的时候才打包
,没用到
的模块都被摇掉
,打包的整体体积变小
。
3、响应式系统
vue2
中采用 defineProperty
来劫持整个对象,然后进行深度遍历所有属性,给每个属性
添加getter和setter
,实现响应式。
vue3
采用proxy
重写了响应式系统,因为proxy
可以对整个对象进行监听
,所以不需要深度遍历。
可以监听动态属性的添加
可以监听到数组的索引和数组length属性
可以监听删除属性
发表评论 / 取消回复