对比总览
优化项 | 对比项 | Vue 2 | Vue 3 |
---|---|---|---|
源码 | |||
源码管理 | Vue 2 的源码是作为一个整体的项目来管理 | vue3 整个源码是通过 monorepo 的方式维护的,根据功能将不同的模块拆分到 packages 目录下面不同的子目录中 |
|
TypeScript 支持 | Vue 2 对 TypeScript 的支持有限,需要额外的配置和类型定义。 Vue2 中使用 Flow 作为类型系统。 |
Vue 3 内置了对 TypeScript 的支持,提供了更好的类型推断和类型检查。 | |
性能 | |||
响应式系统 | Vue 2 使用的是基于 Object.defineProperty 的响应式系统,对于数组和对象的修改需要特定的方法来触发更新。Vue2 对深层嵌套对象初始化时遍历递归深度响应式 |
Vue 3 使用了 Proxy 对象来实现响应式系统,支持更深层次的响应式,无需特定方法来触发更新。 Vue3 对深层嵌套对象进行惰性响应式 |
|
体积优化 | 1. Vue 3 使用 tree-shaking 功能,减少了无用模块的打包,从而减小了整体的体积。 2.Vue3 移除一些不常用的 API |
||
编译优化 | 1.Proxy 惰性响应式 2.静态提升 3.静态节点标记 4.动态追踪 5.PatchFlag 标记 6.diff 双端比较的优化 7.使用 Block tree 8.事件监听缓存优化 |
||
语法 | |||
Composition API 和 Options API |
Vue 2 使用的是 Options API, 将逻辑分散在 data、methods、computed 等选项中。 |
Vue 3 引入了 Composition API, 允许更加灵活的组织和重用逻辑。 |
|
Hooks 和 Mixins | Vue2 通过 Mixins 复用代码,一个混入对象可以包含任意组件选项。mixins 会导致依赖关系不清晰 | 相比 Mxins,hooks 能实现更加清晰的逻辑复用,并避免命名冲突 | |
生命周期钩子 | Vue 2 提供了 beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed 等生命周期钩子。 | Vue 3 对生命周期钩子进行了重新设计,提供了 setup、onMounted、onUpdated、onUnmounted 等新的生命周期钩子,并移除了 beforeDestroy 和 destroyed。 | |
创建实例方式 | 使用 new Vue() 创建实例同一个 Vue 构造函数创建的每个根实例共享相同的全局配置,因此全局 API 影响所有 vue 实例。 |
使用 createApp() 工厂函数创建实例可以返回一个提供应用上下文的应用实例,不同的实例注册的组件无法在不同的实例下使用 |
|
组件注册 | 组件必须注册才能使用,分为全局和局部注册 | 全局注册、局部注册、使用 defineComponent 注册、<script setup> 中直接使用 setup 函数中定义的组件,而无需在 components 选项中显式注册 |
|
内置组件 | Vue3 支持模板下可以有多个根节点 引入了 <suspense> 组件和<teleport> 组件 |
||
模板语法 | Vue2组件只能有一个根节点 | Vue3 组件可以有多个根节点 | |
v-if 与 v-for 的优先级 |
Vue2 中 v-for 优先级大于 v-if | Vue3 中 v-if 优先级大于 v-for | |
About 45 min