【发布时间】:2018-09-11 16:06:27
【问题描述】:
我有一个 chrome 扩展,其中包含一个复杂的函数 comp_func(data),它通过执行许多按位运算来占用大量 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 Instantiation: Import #0 module="env" error: module is not an object or function
我已经尝试了很多来使用这种方法,但没有奏效。我不明白如何使用从 .wasm 文件加载的 WebAssembly。
所以我尝试了一种更简单的方法: 第二个链接说将这一行放在 html 文件中:
<script src="index.js"></script>
然后只使用导出的函数:
var result = _roll_dice();
但是,我在扩展中,所以我只有一个 background.html 文件。
所以我正在寻找一种方法来访问在后台文件中加载的模块。
事情变得复杂了,因为函数 comp_func(data) 是从 Worker 调用的。
这是我迄今为止尝试过的:
如果我打电话给chrome.extension.getBackgroundPage(),我可以访问模块
但我无法将其发送给 Worker:
在“Worker”上执行“postMessage”失败:# 无法克隆。
如果我先尝试stringify:
未捕获的 TypeError:将循环结构转换为 JSON
(我试图取消循环它,没有用......)
我无法从 Worker 调用 chrome.extension.getBackgroundPage(),因为我无法从那里访问 chrome API。
所以我的问题是:
- 是否有人尝试在 chrome 扩展中加载
.wasm文件并成功? 第二种方法(加载js文件)听起来更简单,但如果您有这种方法的工作示例,那就太好了。
或者2.如何访问background.html中已经加载的Module(来自第二个例子)?
或者3.如何将我需要的函数从js文件传递给Worker(通过postMessage)?
总而言之,是否有人尝试在 chrome 扩展中使用 WebAssembly 并幸存下来?
编辑: 我最终离开了 WebAssembly 的方法。 我也在bugs-chromium发布了这个问题, 几个月后得到了答案。不确定这是否真的有效,但也许这以及标记的答案会对某人有所帮助。
【问题讨论】:
-
我认为扩展可能还不能运行 wasm。至于消息传递部分:1)只能使用 chrome API 传输简单数据,即由此类简单数据组成的数字、字符串、布尔值、数组和对象,2)Worker 也可以传输a few specific types,3)函数不是可转让。
-
您知道如何确定扩展程序是否无法运行 wasm?
-
您可以在crbug.com 和/或Chromium-Extensions-Announce 上提问。
标签: javascript google-chrome-extension web-worker webassembly