【发布时间】:2019-02-13 20:00:20
【问题描述】:
我正在尝试使本教程(此处:https://www.hellorust.com/demos/add/index.html)工作,似乎无论我做什么,我都无法让 WebAssembly MDN 保留功能正常工作。
所以,我按照上面链接上的说明操作,得到了一个add.wasm 文件。据我所知,这应该相当简单并且应该可以工作。经过一番挖掘,我发现最新的 WebAssembly 模块是用于实例化流式传输的 - 可以在此处找到其文档:(https://developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API)。
MDN 示例说要执行以下操作:
var importObject = {
imports: { imported_func: arg => console.log(arg) }
};
然后
WebAssembly.instantiateStreaming(fetch('simple.wasm'), importObject)
.then(obj => obj.instance.exports.exported_func());
根据 MDN,importObject 是为了解开嵌套参数。很奇怪,但还可以。
为了使这尽可能简单,我将add.wasm 文件和将导入它的js 文件放在同一目录中,然后执行以下操作(注意:我使用的是 Vue .js,但对于任何熟悉 SPA 之类的库的人来说,这应该是相似的):
window.WebAssembly.instantiateStreaming(fetch('./add.wasm', {
headers: {
"Content-Type": "application/wasm",
},
}), importObject)
.then(obj => {
console.log('inside return obj from WebAssembly initiateStreaming')
obj => obj.instance.exports.exported_func()
})
.catch(error=>{
console.log('there was some error; ', error)
});
我得到的错误是:
there was some error; TypeError: "Response has unsupported MIME type"
我尝试不将标头添加到获取请求中,使用fetch(add.wasm),删除window.,完全删除importObject,并将obj 简单地记录到控制台。似乎没有任何效果。
如果它没有得到广泛支持,我可能必须以某种方式将 application/wasm 字段添加到 webpack,但我不确定,我还没有在网上看到任何示例。
有人知道如何让它工作吗?
编辑:
有人建议,由于这是一个获取请求,它必须从后端服务器发出请求。这对我来说很有意义,所以我做了以下事情:
WebAssembly.instantiateStreaming(fetch('http://localhost:8000/files/add.wasm'), importObject)
.then(obj => {
console.log('inside return obj from WebAssembly initiateStreaming')
obj => obj.instance.exports.exported_func()
})
.catch(error=>{
console.log('there was some error; ', error)
});
http://localhost:8000/files/{someFile} 是为我的文件提供服务的后端路由(当然,我确保将 add.wasm 放入其中)。不幸的是,我得到了同样的错误(即unrecognized MIME type),我不知道为什么。
【问题讨论】:
-
freenode 上##javascript 中的讨论显示 OP 正在使用 golang 的 http
ServeFile方法。 -
谢谢哥们!是的,如果有人知道如何更改 ServeFile 上 MIME 类型的标头,请告诉我 - 我正在研究它。
-
知道了 - 答案就是 snek 所说的。谢谢斯内克。
标签: javascript rust streaming fetch webassembly