Javascript 在chrome沙盒中使用WebAssembly
我有一个chrome扩展,包括一个复杂的函数Javascript 在chrome沙盒中使用WebAssembly,javascript,google-chrome-extension,cors,sandbox,webassembly,Javascript,Google Chrome Extension,Cors,Sandbox,Webassembly,我有一个chrome扩展,包括一个复杂的函数comp_func(data),它通过执行许多位操作占用大量CPU。因此,我尝试使用WebAssembly。 经过多次尝试,我得出结论,由于权限问题,我需要在沙箱中使用此函数 现在,我正试图遵循和作为一个“你好世界”的例子来解决我的问题 WebAssembly文件包括:index.js和index.wasm, 沙盒文件是:sandbox.html, page.js是需要执行comp_func(data)的扩展代码,它使用postMessage作为与sa
comp_func(data)
,它通过执行许多位操作占用大量CPU。因此,我尝试使用WebAssembly。
经过多次尝试,我得出结论,由于权限问题,我需要在沙箱中使用此函数
现在,我正试图遵循和作为一个“你好世界”的例子来解决我的问题
WebAssembly文件包括:index.js
和index.wasm
,
沙盒文件是:sandbox.html
,
page.js
是需要执行comp_func(data)
的扩展代码,它使用postMessage
作为与sandbox.html
通信的方式。
background.html
是扩展名的背景文件
这就是我到目前为止所做的:
manifest.json
"sandbox": {
"pages": ["sandbox.html"]
},
background.js
<script src="page.js"></script>
<iframe id="theFrame" src="sandbox.html" style="display: none;"></iframe>
sandbox.html
<html>
<body>
<script src="index.js"></script>
<script>
var result = _roll_dice(); //the function of the WebAssembly
console.log('results! ', result);
</script>
</body>
</html>
var result=_roll_dice()//WebAssembly的功能
log('results!',result);
因此,现在扩展正在调用sandbox.html
,后者依次加载index.js
,但是我得到了错误:
加载失败
chrome扩展名://索引。wasm:否
“Access Control Allow Origin”标头出现在请求的服务器上
资源。因此,不允许访问源“null”。如果是不透明的
响应满足您的需要,将请求的模式设置为“无cors”以
获取禁用CORS的资源
据我所知,index.js
正在调用index.wasm
,因为我在沙箱中,所以存在CORS权限问题。
有人知道这种情况下的解决方案吗?WebAssembly模块通常是通过HTTP从JavaScript加载的,但是,还有其他方法可以将它们包含在代码中。例如,可以对WebAssembly二进制文件进行base64编码,并将其作为字符串包含。或者,您可以使用诸如rollup之类的构建工具来为您实现这一点: 这允许您引用wasm文件作为导入:
import wasm from './sample.wasm';
sample({ ...imports }).then(({ instance }) => {
console.log(instance.exports.main())
})
但是,当使用rollup构建时,它将是base64编码和内联的。权限问题到底是什么?如果它是由脚本标记中的内联代码引起的,只需使用单独的js文件即可。还可以尝试一个使用不同方法的方法。@wOxxOm感谢您的回复!我也尝试过在MDN教程中这样做,但没有成功。如果我试图在沙箱之外执行此操作,我会遇到以下错误:“未捕获(承诺中)编译器错误:WebAssembly.compile():嵌入式程序不允许生成Wasm代码”可能Chrome不支持扩展中的Wasm,但只支持https?您可以尝试通过在扩展中使用服务人员来“服务”它。也可以考虑问一下。