面试官:说下vue3对比vue2做了哪些改进?

268 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

传送门:Vue2官方文档Vue3官方文档

来看官方对vue3新特性的介绍:

  • 重写双向数据绑定
  • VDom性能瓶颈
  • Fragments
  • Tree-Shaking的支持
  • Compositions API

本文这来逐一分析具体每一个新特性做了什么优化和改进

重写双向数据绑定

vue2中基于 defineProperty()来给每个属性添加getter和setter劫持整个对象,从而实现响应式

vue3则是采用proxy重写了响应式系统,因为proxy可以对整个对象进行监听,所以不需要深度遍历

Proxy的监听是针对一个对象的,那么对这个对象的所有操作会进入监听操作,这就完全可以代理所有属性了

因此该方式也解决了Vue2遗留的问题,可以监听动态新增的属性,可以监听删除的属性,也可以监听数组的变化,包括索引和length属性。

VDom性能瓶颈

本次,Vue3在diff算法中相比Vue2增加了静态标记

在Vue2中,每次更新diff,都是全量比对。但现在Vue3只对比带有标记的,这样可以大大减少非动态内容的对比消耗。

如下图,是Vue3 编译后的 Vdom 是这个样子的,新增加了patch flag 标记: 1 /* TEXT */,因此当 diff 算法走到 _createBlock 函数的时候,会忽略所有的静态节点,只对有标记的动态节点进行对比,而且在多层的嵌套下依然有效。

image.png

Fragments

相比于Vue2,Vue3 允许我们支持多个根节点,同时还新增了Suspense teleport  和  多 v-model 用法

Tree-shaking的支持

Tree shaking简单来讲,就是在保持代码运行结果不变的前提下,去除无用的代码

在Vue2中,无论我们使用什么功能,它们最终都会出现在生产代码中。主要原因是Vue实例在项目中是单例的,捆绑程序无法检测到该对象的哪些属性在代码中被使用到。

而Vue3中引入tree shaking特性,将全局 API 进行分块。对于不使用的功能,就不会包含在你的基础包中,从而大大减少打包体积。

Compositions API

Vue2使用的是Option ApI。Option ApI也就是选项API,通过定义methods,computed,watch,data等属性和方法,共同处理页面逻辑。因此,当组件变得复杂,就会导致对应属性的列表也会增加,这样就会导致组件难以阅读和理解。当然,如果是小型组件的话,也是十分友好的。

Vue3增加了Composition API的使用,Composition API是组件根据逻辑功能来组织的,一个功能所定义的所有API都放到一起,从而更加的高内聚,低耦合。并且对tree-shaking友好,代码也更容易压缩。Composition API见不到this的使用,减少了this指向不明的情况。

如下图,可以清晰的看到在逻辑组织和逻辑服用方面,Composition API的使用,是优于Option ApI的。

image.png