如何在Web Worker中使用WebAssembly(wasm)代码?

Jos*_*sen 7 javascript web-worker webassembly

目前,Web Worker被实例化:

let worker = new Worker('worker.js');
Run Code Online (Sandbox Code Playgroud)

然后浏览器提取worker.js并开始响应消息.

我想使用WebAssembly实现我的worker的功能.理想情况下,我想做这样的事情:

let worker = new Worker('worker.wasm');
Run Code Online (Sandbox Code Playgroud)

但我很确定这是不可能的.最明显的替代方法是worker.js获取worker.wasm并编译并运行它.但这意味着我们获取一个脚本(worker.js),其唯一的工作是获取并运行另一个脚本(worker.wasm).这对我来说很难受.所以我的问题是:在Web Worker中使用WebAssembly是否有更简洁的方法,这不会引入额外的提取步骤?

JF *_*ien 2

您可以postMessageaWebAssembly.Module到 a Worker。因此,您需要foo.wasm在主脚本中进行编译,然后postMessage对其实现进行优化,以免重新编译或重复代码(尽管目前并非所有实现都这样做)。然后你只需要你的工作人员来实例化。

您需要实例化的一件事是 an importObject,并且您传入的内容需要驻留在该工作人员中!因此,即使您可以说“使用此新工作人员.wasm”,您也无法指定importObject.

这记录在结构化克隆中,它也会影响 IndexDB。