再次重构 diff 算法
yisar opened this issue · comments
伊撒尔 commented
fre 当前的 diff 算法,主要有两种顺序
- diff 算法的遍历顺序,这个顺序是从两端到中间的遍历
- fiber 链表的遍历顺序,从左往右
这对普通元素没什么影响,主要影响的是组件,比如下面这个情况:
<A/> // [li li]
<button></button>
理论上讲,正确顺序是 li li button,但是由于 fiber 从左到右的遍历,导致顺序变成了 A button li li
这是一个很难处理的问题,尤其是有了 fragment 之后,几乎成为了无解的问题,非常绝望
component 的解决其实只有两种,一种是单个元素,一种是 fragment 数组
我们必须同步地操作 component 的 dom,目前可行的方案是
- 遇到 component,则操作孩子
- 遇到孩子,如果已经被操作过,则跳过
- 遇到 fragment,则 foreach
当然这不是万全的解决方案,最终我们应该保证顺序的正确性