Vue2 与 Vue3 对比:从 Options API 到 Composition API 的演进

Vue2 与 Vue3 对比:从 Options API 到 Composition API 的演进

前言

Vue 3 自 2020 年正式发布以来,在性能、开发体验和生态上都有显著提升。本文从 API 设计、响应式原理、性能优化等维度对比 Vue 2 与 Vue 3,帮助开发者理解升级带来的变化,并为项目迁移提供参考。

一、API 风格对比

1.1 Options API vs Composition API

Vue 2 采用 Options API,将 datamethodscomputed 等按选项分类组织:

javascript 复制代码
// Vue 2 - Options API
export default {
  data() {
    return {
      count: 0,
      message: 'Hello'
    }
  },
  methods: {
    increment() {
      this.count++
    }
  },
  computed: {
    doubleCount() {
      return this.count * 2
    }
  }
}

Vue 3 引入 Composition API,通过 setup<script setup> 将相关逻辑聚合在一起:

javascript 复制代码
// Vue 3 - Composition API
<script setup>
import { ref, computed } from 'vue'

const count = ref(0)
const message = ref('Hello')

const increment = () => {
  count.value++
}

const doubleCount = computed(() => count.value * 2)
</script>

Composition API 的优势在于逻辑复用更灵活,可以抽取成可复用的组合式函数(Composables)。

1.2 生命周期映射

Vue 2 Vue 3 (Composition API)
beforeCreate setup()
created setup()
beforeMount onBeforeMount
mounted onMounted
beforeUpdate onBeforeUpdate
updated onUpdated
beforeDestroy onBeforeUnmount
destroyed onUnmounted

二、响应式系统

2.1 实现原理差异

Vue 2 使用 Object.defineProperty 实现响应式,存在以下限制:

  • 无法检测新增/删除的属性,需使用 Vue.set / this.$delete
  • 无法监听数组索引和 length 变化
  • 初始化时需递归遍历所有属性,性能开销较大
javascript 复制代码
// Vue 2 无法响应
this.obj.newProp = 'value'  // 不会触发更新
this.$set(this.obj, 'newProp', 'value')  // 需手动处理

Vue 3 采用 Proxy 实现响应式:

  • 可监听属性的新增、删除
  • 支持 Map、Set、WeakMap、WeakSet
  • 懒代理,按需收集依赖,性能更好
javascript 复制代码
// Vue 3 天然支持
const state = reactive({ count: 0 })
state.newProp = 'value'  // 自动响应

2.2 ref 与 reactive

Vue 3 提供两种响应式引用方式:

  • ref :适用于基本类型,通过 .value 访问
  • reactive :适用于对象,直接解构会丢失响应性,需配合 toRefs
javascript 复制代码
const count = ref(0)
count.value++  // 正确

const state = reactive({ name: 'Vue' })
const { name } = toRefs(state)  // 保持响应性

三、性能与体积

指标 Vue 2 Vue 3
打包体积 约 63KB (gzip) 约 34KB (gzip),减少约 41%
初始渲染 基准 快约 1.3~2 倍
更新性能 基准 快约 1.3~2 倍
内存占用 基准 减少约 50%

Vue 3 通过 Tree-shaking、静态提升、预字符串化等编译优化,以及重写的虚拟 DOM diff 算法,显著提升了运行时性能。

四、新特性与改进

4.1 Teleport(传送门)

Vue 3 内置 Teleport,可将组件渲染到 DOM 其他位置,常用于 Modal、Toast 等:

vue 复制代码
<template>
  <Teleport to="body">
    <div class="modal">弹窗内容</div>
  </Teleport>
</template>

4.2 多根节点(Fragment)

Vue 2 要求单根节点,Vue 3 支持多根节点:

vue 复制代码
<!-- Vue 3 合法 -->
<template>
  <header>头部</header>
  <main>主体</main>
  <footer>底部</footer>
</template>

4.3 TypeScript 支持

Vue 3 使用 TypeScript 重写,类型推导更完善,对 TS 项目更友好。

五、迁移建议

  1. 新项目 :直接使用 Vue 3 + Composition API + <script setup>
  2. 老项目:可渐进式迁移,Vue 2.7 已支持部分 Composition API
  3. 生态:Vue Router 4、Pinia(替代 Vuex)与 Vue 3 配套使用

总结

Vue 3 在响应式、性能、开发体验上全面升级,Composition API 让逻辑复用更自然。对于新项目,建议直接采用 Vue 3;老项目可根据业务优先级制定迁移计划。理解两者差异,有助于在技术选型和升级时做出更合理的决策。

参考资料

相关推荐
巫山老妖1 小时前
用 OpenClaw 每日自动发布 AI 速递:微信公众号 + 小红书全流程实操
前端
兆子龙2 小时前
V8 与 JavaScript 执行:从字节码、Ignition 到 TurboFan JIT 的完整管线
前端
xiaoye37082 小时前
java后端面试一般问什么?
java·面试
CHU7290352 小时前
家政同城服务APP前端功能玩法解析
前端·小程序
UrbanJazzerati2 小时前
从“加载中”到完整下载:破解PDF异步加载与反爬的完整指南
后端·面试
兆子龙2 小时前
React Fiber 调度器源码解析:从 workLoop 到 commit 的完整渲染链路
前端·javascript
LQE2 小时前
Vue 2 vs Vue 3:全面对比指南
前端
用户350144817922 小时前
数据对比中的”平等性原则“
前端
yuki_uix2 小时前
从扁平到层级:树形数据转换的工程化实践与设计哲学
前端·javascript