diff算法_双线程跑传统 diff 算法

3277d9ab79365ce0017ac2a28bfc6b9c.png

大家好,我又双叒叕出现了……今天带来的文章是关于如何将 diff 和 patch 分别跑在双线程的

传统的方式:virtual-dom

vdom 的鼻祖,它通过在 diff 阶段生成 patches,然后 patch 阶段将 patches 应用到 dom 上

这个思路是可行的,微信小程序就直接将它的算法搬过来

但是其实这个算法的实现真的很原始,两次深度遍历,性能差,代码多

但是目前能分开遍历的,也就只有这一个思路不是吗?

snabbdom 等算法

vdom 发展到一定的阶段,就衍生出了 snanbbdom,ivi,inferno 这种,两端遍历的方式

但是这些库都是 diff patch 同时做,甚至 preact 直接不做 vdom 间的 diff

我现在需要用这个方法,但是 dom 传不到 worker 中,导致这些算法都用不了

所以现在的重点变成了:

怎样拆?

if 

这是一段场景的 diff 的代码,我们看到,diff 和 patch 一起遍历,无非就是多了几个变量和方法

parent 

这些东西也正是无法从主线程传过来的

然后我想啊想,终于想到了一个方法,我们通过 index 建立映射,寻找 parent 和 node

比如上面的代码,它的 patches 最终长这样:

[ 

是的你没看错,我们用这里的 0 和 1 也就是 index 建立的映射,0 代表的是 rootDom

然后最终生成的 dom 结构可能长这样

<

如果此时删除掉 3,那 patch 应该是这样

[ 

刺激刺激,就这样,我们通过 vdom 与 dom 建立索引的思路,几乎可以复现所有的 diff 算法了

而且性能也比 virtual-dom 好得多(因为不需要遍历真实 dom)

总结

以上,介绍了主要思路,同样的思路可以用于任何跨端框架中

这里只是拿 snabbdom 举例,我也不会直接抄这个算法,具体的实现,还得看 voe 能搞到什么程度……

https://github.com/132yse/voe

放一下 github 的地址,欢迎关注与 讨论哈!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值