vue2 和 vue3 的核心区别
Vue3 是 Vue2 的重构升级版本,基于全新的架构设计,在性能、开发体验、语法规范、工程化等方面都有质的提升,以下是两者最核心的区别:
一、核心架构与设计理念
| 维度 | Vue2 | Vue3 |
|---|---|---|
| 源码实现 | 基于 Options API(选项式API) 设计,使用 Flow 进行类型检查 | 基于 Composition API(组合式API) 设计,完全使用 TypeScript 重构,架构更解耦 |
| 响应式原理 | 基于 Object.defineProperty() 实现 ✅ 缺点:无法监听对象新增/删除属性、无法监听数组下标修改 |
基于 ES6 Proxy 实现 ✅ 优点:可监听对象/数组的任意增删改查,性能更高,无边界限制 |
| 体积 | 全量打包体积较大,无法做到按需裁剪 | 支持 Tree-shaking(摇树优化),未使用的API会被剔除,打包体积更小(最小约10KB) |
二、核心API:写法与组织方式
1. Vue2:选项式 API (Options API)
- 写法:数据、方法、计算属性、生命周期分模块编写
- 缺点:代码逻辑分散,大型项目中维护复杂功能时,需要反复上下跳转代码
- 示例:
javascript
export default {
data() {
return { count: 0 };
},
methods: {
add() {
this.count++;
},
},
computed: {
double() {
return this.count * 2;
},
},
mounted() {
/* ... */
},
};
2. Vue3:组合式 API (Composition API)
- 写法:按业务逻辑组织代码,相关功能聚合在一起
- 优点:逻辑复用更方便、代码可读性和可维护性大幅提升,完美支持 TS
- 推荐写法:
<script setup>语法糖(简化代码,无需声明导出) - 示例:
vue
<script setup>
import { ref, computed, onMounted } from "vue";
const count = ref(0);
const add = () => count.value++;
const double = computed(() => count * 2);
onMounted(() => {
/* ... */
});
</script>
三、性能优化
- 渲染性能
- Vue3 重写了虚拟 DOM 和 Diff 算法,采用静态提升、补丁标记、事件缓存 等优化,渲染速度比 Vue2 快 50%~100%
- 内存占用
- 响应式系统更轻量化,内存占用降低约 30%
- 编译优化
- 编译阶段会区分静态节点和动态节点,只对动态节点做 Diff 比对,大幅减少渲染开销
四、生命周期函数
| 功能 | Vue2 选项式 | Vue3 组合式(setup) |
|---|---|---|
| 创建前 | beforeCreate | 不使用(直接用setup) |
| 创建后 | created | 不使用(直接用setup) |
| 挂载前 | beforeMount | onBeforeMount |
| 挂载完成 | mounted | onMounted |
| 更新前 | beforeUpdate | onBeforeUpdate |
| 更新完成 | updated | onUpdated |
| 销毁前 | beforeDestroy | onBeforeUnmount |
| 销毁完成 | destroyed | onUnmounted |
核心变化:Vue3 移除了
beforeCreate/created,用setup替代;销毁相关生命周期改名(destroy → unmount)
五、数据定义方式
1. Vue2
- 统一在
data()中定义响应式数据,通过this访问 - 对象/数组的响应式存在缺陷
2. Vue3
- 基础类型用
ref,对象/数组用reactive - 新增
toRefs、computed、watch等组合式响应式API - 无响应式边界问题,所有修改都能被监听
六、TypeScript 支持
- Vue2:天生对 TS 支持不友好,需要借助装饰器,类型推导不完善
- Vue3 :原生完美支持 TS,所有API都是TS编写,类型推导自动完成,无需额外配置
七、组件与功能增强
- Fragment(多根节点)
- Vue2:组件必须有唯一根节点
- Vue3:组件支持多个根节点,无需包裹一层无用div
- Teleport(传送门)
- 新特性:可将组件渲染到指定DOM节点(如弹窗、提示框)
- Suspense(异步组件)
- 新特性:支持异步组件加载中展示loading状态
- 自定义指令:API 统一化,更简洁易懂
八、全局API与配置
-
Vue2:挂载在
Vue构造函数上,全局污染javascriptVue.prototype.$http = axios; Vue.component(); -
Vue3:使用
createApp创建独立实例,避免全局污染javascriptimport { createApp } from "vue"; const app = createApp(App); app.config.globalProperties.$http = axios; app.component();
九、生态工具
| 工具 | Vue2 | Vue3 |
|---|---|---|
| 构建工具 | Vue CLI | Vite(极速启动,热更新更快) |
| 路由 | vue-router@3 | vue-router@4 |
| 状态管理 | Vuex@3 | Pinia(官方推荐,更简洁、支持TS) |
| UI库 | ElementUI、ViewUI | Element Plus、Ant Design Vue、Vuetify 3 |
总结
- 核心差异:Vue2 是选项式API + 旧响应式,Vue3 是组合式API + Proxy 响应式
- 优势:Vue3 体积更小、性能更强、TS 支持更好、大型项目维护更简单
- 选择建议:新项目直接用 Vue3 + Vite + Pinia;老项目可逐步迁移到 Vue3