面试宝典--Vue3 性能提升主要体现在哪几方面

277 阅读2分钟

1、响应式性能提升

Vue3使用了Proxy代理对象来实现响应式系统,相比Vue2的Object.defineProperty,Proxy可以更好地处理动态添加和删除属性的情况,同时也更加高效。

Vue2 的数据响应式是通过 Object.defineProperty 实现,这是一个深度遍历的过程,无论 data 中包含多少层数据,都需要全部遍历一遍。深度遍历,给对象的每个自身属性添加 defineProperty,需要不小的性能开销,同时后面新增到 this 中的属性不提供响应式监听,因此我们需要使用像this.$set这种方式去添加新属性。Proxy 就没有这个问题,Proxy 不但使得 data 获得了新属性的响应性,整个响应式处理过程的效率还提升了数倍,由此带来了 Vue3 的大部分性能提升。

2、编译优化

1、Vue3引入了patchFlag用来标记动态内容;在编译过程中会根据不同的属性类型打上不同的标识,从而实现了快速diff算法。

2、Block Tree :Vue3通过编译阶段对静态模板的分析,编译生成了 Block treeBlock tree 是一个将模板基于动态节点指令切割的嵌套区块,每个区块内部的节点结构是固定的,每个区块只需要以一个Array 来追踪自身包含的动态节点。借助 Block treeVue.js 将 vnode 更新性能由与模版整体大小相关提升为与动态内容的数量相关,这是一个非常大的性能突破。

3、静态提升,是将静态的节点或者属性提升出去。当静态节点连续超过10个时,预处理将进行字符串化并合并为连续的静态节点序列。启用cacheHandlers选项后,函数会被缓存,以便于之后直接调用。

3、源码体积的优化

1、首先,移除了一些冷门的api(例如:filter, inline-template)等

2、其次,引入tree-shaking的技术来减少打包的体积,利用tree-shaking技术,如果项目中没有使用transition,和keep-alive等组件时,那么这些代码就不会进行打包,这样就间接达到了减少项目引入vue.js包体积的目的。