Vue 3 的编译器非常智能,它能在编译阶段分析出哪些是静态的,哪些是动态的,从而生成极致优化的渲染函数。
编译器会给动态节点打上数字标记。
TEXT = 1 (只有文本动态)CLASS = 2 (只有 Class 动态)PROPS = 8 (只有 Props 动态)
Diff 阶段:运行时看到这个标记,就只对比变动的部分(如只比 text),完全跳过其他属性的对比。如果一个节点是纯静态的(如 <h2>Title</h2>),它会被提升到 render 函数之外。
@click="onClick" 默认会被视为动态属性。
开启缓存后,编译器会生成一个内联函数包裹 onClick,只要函数逻辑没变,diff 时就认为这个 prop 没变,避免不必要的组件更新。
Vue 3 引入了 Block 概念。 Block 会收集内部所有的动态子节点。 Diff 时,不再递归遍历整棵树,而是直接遍历这个扁平的动态节点数组。 结论:Vue 3 的 Diff 性能只跟动态节点的数量有关,跟模板整体大小无关。
v-once。