frejs / fre

:ghost: Tiny Concurrent UI library with Fiber.

Home Page:https://fre.deno.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

再次重构 diff 算法

yisar opened this issue · comments

fre 当前的 diff 算法,主要有两种顺序

  1. diff 算法的遍历顺序,这个顺序是从两端到中间的遍历
  2. fiber 链表的遍历顺序,从左往右

这对普通元素没什么影响,主要影响的是组件,比如下面这个情况:

<A/> // [li li]
<button></button>

理论上讲,正确顺序是 li li button,但是由于 fiber 从左到右的遍历,导致顺序变成了 A button li li
这是一个很难处理的问题,尤其是有了 fragment 之后,几乎成为了无解的问题,非常绝望

component 的解决其实只有两种,一种是单个元素,一种是 fragment 数组

我们必须同步地操作 component 的 dom,目前可行的方案是

  1. 遇到 component,则操作孩子
  2. 遇到孩子,如果已经被操作过,则跳过
  3. 遇到 fragment,则 foreach

当然这不是万全的解决方案,最终我们应该保证顺序的正确性