一、核心架构改进
-
响应式系统
- Vue2:使用
Object.defineProperty
实现数据劫持,对对象属性递归遍历。- 局限:无法检测对象属性的新增/删除(需用
Vue.set
/Vue.delete
),对数组的某些方法(如通过索引修改)需特殊处理。
- 局限:无法检测对象属性的新增/删除(需用
- Vue3:改用 Proxy 代理对象,支持动态监听属性和数组变化。
- 优势:无需特殊 API 处理新增/删除属性,性能更好,支持更多数据结构(如
Map
、Set
)。
- 优势:无需特殊 API 处理新增/删除属性,性能更好,支持更多数据结构(如
- Vue2:使用
-
虚拟 DOM 优化
- Vue3 引入 Patch Flag:
- 编译时标记动态节点类型(如文本、class、props),减少运行时比对复杂度。
- 静态提升(Hoist Static):将静态节点提升到渲染函数外,避免重复创建。
- Vue2:全量 Diff,性能较低。
- Vue3 引入 Patch Flag:
二、Composition API
- Vue2:基于 Options API(
data
,methods
,computed
分块),逻辑分散。 - Vue3:新增 Composition API(
setup
函数 +ref
/reactive
):- 优势:逻辑按功能组织,便于复用(替代 Mixins),更好的 TypeScript 支持。
// Vue3 示例 import { ref, computed } from 'vue'; export default { setup() { const count = ref(0); const double = computed(() => count.value * 2); return { count, double }; } }
三、性能优化
- 打包体积
- Vue3 支持 Tree-shaking(按需引入 API),核心库体积从 ~20KB(Vue2)减少到 ~10KB。
- 渲染性能
- Vue3 通过编译优化(如 Block Tree、缓存事件处理函数)减少 30%-50% 的运行时开销。
- SSR 优化
- Vue3 服务端渲染性能提升 2-3 倍。
四、其他关键变化
- 生命周期
- 移除
beforeCreate
和created
(由setup
替代),destroyed
改为unmounted
。 - 新增
onBeforeUnmount
、onRenderTracked
等钩子。
- 移除
- Fragment 支持
- Vue3 允许组件有多个根节点(Vue2 需单根)。
- Teleport 组件
- 将子组件渲染到 DOM 任意位置(如模态框)。
- Suspense 组件
- 支持异步组件加载状态管理。
- TypeScript 支持
- Vue3 源码用 TypeScript 重写,提供更好的类型推断。
五、破坏性变更
- 移除过滤器(Filter)
- 建议用计算属性或方法替代。
- 事件总线(Event Bus)弃用
- 推荐使用
mitt
等第三方库。
- 推荐使用
- 全局 API 修改
Vue.createApp()
替代new Vue()
,避免全局污染。
六、总结
- 响应式系统:Proxy 替代 Object.defineProperty,支持更多数据结构和动态属性。
- 开发模式:Composition API 解决逻辑复用问题,优于 Options API 和 Mixins。
- 性能:Tree-shaking、虚拟 DOM 优化、SSR 提升。
- 生态:更好的 TypeScript 支持,新组件(Teleport/Suspense)。
适用场景:
- 新项目:优先选择 Vue3。
- 老项目迁移:需评估兼容性(官方提供迁移工具
@vue/compat
)。
通过对比,Vue3 在性能、开发体验和扩展性上均有显著提升,是现代化的前端框架选择。