Vue 3 作为 Vue 2 的重大升级,在架构、性能和开发体验上有多项突破性改进。以下是两者的核心差异对比,帮助你快速掌握升级要点差异对比,帮助你快速掌握升级要点:
一、架构设计:从 Options API 到 Composition API
1. 代码组织方式彻底变革
javascript
// Vue 2: Options API(属性分散,逻辑碎片化)
export default {
data() {
return {
count: 0,
loading: false
}
},
methods: {
increment() { this.count++ },
fetchData() { /* ... */ }
},
mounted() { /* 初始化逻辑 */ }
}
// Vue 3: Composition API(逻辑聚合,关注点分离)
import { ref, onMounted } from 'vue'
export default {
setup() {
const count = ref(0)
const loading = ref(false)
const increment = () => count.value++
const fetchData = async () => { /* ... */ }
onMounted(() => { /* 初始化逻辑 */ })
return { count, increment }
}
}
核心优势:
- 解决大型组件中选项式 API 的代码碎片化问题
- 逻辑复用更自然(通过组合函数而非 mixins)
- 更好的类型推导支持(TypeScript 友好)
2. 生命周期钩子变化
| Vue 2 钩子 | Vue 3 等效钩子 |
|---|---|
beforeCreate | setup()(初始化前) |
created | setup()(初始化后) |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeDestroy | onBeforeUnmount |
destroyed | onUnmounted |
errorCaptured | onErrorCaptured |
二、性能提升:重写核心渲染机制
1. 虚拟 DOM 优化
-
静态提升(Static Hoisting):
javascript
// Vue 3 自动将不变的 DOM 节点提升到渲染函数外 const staticVNode = <div class="static">永远不变的内容</div> function render() { return <div>{staticVNode}{dynamicContent}</div> }- 减少重复创建相同 VNode 的开销
- 大型静态组件性能提升可达 2-3 倍
-
Patch Flag:
Vue 3 在编译时标记动态节点类型:html
预览
<!-- 编译后标记为仅文本更新 --> <div :id="id" class="fixed"> {{ text }} </div> <!-- 等价于 --> <div v-bind:id="id" class="fixed" patchFlag="TEXT"> {{ text }} </div>- 渲染时仅检查标记的动态部分
- 动态绑定元素性能提升约 1.3-2 倍
2. 响应式系统升级
javascript
// Vue 2: 基于 Object.defineProperty
const obj = { count: 0 }
Object.defineProperty(obj, 'count', {
get() { /* ... */ },
set() { /* ... */ }
})
// Vue 3: 基于 Proxy
const obj = reactive({ count: 0 })
const proxy = new Proxy(obj, {
get(target, key) { /* ... */ },
set(target, key, value) { /* ... */ }
})
优势:
- 支持深层次响应式(无需
Vue.set) - 支持新的 ES6 数据结构(Map、Set 等)
- 响应式创建性能提升约 1.5-2 倍
三、开发体验增强
1. 组合式 API 函数
javascript
// 自定义组合函数(逻辑复用)
import { ref, onMounted } from 'vue'
export function useFetch(url) {
const data = ref(null)
const error = ref(null)
const loading = ref(true)
const fetchData = async () => {
try {
const response = await fetch(url)
data.value = await response.json()
} catch (err) {
error.value = err
} finally {
loading.value = false
}
}
onMounted(fetchData)
return { data, error, loading }
}
使用方式:
javascript
export default {
setup() {
const { data, loading } = useFetch('/api/data')
return { data, loading }
}
}
2. Teleport(传送门)组件
vue
<!-- 将模态框渲染到 body 下 -->
<teleport to="body">
<div v-if="showModal" class="modal">
<!-- 模态框内容 -->
</div>
</teleport>
- 解决组件层级嵌套过深导致的样式隔离问题
- 替代 Vue 2 中的 PortalVue 等第三方库
3. Suspense 异步组件
vue
<template>
<Suspense>
<!-- 主要内容 -->
<template #default>
<AsyncComponent />
</template>
<!-- 加载状态 -->
<template #fallback>
<div>Loading...</div>
</template>
</Suspense>
</template>
- 自动处理异步组件加载状态
- 与 Vue Router 和 Vuex/Pinia 无缝集成
四、API 变化与移除
1. 全局 API 修改
javascript
// Vue 2: 全局配置
import Vue from 'vue'
Vue.config.productionTip = false
Vue.prototype.$http = axios
// Vue 3: 创建应用实例配置
import { createApp } from 'vue'
const app = createApp(App)
app.config.globalProperties.$http = axios
app.provide('key', 'value')
2. 移除的 API
| 移除项 | 替代方案 |
|---|---|
filter | 改用计算属性或方法 |
$children | 改用 ref 或事件通信 |
$on, $off, $once | 改用事件总线或 mitt 库 |
inline-template | 改用 template 选项或单文件组件 |
functional components | 改用普通组件或组合式 API 函数 |
五、生态系统与工具
1. 状态管理:Pinia 替代 Vuex
javascript
// Pinia 示例
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
state: () => ({
name: 'John',
age: 30
}),
actions: {
incrementAge() {
this.age++
}
}
})
- 更简洁的 API(无需 mutations)
- 完整的 TypeScript 支持
- 更小的包体积(~1.6kb)
2. 工具链升级
- Vue CLI → Vite:冷启动速度提升 10-100 倍
- Vue Router 4:支持 Composition API
- Vue Test Utils 2:全面支持 Vue 3
六、升级策略与兼容性
1. 渐进式升级方案
-
Vue 2.7(Bridge 版本):
- 包含 Composition API
- 兼容 Vue 3 大多数特性
- 为升级做准备的过渡版本
-
Vue CLI 项目升级:
bash
# 安装升级工具 npm install -g @vue/cli-plugin-upgrade # 执行升级检查 vue upgrade --next
2. 不兼容的主要变更
- 自定义指令 API 变更
- 渲染函数 API 完全重写
- 插件机制变更(
install方法参数不同) - 过滤器(filter)被移除
七、如何选择?
| 场景 | Vue 2 | Vue 3 |
|---|---|---|
| 新项目 | 非必要不选择 | ✅ 推荐(长期支持) |
| 旧项目维护 | ✅ 继续使用 | 考虑渐进式升级 |
| TypeScript 项目 | 需要额外配置 | ✅ 原生支持 |
| 大型复杂应用 | 可能面临逻辑碎片化 | ✅ Composition API 更优 |
| 性能敏感场景 | 有一定瓶颈 | ✅ 虚拟 DOM 优化显著 |
Vue 3 在保持与 Vue 2 核心概念兼容的同时,通过 Composition API、性能优化和开发体验的提升,为大型应用和复杂场景提供了更强大的支持。建议新项目优先选择 Vue 3,旧项目可根据实际情况逐步升级或采用混合模式。

被折叠的 条评论
为什么被折叠?



