Vue 3 相比 Vue 2 有哪些主要改进?
Vue 3 相比 Vue 2 是一次全面的重写和升级,主要改进集中在性能提升、代码组织能力(Composition API)、TypeScript 支持以及底层架构上。
以下是 Vue 3 的核心改进点总结:
1. 组合式 API (Composition API) —— 最核心的改变
这是 Vue 3 最显著的特性。
- Vue 2 (Options API): 代码按选项组织(
data,methods,computed,watch)。当组件变得复杂时,同一个功能的逻辑(如“搜索功能”)会分散在文件的不同位置,导致代码难以阅读和维护。 - Vue 3 (Composition API): 引入了
setup()、ref、reactive等。允许开发者根据逻辑功能来组织代码。- 优势: 更好的逻辑复用(取代了 Mixins,使用 Composable 函数),代码更易于阅读和重构,对类型推导更友好。
- 注:Vue 3 依然完全兼容 Vue 2 的 Options API。
2. 响应式系统的重构 (Proxy vs Object.defineProperty)
Vue 3 替换了底层的响应式引擎。
- Vue 2: 使用
Object.defineProperty。- 缺陷: 无法检测对象属性的添加/删除;无法检测数组通过下标修改的变化(需要使用
Vue.set或$set)。
- 缺陷: 无法检测对象属性的添加/删除;无法检测数组通过下标修改的变化(需要使用
- Vue 3: 使用 ES6 的
Proxy。- 改进: 可以直接监听对象和数组的任何变化(包括新增属性和下标修改),不再需要
$set。性能更好,且支持 Map、Set 等数据结构。
- 改进: 可以直接监听对象和数组的任何变化(包括新增属性和下标修改),不再需要
3. 性能大幅提升
Vue 3 在运行速度和打包体积上都有显著优化:
- Diff 算法优化 (Patch Flags): Vue 2 对虚拟 DOM 进行全量对比;Vue 3 在编译阶段会标记动态节点(Patch Flags),更新时只对比带有标记的节点,大大减少了比对工作量。
- 静态提升 (Static Hoisting): 静态节点(永远不会变的 HTML)会被提升到渲染函数之外,只创建一次,更新时直接复用,不再重新创建。
- 事件侦听器缓存: 缓存事件处理函数,避免不必要的组件更新。
- SSR 性能: 服务端渲染速度提升了 2-3 倍。
4. 更小的打包体积 (Tree-shaking)
- Vue 3 的设计更加模块化。许多 API(如
nextTick,computed,transition等)都变成了具名导出。 - 这意味着如果你没有使用某个特性,打包工具(如 Webpack 或 Vite)可以将其从最终代码中移除(Tree-shaking),从而减小库的体积。
5. 更好的 TypeScript 支持
- Vue 2: TypeScript 支持是后来加上的,往往需要使用 Class Component 或复杂的装饰器,类型推导体验一般。
- Vue 3: 源码完全使用 TypeScript 重写。这意味着 Vue 3 原生具备极好的类型推导能力,在 IDE 中有更好的智能提示,且不需要为了 TS 而强行改变代码写法。
6. 新的内置组件和特性
Vue 3 引入了一些 React 开发者可能熟悉的新概念:
- Fragment (片段): 组件不再强制要求必须有一个单一的根节点。
<template>下可以有多个平级的标签,减少了无意义的div包裹。 - Teleport (传送门): 允许将组件的 DOM 结构渲染到该组件层级之外的地方(例如将模态框 Modal 直接渲染到
body标签下,避免 CSSz-index层级问题)。 - Suspense (实验性): 用于处理异步组件的加载状态(如在数据加载完成前显示骨架屏)。
7. 其他细节变更
- 生命周期钩子重命名: 为了配合 Composition API,钩子名称发生了变化(例如
destroyed变为onUnmounted,beforeDestroy变为onBeforeUnmount)。 - v-model 升级:
- prop 和 event 默认名称更改(
value->modelValue,input->update:modelValue)。 - 支持在同一个组件上使用多个
v-model。
- prop 和 event 默认名称更改(
- 全局 API 调整:
new Vue()变为createApp(),避免了全局配置(如 mixins, plugins)污染不同的 Vue 实例。
总结
Vue 3 更快、更小、更易于维护,且对 TypeScript 非常友好。
如果是新项目,强烈建议直接使用 Vue 3 + Vite + Pinia(Vuex 的替代者)。如果是老项目,Vue 2.7 移植了部分 Vue 3 的特性(如 Composition API),可以作为过渡。