Appearance
Vue3 对⽐ Vue2 的变化?
性能优化(更快):
使用了Proxy替代 Object.defineProperty 实现响应式。(为什么?defineProperty 需要对属性进行递归重写添加getter及setter 性能差,同时新增属性和删除属性时无法监控变化,需要$set、$delete 方法。此方法对数组劫持性能差,同时不支持 map 和 set 的数据结构。)
模板编译优化。给动态节点增添 PatchFlag 标记;对静态节点进行静态提升;对事件进行缓存处理等。
Diff 算法优化,全量 diff 算法中采用最长递增子序列减少节点的移动。在非全量 diff 算法中只比较动态节点,通过PatchFlag 标记更新动态的部分。
体积优化(更小):
Vue3 移除了不常用的 API,实现了按需引入,减少了打包后体积
- 移除 inline-template (Vue2 中就不推荐使用)
- $on、$off、$once (如果有需要可以采用 mitt 库来实现)
- 删除过滤器 (可以通过计算属性或者方法来实现)
- $children移除 (可以通过provide,inject方法构建$children)
- 移除.sync .native)修饰符 (.sync通过 v-model:xxx实现,.native为 Vue3 中的默认行为) 以及不在支持 keycode 作为v-on修饰符(@keyup.13 不在支持)
- 移除全局 API。Vue.component、Vue.use、Vue.directive (将这些 api 挂载到实例上)
- 通过构建工具 Tree-shaking 机制实现按需引入,减少用户打包后体积。
支持自定义渲染器:
用户可以自定义渲染 API 达到跨平台的目的。扩展能力更强,无需改造 Vue 源码。
TypeScript 支持:
Vue3 源码采用 Typescript 来进行重写 , 对 Ts 的支持更加友好。
源码结构变化:
Vue3 源码采用 monorepo 方式进行管理,将模块拆分到 package 目录中,解耦后可单独使用。