Skip to content

Vue2 和 Vue3 的具体区别

响应式系统:defineProperty → Proxy

Vue2 使用 Object.defineProperty 逐个劫持对象属性,因此存在三个典型限制:新增属性无法自动感知(需要 $set)、数组下标修改无法直接感知(需要重写 7 个数组方法)、初始化阶段需要递归遍历所有属性(深层对象初始化成本较高)。

Vue3 改用 Proxy 后,响应式系统可以代理整个对象,新增/删除属性能够被自动拦截,数组下标修改也可以直接支持。同时 Vue3 采用懒代理策略,只有访问到深层属性时才继续代理其子属性,初始化成本更低。

API 风格:Options API → Composition API

Vue2 的 Options API 按 data、methods、computed 等功能选项组织代码。项目规模较小时这种结构很直观,但组件变复杂后,同一业务逻辑可能分散在 data、methods、watch、computed 等多个位置,阅读和重构成本都会增加。

Vue3 的 Composition API(setup / <script setup>)允许开发者按逻辑关注点组织代码。以数据请求逻辑为例,data、loading、error 和 fetch 方法可以集中维护在同一个组合函数或同一段逻辑中,完整逻辑链更容易被理解和复用。

生命周期变化

阶段Vue2Vue3(Composition API)
创建前beforeCreatesetup() 替代
创建后createdsetup() 替代
挂载前beforeMountonBeforeMount
挂载后mountedonMounted
更新前beforeUpdateonBeforeUpdate
更新后updatedonUpdated
销毁前beforeDestroyonBeforeUnmount
销毁后destroyedonUnmounted

Vue3 里 beforeCreatecreated 的作用完全被 setup() 取代,不再需要单独的钩子。

编译与性能优化

Vue3 在编译阶段引入了静态提升(静态节点提升到 render 函数外)、Patch Flag(标记动态部分)、Block Tree(将动态节点组织为独立结构,Diff 时跳过静态子树)。这些是 Vue2 不具备的编译层优化,也是 Vue3 在大型应用中更新性能更好的重要原因。

其他变化

  • Fragment:Vue3 组件可以有多个根节点,不再需要额外包裹一个无语义的 <div>
  • TypeScript:Vue3 使用 TS 重写核心代码,类型推导和 IDE 提示体验更好
  • Tree-shaking:Vue3 用 ES Module 输出,未使用的 API 打包时自动剔除
  • Teleport:新增组件,可以把内容渲染到 DOM 树的任意位置