vue2 和 vue3 的核心区别

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>

三、性能优化

  1. 渲染性能
    • Vue3 重写了虚拟 DOM 和 Diff 算法,采用静态提升、补丁标记、事件缓存 等优化,渲染速度比 Vue2 快 50%~100%
  2. 内存占用
    • 响应式系统更轻量化,内存占用降低约 30%
  3. 编译优化
    • 编译阶段会区分静态节点和动态节点,只对动态节点做 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编写,类型推导自动完成,无需额外配置

七、组件与功能增强

  1. Fragment(多根节点)
    • Vue2:组件必须有唯一根节点
    • Vue3:组件支持多个根节点,无需包裹一层无用div
  2. Teleport(传送门)
    • 新特性:可将组件渲染到指定DOM节点(如弹窗、提示框)
  3. Suspense(异步组件)
    • 新特性:支持异步组件加载中展示loading状态
  4. 自定义指令:API 统一化,更简洁易懂

八、全局API与配置

  • Vue2:挂载在 Vue 构造函数上,全局污染

    javascript 复制代码
    Vue.prototype.$http = axios;
    Vue.component();
  • Vue3:使用 createApp 创建独立实例,避免全局污染

    javascript 复制代码
    import { 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

总结

  1. 核心差异:Vue2 是选项式API + 旧响应式,Vue3 是组合式API + Proxy 响应式
  2. 优势:Vue3 体积更小、性能更强、TS 支持更好、大型项目维护更简单
  3. 选择建议:新项目直接用 Vue3 + Vite + Pinia;老项目可逐步迁移到 Vue3
相关推荐
Frag0ut1 天前
【深度思考】前端基石的觉醒:探讨 HTML 语言的再进化方向
html5·前端开发·前端架构·大前端·webcomponents·技术趋势·浏览器api
Frag0ut2 天前
告别插件时代:HTML5 视频播放对比 Flash/Silverlight/ActiveX 的性能与技术优势解析
前端·html5·视频播放·flash·activex·流媒体技术·silverlight
只睡四小时8 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
我命由我123459 天前
CSS - CSS 媒体查询 orientation
前端·javascript·css·html·css3·html5·js
志尊宝9 天前
Vue3 零基础每日笔记(048):嵌套路由与命名视图——后台管理系统布局雏形
前端·javascript·vue.js·笔记·html5
志尊宝9 天前
Vue3 零基础每日笔记(052):路由常见坑一次排雷——404、刷新丢参数、部署白屏
前端·javascript·vue.js·笔记·html5
志尊宝11 天前
Vue3 零基础每日笔记(037):动手封装 useMouse 与 useWindowSize——事件监听的标准模板
前端·javascript·vue.js·笔记·html5
志尊宝11 天前
Vue3 零基础每日笔记(047):动态路由与路由参数——:id 传参、query 传参、props 解耦
前端·javascript·vue.js·笔记·html5
梦想的颜色12 天前
【AI科普】AI 时代,纯 H5+CSS PK React & Vue:前端技术孰优孰劣深入剖析
ai·前端框架·大模型·vue·react·html5·vibecoding
志尊宝13 天前
Vue3 零基础每日笔记(032):Suspense 与异步组件——懒加载与顶层 await 终极方案
前端·javascript·vue.js·笔记·html5