在 webworker 中运行 react virtual dom

在一次内部分享会中,我表达了可以把 react 的 virtual dom 那一套全部放到 webworker 中,这样就可以避免在主线程进行计算量很大的 diff 操作,一方面节省主线程的计算消耗提升性能,另一方面也不需要再去构建 react 的 scheduler 做那么复杂的协程工程。大致意思就是,在主线程只做 DOM 操作,而 DOM 的操作,全部由 worker 线程发送消息到主线程完成。在 worker 中计算得到 patches,发送到主线程,由主线程的程序完成 patch,也就是在主线程中,只存在 DOM 操作,不存在计算过程。其中比较重要的一点,是事件响应问题。当用户在界面上做了一次点击后,需要发送一个 event 消息到 worker 中,然后由 worker 中构建的一套事件处理系统完成事件响应和接下来的 diff,将最终的 patch 发送回主线程。

之后,在同事的推荐和自己的寻找下,找到两个项目:

前一个项目比较老了,感觉正好符合我的想法。后一个项目受最近 server components 的启发才出来,也是非常有意思。

在深入想想。既然我们可以把计算过程放到 worker 中,也可以放到 wasm 中去。我们可以用 rust 重写 virtual dom 的实现,并像上面 worker 中的处理方式,放到 wasm 中,通过接口传递数据,完成计算后再回调方法,最终实现这个效果。

而以上这套思路,还有点像小程序的思路,但最终还是不大相同。