Javascript 在chrome扩展中使用WebAssembly
我有一个chrome扩展,包括一个复杂的函数Javascript 在chrome扩展中使用WebAssembly,javascript,google-chrome-extension,web-worker,webassembly,Javascript,Google Chrome Extension,Web Worker,Webassembly,我有一个chrome扩展,包括一个复杂的函数comp_func(data),它通过执行许多位操作占用大量CPU。因此,我尝试使用WebAssembly 我试着学习了一些教程,例如一和一 第一个链接说: fetch('simple.wasm').then(response => response.arrayBuffer() ).then(bytes => WebAssembly.instantiate(bytes, importObject) ).then(results =&
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();
});
但我有一个错误:
未捕获(承诺中)类型错误:WebAssembly实例化:导入#0 module=“env”错误:模块不是对象或函数
我已经尝试了很多次使用这种方法,但都没有成功。我无法理解如何使用从.wasm
文件加载的WebAssembly
所以我尝试了一种更简单的方法:
第二个链接表示将这一行放在html文件中:
<script src="index.js"></script>
但是,我在一个扩展中,所以我只有一个background.html
文件。
因此,我正在寻找一种方法来访问加载在后台文件中的模块。
事情变得越来越复杂,因为函数comp\u func(data)
是从a调用的。
这就是我迄今为止所尝试的:
如果我调用chrome.extension.getBackgroundPage()
我可以访问该模块
但我无法将其发送给工人:
未能对“Worker”执行“postMessage”:#无法克隆
如果我想先把它串起来:
未捕获类型错误:将循环结构转换为JSON
(我试图取消它的循环,但没有成功…)
我无法从Worker调用chrome.extension.getBackgroundPage()
,因为我无法从那里访问ChromeAPI
所以我的问题是:
.wasm
文件并成功?
第二种方法(加载js
文件)听起来更简单,但如果您有一个这种方法的工作示例,那就太好了background.html
中加载的模块(来自第二个示例)
或3。如何将我需要的函数从js文件传递给Worker(通过postMessage
)
总而言之,是否有人试图在chrome扩展中使用WebAssembly,并最终存活下来
编辑:
我最终放弃了WebAssembly的方法。
我也在,
几个月后,我得到了答案。不确定这是否真的有效,但也许这一点,连同标记的答案,将有助于某人。我最近一直在摆弄WebAssembly,并找到了一种方法使其有效。以下是脚本文件: main.js
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(null, {file: "content_script.js"});
});
var importObject = { imports: { imported_func: arg => console.log(arg) } };
url = 'data:application/wasm;base64,' + "AGFzbQEAAAABCAJgAX8AYAAAAhkBB2ltcG9ydHMNaW1wb3J0ZWRfZnVuYwAAAwIBAQcRAQ1leHBvcnRlZF9mdW5jAAEKCAEGAEEqEAAL";
WebAssembly.instantiateStreaming(fetch(url), importObject)
.then(obj => obj.instance.exports.exported_func());
content\u script.js
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(null, {file: "content_script.js"});
});
var importObject = { imports: { imported_func: arg => console.log(arg) } };
url = 'data:application/wasm;base64,' + "AGFzbQEAAAABCAJgAX8AYAAAAhkBB2ltcG9ydHMNaW1wb3J0ZWRfZnVuYwAAAwIBAQcRAQ1leHBvcnRlZF9mdW5jAAEKCAEGAEEqEAAL";
WebAssembly.instantiateStreaming(fetch(url), importObject)
.then(obj => obj.instance.exports.exported_func());
数据URL属于通用教程wasm示例(simple.wasm),该示例在控制台上写入42
注:如果你觉得这是作弊或不好的做法,那么这个content_script.js也可以:
var importObject = {
imports: {
imported_func: function(arg) {
console.log(arg);
}
}
};
var response = null;
var bytes = null;
var results = null;
var wasmPath = chrome.runtime.getURL("simple.wasm");
fetch(wasmPath).then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, importObject)
).then(results => {
results.instance.exports.exported_func();
});
仅当您在manifest.json的web\u accessible\u resources部分包含代码文件时,尽管:
...
"web_accessible_resources": [
"content_script.js",
"main.js",
"simple.wasm"
],
...
Github:我认为可能的扩展还不能运行wasm。至于消息传递部分:1)使用chrome API只能传输简单数据,即数字、字符串、布尔值、数组和由这些简单数据组成的对象,2)工作者也可以传输,3)函数不可传输。你知道我如何确定扩展是否不能运行wasm吗?你可以询问和/或。