基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

Vue 3 相比 Vue 2 有哪些主要改进?

知识点图片

Vue 3 相比 Vue 2 是一次全面的重写和升级,主要改进集中在性能提升代码组织能力(Composition API)TypeScript 支持以及底层架构上。

以下是 Vue 3 的核心改进点总结:

1. 组合式 API (Composition API) —— 最核心的改变

这是 Vue 3 最显著的特性。

  • Vue 2 (Options API): 代码按选项组织(data, methods, computed, watch)。当组件变得复杂时,同一个功能的逻辑(如“搜索功能”)会分散在文件的不同位置,导致代码难以阅读和维护。
  • Vue 3 (Composition API): 引入了 setup()refreactive 等。允许开发者根据逻辑功能来组织代码。
    • 优势: 更好的逻辑复用(取代了 Mixins,使用 Composable 函数),代码更易于阅读和重构,对类型推导更友好。
    • 注:Vue 3 依然完全兼容 Vue 2 的 Options API。

2. 响应式系统的重构 (Proxy vs Object.defineProperty)

Vue 3 替换了底层的响应式引擎。

  • Vue 2: 使用 Object.defineProperty
    • 缺陷: 无法检测对象属性的添加/删除;无法检测数组通过下标修改的变化(需要使用 Vue.set$set)。
  • Vue 3: 使用 ES6 的 Proxy
    • 改进: 可以直接监听对象和数组的任何变化(包括新增属性和下标修改),不再需要 $set。性能更好,且支持 Map、Set 等数据结构。

3. 性能大幅提升

Vue 3 在运行速度和打包体积上都有显著优化:

  • Diff 算法优化 (Patch Flags): Vue 2 对虚拟 DOM 进行全量对比;Vue 3 在编译阶段会标记动态节点(Patch Flags),更新时只对比带有标记的节点,大大减少了比对工作量。
  • 静态提升 (Static Hoisting): 静态节点(永远不会变的 HTML)会被提升到渲染函数之外,只创建一次,更新时直接复用,不再重新创建。
  • 事件侦听器缓存: 缓存事件处理函数,避免不必要的组件更新。
  • SSR 性能: 服务端渲染速度提升了 2-3 倍。

4. 更小的打包体积 (Tree-shaking)

  • Vue 3 的设计更加模块化。许多 API(如 nextTick, computed, transition 等)都变成了具名导出。
  • 这意味着如果你没有使用某个特性,打包工具(如 Webpack 或 Vite)可以将其从最终代码中移除(Tree-shaking),从而减小库的体积。

5. 更好的 TypeScript 支持

  • Vue 2: TypeScript 支持是后来加上的,往往需要使用 Class Component 或复杂的装饰器,类型推导体验一般。
  • Vue 3: 源码完全使用 TypeScript 重写。这意味着 Vue 3 原生具备极好的类型推导能力,在 IDE 中有更好的智能提示,且不需要为了 TS 而强行改变代码写法。

6. 新的内置组件和特性

Vue 3 引入了一些 React 开发者可能熟悉的新概念:

  • Fragment (片段): 组件不再强制要求必须有一个单一的根节点。<template> 下可以有多个平级的标签,减少了无意义的 div 包裹。
  • Teleport (传送门): 允许将组件的 DOM 结构渲染到该组件层级之外的地方(例如将模态框 Modal 直接渲染到 body 标签下,避免 CSS z-index 层级问题)。
  • Suspense (实验性): 用于处理异步组件的加载状态(如在数据加载完成前显示骨架屏)。

7. 其他细节变更

  • 生命周期钩子重命名: 为了配合 Composition API,钩子名称发生了变化(例如 destroyed 变为 onUnmountedbeforeDestroy 变为 onBeforeUnmount)。
  • v-model 升级:
    • prop 和 event 默认名称更改(value -> modelValue, input -> update:modelValue)。
    • 支持在同一个组件上使用多个 v-model
  • 全局 API 调整: new Vue() 变为 createApp(),避免了全局配置(如 mixins, plugins)污染不同的 Vue 实例。

总结

Vue 3 更快、更小、更易于维护,且对 TypeScript 非常友好。

如果是新项目,强烈建议直接使用 Vue 3 + Vite + Pinia(Vuex 的替代者)。如果是老项目,Vue 2.7 移植了部分 Vue 3 的特性(如 Composition API),可以作为过渡。

00:00
00:00