📚前端面试题速记
Q23

Vue 3.0 性能提升主要体现在哪里?

速记答案(30 秒)

Proxy 响应式更快、更少边界问题。编译优化:静态提升、Patch Flag、更好的 diff。更小体积:按模块拆分 + tree-shaking。更优渲染:Fragment、Teleport、更高效的事件处理。

📖 详细讲解

标准面试回答(推荐记住)

Vue 3 性能提升来自多个方面:Proxy 代替 defineProperty,初始化更快,原生支持新增属性;编译时做静态提升、生成 Patch Flag 指导运行时 diff;代码按模块拆分支持 tree-shaking 减小包体积;新特性如 Fragment 减少无意义节点、Teleport 优化弹窗渲染等。

优化点详解

  1. 响应式系统升级 (Proxy)

    • 移除递归遍历,改为懒代理,初始化速度大幅提升。
    • 内存占用减半。
  2. 编译时优化 (Compile-time Optimizations)

    • Static Hoisting: 静态节点提升。
    • PatchFlags: 标记动态内容,Diff 时只比对变化部分。
    • Block Tree: 收集动态子节点,跳过静态层级遍历。
  3. 源码体积 (Tree-shaking)

    • 核心 API 全部模块化 (createApp, ref, computed),未使用的功能不会打包。
    • 移除了冷门特性 (filter, inline-template)。
  4. SSR 优化

    • 字符串拼接代替 VNode 创建,大幅提升服务端渲染性能。

面试要点

  • 理解各项优化的原理
  • 知道 Patch Flag 的作用
  • 能解释 tree-shaking 的好处

💻 代码示例

编译优化示例
// 静态提升 - 静态节点只创建一次
const _hoisted_1 = { class: "static" }
const _hoisted_2 = createVNode("span", null, "Static Text")

function render() {
  return createVNode("div", _hoisted_1, [
    _hoisted_2,  // 复用静态节点
    createVNode("span", null, toDisplayString(dynamic), 1 /* TEXT */)
  ])
}

// Patch Flag 标记动态内容
// 1 = TEXT (文本变化)
// 2 = CLASS (class 变化)
// 4 = STYLE (style 变化)
// 8 = PROPS (props 变化)
// 32 = HYDRATE_EVENTS (事件)