在Chrome扩展中使用WebAssembly

7 浏览
0 Comments

在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。

所以我的问题是:

  1. 有人尝试过在Chrome扩展程序中加载.wasm文件并成功吗?第二种方法(加载js文件)听起来更简单,但如果你有这种方法的工作示例,那就太好了。

或者2.如何访问在background.html中加载的模块(来自第二个示例)?

或者3.如何通过postMessage将我所需的函数从js文件传递给Worker?有人尝试在Chrome扩展程序中使用WebAssembly并成功吗?

编辑:

我最终放弃了WebAssembly的方法。

我还在bugs-chromium上发布了这个问题,

几个月后得到了答案。不确定这是否真的有效,但也许这个答案以及被标记的答案将会帮助到其他人。

0