在Chrome扩展中使用WebAssembly
在Chrome扩展中使用WebAssembly
我有一个包含复杂函数comp_func(data)
的Chrome扩展程序,该函数通过执行许多位操作来消耗大量的CPU。因此,我尝试使用WebAssembly来解决这个问题。
第一个链接中写道:
fetch('simple.wasm').then(response => response.arrayBuffer() ).then(bytes => WebAssembly.instantiate(bytes, importObject) ).then(results => { results.instance.exports.exported_func(); });
但是我遇到了错误:
Uncaught (in promise) TypeError:WebAssembly实例化:导入#0 模块="env" 错误:模块不是一个对象或函数
我尝试了很多次使用这种方法,但是不起作用。我不知道如何使用从.wasm
文件加载的WebAssembly。
因此,我尝试了一种更简单的方法:
第二个链接中说将以下行放在HTML文件中:
然后只需使用导出的函数:
var result = _roll_dice();
但是,我在一个扩展程序中,所以只有一个background.html
文件。
因此,我正在寻找一种访问在后台文件中加载的模块的方法。
而且事情变得复杂了,因为函数comp_func(data)
是从Worker中调用的。
到目前为止,这是我尝试过的:
如果我调用chrome.extension.getBackgroundPage()
,我可以访问到模块,但是我不能将其发送到Worker中:
Failed to execute 'postMessage' on 'Worker': # could not be cloned.
如果我尝试先stringify
它:
Uncaught TypeError: Converting circular structure to JSON
(我尝试解决循环引用的问题,但没有成功...)
而且我无法从Worker中调用chrome.extension.getBackgroundPage()
,因为我无法从那里访问chrome API。
所以我的问题是:
- 有人尝试过在Chrome扩展程序中加载
.wasm
文件并成功吗?第二种方法(加载js
文件)听起来更简单,但如果你有这种方法的工作示例,那就太好了。
或者2.如何访问在background.html
中加载的模块(来自第二个示例)?
或者3.如何通过postMessage
将我所需的函数从js文件传递给Worker?有人尝试在Chrome扩展程序中使用WebAssembly并成功吗?
编辑:
我最终放弃了WebAssembly的方法。
我还在bugs-chromium上发布了这个问题,
几个月后得到了答案。不确定这是否真的有效,但也许这个答案以及被标记的答案将会帮助到其他人。