传统 diff 算法的复杂度为 O(n^ 3),显然这是无法满足性能要求的。React 通过制定一个特定的策略,将 O(n^3) 复杂度的问题转换成 O(n) 复杂度的问题。依次分为以下三个步骤:
- tree diff。同层对比
- component diff。整体性
- element diff。插入/移动/删除,借助 key 尽可能复用(只做移动)
- 用 key 来构建一个老节点的 map,复用一个后要从 map 里删除
- lastPlacedIndex 表示最后一个不需要移动的节点的索引。移动时的原则是尽量少量的移动,如果必须有一个要动,新地位高的不动,新地位低的动
vue
vue 的 diff 算法是基于 snabdom,参考
vue2 双端 diff
- 开始遍历时,首先依次进行头头、尾尾、头尾、尾头对比
- 从两端向中间遍历,当指针交叉的时