Vue 2 和 Vue 3 的区别

一句话定义:Vue 3 是对 Vue 2 的一次彻底重构。它在保留声明式编程的基础上,通过 Proxy 响应式Composition API 解决了复杂逻辑复用难、底层性能瓶颈等痛点。


1. 为什么需要 Vue 3?(痛点解决)

  • 逻辑碎片化:Vue 2 的 Options API(选项式)让一个功能的代码散落在 datamethodswatch 中,项目大了像找零件一样痛苦。
  • 响应式局限:Vue 2 无法监听对象新增属性和数组下标修改,不得不发明 $set 这种“补丁”。
  • 类型支持:Vue 2 对 TypeScript 的支持是“强扭的瓜”,Vue 3 用 TS 重写,原生支持极佳。

2. 核心差异对比

维度Vue 2.x (旧方案)Vue 3.x (新方案)
响应式核心Object.defineProperty (深度遍历属性)Proxy (代理整个对象)
代码组织Options API: 强制把逻辑按“类型”拆分Composition API: 按“功能单元”组织代码
虚拟 DOM全量 Diff: 数据变了,所有节点比一遍静态提升 + Patch Flag: 只对比动态节点
多根节点不支持 (必须有一个 <div> 包裹)Fragment: 支持多个根节点

3. Vue 3 的优势

  • 更好的性能Proxy 性能优于 defineProperty,且初始化速度更快。
  • Tree-shaking (摇树优化):Vue 3 把很多功能(如 watch, computed)改成了按需引入。没用到的功能在打包时会被自动剔除,体积更小。
  • 组合式 API (setup):逻辑复用极其方便(类似 React Hooks),不再需要冗余的 mixins

4. 局限性与挑战

  • 兼容性Proxy 是 ES6 特性,不支持 IE11(这也是很多老项目不敢升 Vue 3 的主因)。
  • 学习成本refreactive 的心智负担,新手容易混淆什么时候该加 .value
  • 生态迁移:虽然现在已经成熟,但早期很多老插件不支持 Vue 3。

面试真题:大厂高频考点

Q1:Proxy vs Object.defineProperty 的本质区别?

  • defineProperty:只能劫持已有的属性。如果对象嵌套很深,需要递归遍历到底,性能开销大。
  • Proxy:代理的是整个对象。哪怕你动态加了 100 个属性,它都能拦截到。此外,它还能拦截数组下标变化、delete 操作等。

Q2:setup 的作用与优势?

  • setup 是 Composition API 的入口。
  • 逻辑复用:解决了 Mixins 命名冲突 and 来源不明的问题。
  • 组织清晰:让代码逻辑可以像积木一样抽离成独立的函数(Hooks),在不同组件间灵活组合。

Q3:Tree-shaking 如何减少未使用代码?

  • Vue 2 的很多全局 API 是挂载在 Vue 原型上的,不管你用不用都会被打进包里。
  • Vue 3 改成了 ES Modules (import/export) 导出方式。编译器在打包时会分析依赖树,没被 import 的代码会被标记为“死代码”并剔除,从而显著减小首屏加载体积。
Vue 响应式系统高频面试关键词
Ajax, Fetch 与 Axios 核心对比
Valaxy v0.28.0-beta.1 驱动|主题-Yunv0.28.0-beta.1