深入解析React Diff 算法
Diff 算法是前端框架中用于高效更新DOM的核心算法,它通过比较虚拟DOM树的变化,计算出最小更新操作集,从而大幅提升应用性能。
一、Diff算法基础概念
1、为什么需要Diff算法
- DOM操作成本高: 直接操作DOM会导致重排重绘,性能开销大
- 状态驱动视图: 现代前端架构采用状态 → 视图的编程模式
- 最小变更原则: 只更新变化的部分,避免全量更新
2、核心目标
- 找出新旧虚拟DOM树的差异
- 计算最小操作集(增删改)
- 高效更新真实DOM
二、Diff 算法核心策略
1、分层比较(Tree Diff)
- 同层比较: 只比较同一层级的节点,不跨层级比较
- 时间复杂度: 从O(n³) 优化到 O(n)
- 实现方式:
function diff(oldTree, newTree) {// 1、遍历每层节点for(let level = 0; level < minDepth; level ++) {const oldNodes = getNodesAtLevel(oldTree, level);const newNodes = getNodesAtLevel(newTree, level);}// 2、比较同层节点compareNodes(oldNodes, newNodes);
}
2、组件比较(Component Diff)
- 相同类型组件: 继续递归比较子组件
- 不同类型组件: 直接替换整个组件
- 实现伪代码:
function diffComponents(oldComp, newComp) {if(oldComp.type === newComp.type) {// 类型相同,比较属性diffProps(oldComp.props, newComp.props);// 递归比较子组件diffChildren(oldComp.children, newComp.children); } else {// 类型不同,替换整个组件replaceComponent(oldComp, newComp);}
}
3、元素比较(Element Diff)
- 节点类型不同: 直接替换整个节点
- 节点类型相同: 比较属性和子节点
- 属性比较:
function diffProps(oldProps, newProps) {// 更新修改的属性for(c