"Vue 3 有时占用的 CPU 时间不到 Vue 2 的十分之一。"
本文带你拆解 Vue 3 在渲染性能、包体体积和内存占用三大维度的提速秘诀。
一、渲染更快
1.DOM 树级优化------砍掉整棵树的递归
Vue 2 的 Diff 以"递归+双指针"遍历整棵虚拟 DOM,哪怕节点结构从未变化。
Vue 3 引入 Block Tree:
-
编译期把模板标记为静态或动态两种节点;
-
运行时只追踪动态节点的扁平数组,Diff 时按索引线性比对,复杂度从 O(n) 降到 O(d),d 为动态节点数量。
若模板没有
v-if
、v-for
等结构指令,则整棵树被视为静态,直接跳过遍历。
2.静态提升------把不变的部分搬到渲染函数外
编译器会检测出纯静态的节点、属性或对象,提升到渲染函数作用域外,变成常量。
渲染函数每次执行时不再重新创建这些对象,显著降低内存分配压力和垃圾回收频率。
3.元素级优化------PatchFlag 精准更新
每个动态节点携带一个 PatchFlag 位标记:
- 1 表示仅文本变化;
- 2 表示仅 class 变化;
- 4 表示仅 style 变化;
- ...
运行时根据标记走专用快速路径,避免全量属性比对。
例如,只有一个动态 class 的 <div>
会触发 单次 className 赋值 而非遍历所有属性。
二、包体更小
从"全家桶"到"模块化"
Vue 3 所有 API 均以 ES Module 导出,配合 Rollup / Webpack 的 Tree-Shaking,未使用的功能在构建时被剪除。
举例:若项目未使用 <transition>
,则相关代码不会进入最终 bundle。
体积对比
-
仅运行时:
vue.runtime.esm-bundler.js
13 KB gzip -
完整功能(含响应式、编译器、内置组件)23 KB gzip
相比 Vue 2 的 20-30 KB 起步,官方数据给出 整体缩小 41%。
三、内存更省
-
Proxy 替代 defineProperty:
不再需要递归劫持每个属性,而是在访问时动态创建依赖,减少初始化内存峰值。
-
WeakMap 跟踪依赖:
组件卸载时,响应式系统通过 WeakMap 自动释放,降低内存泄漏风险。
官方基准测试显示,内存占用下降 54%。
四、综合收益:官方基准数据
- 初次渲染速度 ↑55%
- 更新渲染速度 ↑133%
- 包体大小 ↓41%
- 内存占用 ↓54%