Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Web Worker中使用WebAssembly(wasm)代码?_Javascript_Web Worker_Webassembly - Fatal编程技术网

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

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),其唯一任

目前,Web Worker被实例化为:

let worker = new Worker('worker.js');
然后浏览器获取
worker.js
,并开始响应消息

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

let worker = new Worker('worker.wasm');

但我很确定这是不可能的。最明显的选择是让
worker.js
fetch
worker.wasm
编译并运行它。但这意味着我们获取一个脚本(
worker.js
),其唯一任务是获取并运行另一个脚本(
worker.wasm
)。我觉得这很恶心。因此,我的问题是:是否有一种更干净的方法可以在Web Worker中使用WebAssembly,而不会引入额外的获取步骤?

您可以将
postMessage
a
WebAssembly.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中为小模块添加额外的编译步骤是很便宜的,而且为了保持简单,它更可取。