Vue3和Vue2差异

从官方文档看起来Vue3相对Vue2来说有较多的变化。

Typescript的引入

Vue 3 的代码库已经全面采用 TypeScript 重写,提供了更好的类型推断和类型提示。提供了更多的内置类型声明,使得开发时更容易发现代码错误和调试。

响应式系统

Vue2通过Object.definedProperty()的get()和set()来做数据劫持、结合和发布订阅者模式来实现,Object.definedProperty()会遍历每一个属性。

Vue3通过proxy代理的方式实现。proxy的优势:不需要像Object.definedProperty()的那样遍历每一个属性,有一定的性能提升proxy可以理解为在目标对象之前架设一层“拦截”,外界对该对象的访问都必须通过这一层拦截。这个拦截可以对外界的访问进行过滤和改写。

当属性过多的时候利用Object.definedProperty()要通过遍历的方式监听每一个属性。利用proxy则不需要遍历,会自动监听所有属性,有利于性能的提升。

Diff算法

Vue2中的diff算法:遍历每一个虚拟节点,进行虚拟节点对比,并返回一个patch对象,用来存储两个节点不同的地方。用patch记录的消息去更新dom。缺点:比较每一个节点,而对于一些不参与更新的元素,进行比较是有点消耗性能的。特点:特别要提一下Vue的patch是即时的,并不是打包所有修改最后一起操作DOM,也就是在Vue中边记录变更新。(React则是将更新放入队列后集中处理)。

Vue3中的diff算法:在初始化的时候会给每一个虚拟节点添加一个patchFlags,是一种优化的标识。只会比较patchFlags发生变化的节点,进行识图更新。而对于patchFlags没有变化的元素作静态标记,在渲染的时候直接复用。

组合式API和选项式API

在Vue2中采用选项式API,将数据和函数集中起来处理,将功能点切割了当逻辑复杂的时候不利于代码阅读。

在Vue3中采用组合式API(同时也兼容组合式API),将同一个功能的代码集中起来处理,使得代码更加有序,有利于逻辑复用和代码的书写维护。

生命周期

从一定程度上来说,Vue3和Vue2他们的生命周期是没有变化的,变化的只是生命周期钩子函数。生命周期钩子被重命名并调整顺序,以更加清晰地反映出它们在整个组件生命周期中的位置。

插槽

Vue2中必须要有根标签;Vue3中可以没有根标签,会默认将多个根标签包裹在一个fragement虚拟标签中,有利于减少内存。

v-if和v-for的优先级

在Vue2中v-for的优先级高于v-if,可以放在一起使用,但是不建议这么做,会带来性能上的浪费。

在Vue3中v-if的优先级高于v-for,一起使用会报错。可以通过在外部添加一个标签,将v-for移到外层。

除上述以外,
Vue3 相比 Vue2 来说拥有更高的渲染性能,Vue3 重写了虚拟 Dom 实现,编译模板的优化,更高效的组件初始化;
Vue 3 的运行时核心相比 Vue 2 更小,这意味着更小的打包体积,减少了前端加载时间;
Tree-shaking 支持:Vue 3 代码更容易被 Tree-shaking 优化,因此可以更好地剔除不需要的代码。

[越努力,越幸运!]