developer-plus / interview

https://interview.developer-plus.org
MIT License
9 stars 1 forks source link

讲一下 Vue2 和 Vue3 的区别? #15

Open Hongbusi opened 2 years ago

RainyNight9 commented 2 years ago

区别主要体现在优化点上。

Vue3 对比 Vue2 的优化点

总共大约 3 个大方面的优化:

  1. 源码优化
  2. 性能优化
  3. API优化

源码优化

目的是让代码更易于开发和维护。

  1. 更好的代码管理方式:monorepo

Vue2 源码结构:

image.png

Vue3 源码结构:

image.png

Vue3 ,整个源码是通过 monorepo 的方式维护的,根据功能将不同的模块拆分到 packages 目录下不同的子目录中。

monorepo 把这些模块拆分到不同的 package 中,每个 package 有各自的 API、类型定义和测试。这样使得模块拆分更细化,职责划分更明确,模块之间的依赖关系也更加明确,开发人员也更容易阅读、理解和更改所有模块源码,提高代码的可维护性。

另外一些 package(比如 reactivity 响应式库)是可以独立于 Vue 使用的,这样用户如果只想使用 Vue3 的响应式能力,可以单独依赖这个响应式库而不用去依赖整个 Vue,减小了引用包的体积大小。

  1. 更超集的 JavaScript:TypeScript

TypeScript 提供了更好的类型检查,能支持复杂的类型推导;由于源码就使用 TypeScript 编写,也省去了单独维护 d.ts 文件的麻烦;就整个 TypeScript 的生态来看,TypeScript 团队也是越做越好,TypeScript 本身保持着一定频率的迭代和更新,支持的 feature 也越来越多。

性能优化

  1. 源码体积优化

tree-shaking 依赖 ES2015 模块语法的静态结构(即 import 和 export),通过编译阶段的静态分析,找到没有引入的模块并打上标记。然后压缩阶段会利用例如 uglify-js、terser 等压缩工具真正地删除这些没有用到的代码。

  1. 数据劫持优化

Vue3 使用了 Proxy API 做数据劫持。Proxy API 并不能监听到内部深层次的对象变化,因此 Vue3 的处理方式是在 getter 中去递归响应式,这样的好处是真正访问到的内部对象才会变成响应式,而不是无脑递归,这样无疑也在很大程度上提升了性能。

  1. 编译优化

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

Vue3 在编译阶段还包含了对 Slot 的编译优化、事件侦听函数的缓存优化,并且在运行时重写了 diff 算法。

API 优化

Composition API VS Options API

Composition API 属于 API 的增强,它并不是 Vue3 组件开发的范式,如果你的组件足够简单,你还是可以使用 Options API。

  1. 逻辑组织优化

image.png

Composition API 是将某个逻辑关注点相关的代码全都放在一个函数里,这样当需要修改一个功能时,就不再需要在文件中跳来跳去。

  1. 逻辑复用优化

编写 hook 函数:

不会出现命名冲突的问题
有更好的类型支持,因为它们都是一些函数

hook > mixins