持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 8 天,点击查看活动详情
背景
尤大为啥要开发 Vue3 呢?它比 Vue2 好在哪里?你为什么在项目中技术选型 Vue3,而不是 Vue2 呢?如果面试遇到这些问题,你答:因为 Vue3 很火,或者领导让用,或者别人在用... 那你面试基本凉凉了。
纵使是因为它的热度,引起了你去使用它,那你应该也要把它弄清楚。这样在使用中,遇到什么疑难杂症,你都能有更深度的思考能力去解决它。
Vue3 的优化点
总共大约 3 个大方面的优化:
- 源码优化
- 性能优化
- API优化
源码优化
目的是让代码更易于开发和维护。
- 更好的代码管理方式:monorepo
Vue2 源码结构:
- compiler(模板编译的相关代码)
- core(与平台无关的通用运行时代码)
- platforms(平台专有代码)
- server(服务端渲染的相关代码)
- sfc(.vue 单文件解析相关代码)
- shared(共享工具代码)
Vue3 源码结构:
Vue3 ,整个源码是通过 monorepo 的方式维护的,根据功能将不同的模块拆分到 packages 目录下不同的子目录中。
monorepo 把这些模块拆分到不同的 package 中,每个 package 有各自的 API、类型定义和测试。这样使得模块拆分更细化,职责划分更明确,模块之间的依赖关系也更加明确,开发人员也更容易阅读、理解和更改所有模块源码,提高代码的可维护性。
另外一些 package(比如 reactivity 响应式库)是可以独立于 Vue 使用的,这样用户如果只想使用 Vue3 的响应式能力,可以单独依赖这个响应式库而不用去依赖整个 Vue,减小了引用包的体积大小。
- 更超集的 JavaScript:TypeScript
TypeScript 提供了更好的类型检查,能支持复杂的类型推导;由于源码就使用 TypeScript 编写,也省去了单独维护 d.ts 文件的麻烦;就整个 TypeScript 的生态来看,TypeScript 团队也是越做越好,TypeScript 本身保持着一定频率的迭代和更新,支持的 feature 也越来越多。
性能优化
- 源码体积优化
- 移除一些冷门的 feature(比如 filter、inline-template 等)
- 引入 tree-shaking 的技术,减少打包体积
tree-shaking 依赖 ES2015 模块语法的静态结构(即 import 和 export),通过编译阶段的静态分析,找到没有引入的模块并打上标记。然后压缩阶段会利用例如 uglify-js、terser 等压缩工具真正地删除这些没有用到的代码。
- 数据劫持优化
Vue3 使用了 Proxy API 做数据劫持。Proxy API 并不能监听到内部深层次的对象变化,因此 Vue3 的处理方式是在 getter 中去递归响应式,这样的好处是真正访问到的内部对象才会变成响应式,而不是无脑递归,这样无疑也在很大程度上提升了性能。
- 编译优化
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。
- 逻辑组织优化
Composition API 是将某个逻辑关注点相关的代码全都放在一个函数里,这样当需要修改一个功能时,就不再需要在文件中跳来跳去。
- 逻辑复用优化
编写 hook 函数:
不会出现命名冲突的问题
有更好的类型支持,因为它们都是一些函数
hook > mixins
总结
Vue3 做了这么多改进,具体的实现原理和细节还是需要我们深究的,不仅为面试需要,因为百分百会深问,而且能更好的解决工作中可能遇到的问题和痛点,同时也能增加自己的认知和技术能力。