首先对于vue.js 3.0,它是vue.js 2.0的升级版本,在4月21号晚,Vue创始人尤雨溪在B站直播分享了 Vue.js 3.0最新进展,对于vue3,有很多性能上的优化:
1).编译阶段
我们在调用组件的过程中,其实组件都有一个对应的watcher
方法,来监听组件内部所发生的变化,如果发生变化,就会用到,getter,setter
来进行相关组件的重新渲染。
因此,Vue3在编译阶段,做了进一步优化。主要有如下:
~1.diff算法优化
1).我们都知道
diff算法
可以形成dom树
,在vue2中,dom树如果渲染完毕,在想要更新,就需要整个dom树一起变化,节点之间进行比较,没有发生变化的节点也会重新渲染,非常的消耗性能。
2).在vue3中,增加了一个静态标记flag
,也就是说我们在发生变化时只比较有flag
标记的地方,这样的话,提高了性能。
diff算法比较
~2.静态提升
vue2中对于静态不需要发生变化的元素,在整个dom树发生变化时,静态元素也会重新渲染,消耗性能。vue3中,对于静态内容做了
静态提升
,也就是说,dom树更新的时候,会直接复用
,这样就不会重复创建节点,优化了内存。
~3.事件监听缓存
默认情况下,vue绑定事件是动态绑定,每次启用都要监听他的变化,而用到这个事件监听缓存之后,diff算法重新渲染会直接使用这个方法。
2).源码体积
相对于vue2,vue3整个源码体积相对减少,移出了一些不常用的Api外,更重要的是在打包的时候,我们只需要打包我们所用到,例如
ref
,reactive
,components
等,没有用到的模块则会被摇掉,大大节省了打包后文件的大小,提升了运行效率。
3).响应式的变更
1.我们都知道在vue2中,他的核心特点之一就是数据的
双向绑定
,他的实现原理是通过Object.defineProperty
进行双向绑定,深度遍历所有属性,通过getter
,setter
进行实现双向绑定。
2.到了vue3采用了ES2015的Proxy
,就更为高效,Proxy
可以对整个对象进行监听,所有不需要深度遍历监听。
-/ 可以监听动态属性的添加
-/ 可以监听到数组的索引和数组length属性
-/ 可以监听删除属性
proxy
以上只是对vue3部分优化进行简析,其实更多的是性能方面的优化:
1.重写了虚拟Dom实现(且保证了兼容性,脱离模版的渲染需求旺盛)
2.编译模板的优化
3.更高效的组件初始化
4.undate性能提高1.3~2倍
5.SSR速度提高了2~3倍