diff 策略
一句话结论:React 的 Diff 不是通用树 Diff,而是基于组件模型做了强假设:只比较同层级、依赖 key/type 复用、数组用线性策略 + Map 补偿,整体追求
O(n)的可预测性能。
1. 三个核心假设
- 只对比同一层级(不同层级直接重建)
- key 稳定代表“同一个人”,type 匹配代表“同一种组件/节点”
- 列表用 key 辅助定位,避免全量重建
2. 列表 Diff 的直觉
- 先尝试按索引线性复用(快路径)
- 一旦错位,用 Map(key→旧 Fiber)查找可复用节点
- 需要移动/插入时打 Placement 等 flags
3. 代价与收益
- 收益:性能稳定、实现可控
- 代价:需要开发者提供稳定 key,否则会产生错误复用与额外 DOM 操作