优化器的核心功能是:在抽象语法树(AST)中识别出永不变化的节点,即静态子树,并对其进行标记。
- 静态节点:指在运行过程中内容不会改变的节点,在 AST 中通过 `static` 属性为 `true` 来标识。
- 静态子树:由静态节点构成的子树结构,整棵子树在后续更新中保持不变。
- 静态根节点:满足所有子节点均为静态节点,且自身父节点为动态节点的条件,在 AST 中以 `staticRoot` 属性为 `true` 表示。
优化器带来的优势包括:
1. 重新渲染时无需为静态子树创建新的 VNode;
2. 虚拟 DOM 的 diff 过程可以跳过这些子树,提升更新性能。
静态节点的标记过程:采用自上而下的递归方式。若某个节点被初步判定为静态,但其子节点中存在动态节点,则该节点也应被重新标记为动态,以确保准确性。
静态根节点的标记策略:同样通过自上而下递归查找,首次遇到的静态节点即视为潜在的静态根节点,随后停止向下遍历。但存在两种例外情况不进行标记:
1. 静态根节点的子节点仅为一个纯文本节点;
2. 该静态节点无任何子节点。
这两种情况因优化带来的收益极小,反而可能增加额外开销,故不予标记为静态根节点。
- 静态节点:指在运行过程中内容不会改变的节点,在 AST 中通过 `static` 属性为 `true` 来标识。
- 静态子树:由静态节点构成的子树结构,整棵子树在后续更新中保持不变。
- 静态根节点:满足所有子节点均为静态节点,且自身父节点为动态节点的条件,在 AST 中以 `staticRoot` 属性为 `true` 表示。
优化器带来的优势包括:
1. 重新渲染时无需为静态子树创建新的 VNode;
2. 虚拟 DOM 的 diff 过程可以跳过这些子树,提升更新性能。
静态节点的标记过程:采用自上而下的递归方式。若某个节点被初步判定为静态,但其子节点中存在动态节点,则该节点也应被重新标记为动态,以确保准确性。
静态根节点的标记策略:同样通过自上而下递归查找,首次遇到的静态节点即视为潜在的静态根节点,随后停止向下遍历。但存在两种例外情况不进行标记:
1. 静态根节点的子节点仅为一个纯文本节点;
2. 该静态节点无任何子节点。
这两种情况因优化带来的收益极小,反而可能增加额外开销,故不予标记为静态根节点。









