0.  Comlink 和 scratch-vm中的dispatch相似,也是异步化了不同线程件间通过message api进行的通信

Comlink通过提供一个RPC实现,将这种基于消息的API变成了对开发者更友好的东西。一个线程的值可以在另一个线程中使用(反之亦然),就像本地值一样。

ScratchAddons 项目使用这个库,用于在chrome extension中同步 contentScript 与 pagescript 的数据。

在 scratch-vm dispatch中,有提到过 unoffical extension 中原来设计是可以获得 Proxy 形式的runtime,而Comlink也许就是一种解决方案。

Scratch-vm 中的 dispatch 也是解决不同线程间通信的一种方案,但是dispatch本身只是为了解决外部插件中方法的调用而设计的,只能实现方法的调用并获取返回值,并没有通用性。

1. Comlink 做了什么

使用原生 message api

index.js:

Untitled

worker.js:

Untitled

使用 comlink 后

index.js

Untitled

worker.js

Untitled

可以看到,comlink 在不同线程间实现了类似js模块的导入导出,在一个线程中,可以直接操作其他线程中的对象。

2 comlink是怎么做的

既然是基于message api的包装,那也无法绕过message api本身的限制,可被传输的数据需要是可被结构化克隆的(https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm),而对于function,就是无法被传输的。