Javascript 如何在Web Worker中使用WebAssembly(wasm)代码?
目前,Web Worker被实例化为:Javascript 如何在Web Worker中使用WebAssembly(wasm)代码?,javascript,web-worker,webassembly,Javascript,Web Worker,Webassembly,目前,Web Worker被实例化为: let worker = new Worker('worker.js'); 然后浏览器获取worker.js,并开始响应消息 我想使用WebAssembly实现我的worker功能。理想情况下,我想做这样的事情: let worker = new Worker('worker.wasm'); 但我很确定这是不可能的。最明显的选择是让worker.jsfetchworker.wasm编译并运行它。但这意味着我们获取一个脚本(worker.js),其唯一任
let worker = new Worker('worker.js');
然后浏览器获取worker.js
,并开始响应消息
我想使用WebAssembly实现我的worker功能。理想情况下,我想做这样的事情:
let worker = new Worker('worker.wasm');
但我很确定这是不可能的。最明显的选择是让
worker.js
fetchworker.wasm
编译并运行它。但这意味着我们获取一个脚本(worker.js
),其唯一任务是获取并运行另一个脚本(worker.wasm
)。我觉得这很恶心。因此,我的问题是:是否有一种更干净的方法可以在Web Worker中使用WebAssembly,而不会引入额外的获取步骤?您可以将postMessage
aWebAssembly.Module
发送给Worker
。因此,您需要在主脚本中编译foo.wasm
,然后再编译postMessage
它,哪些实现需要优化,以避免重新编译或复制代码(尽管目前并非所有实现都这样做)。然后,您只需要您的工作者来实例化
实例化需要的一件事是importObject
,您传入的内容需要常驻该工作者!因此,即使您可以说“具有此.wasm的新工作者”,您也无法指定导入对象
这是有文档记录的,这也会影响IndexDB。“因此我的问题是:是否有一种更干净的方式在Web Worker中使用WebAssembly,而不会引入额外的获取步骤?”如果不打算使用Worker
,那么首先使用Worker
的目的是什么?问题中不存在实际的问题陈述。我不确定这是否有效。当我尝试在postMessage
中发送wasm模块时,我得到以下信息:example.js:54 Uncaught(in promise)domeException:未能在“Worker”上执行“postMessage”:()=>无法克隆解析(模块)。至少,我清理了我的代码,并使用WebAssembly.compile
生成一个模块。然后我尝试通过postMessage
发送它,但我得到了以下结果:未捕获(承诺中)DomeException:未能在“Worker”上执行“postMessage”:无法克隆对象。这是在Chrome 60下。Chrome 62给出了未捕获(承诺中)的DomeException:未能在“Worker”上执行“postMessage”:#无法克隆。Firefox 57.0b14似乎可以工作。这听起来像是一个Chrome bug。wasm对象传输在chrome中为我工作。但我在下一个版本的软件包中删除了这个。Browserify+webworkify是很好的enough(它通过主线程中的模块动态创建ww src)。在ww中为小模块添加额外的编译步骤是很便宜的,而且为了保持简单,它更可取。