2

我正在尝试使用 Rocket运行 WebAssembly 程序(用 Rust 编写,来自https://rustwasm.github.io/book/game-of-life/hello-world.html的示例程序)。WebAssembly 使用 wasm-pack 编译并使用 wasm_bindgen。wasm 二进制文件content::JavaScript<Vec<u8>>在 Rocket 中表示,这似乎是一个“有效”的解决方案。二进制文件已“正确”获取,但 Chrome 会打印 Uncaught SyntaxError: Invalid or unexpected token。这是由于表示content::JavaScript<Vec<u8>>在获取期间存在错误(尽管发送字节与 wasm 文件中的字节匹配)还是其他地方的错误?

我希望有人可以解释为什么生成的二进制文件中有 SyntaxError。

4

2 回答 2

1

好的,现在我想我知道出了什么问题:从 wasm-pack 生成的 js 文件尝试将 WebAssembly 作为模块加载。该模块需要有一个 Javascript mime 否则它将失败(这就是为什么我尝试将 wasm 文件发送content::JavaScript<Vec<u8>>为二进制文件中的无效标记,因为它试图将其解释为纯 JavaScript。我现在真正使用的是Option<NamedFile>来自火箭女巫的类型有一个application/wasm哑剧。
我需要稍微更改生成的 js 文件:WebAssembly 用 初始化WebAssembly.instatiateStreaming(fetch(...), importObjects),然后应该删除模块导入。这importObjects也有点棘手,因为将 strigns 传递给 WebAssembly 有点不方便。对于可以从 WebAssembly 调用的警报函数,importObjects看起来像这样
let importObjects = {'./wasm_test': { __wbg_alert_3d9cbee15c16469e: __wbg_alert_3d9cbee15c16469e }};
名称来自 wasm 二进制文件:(import "./wasm_test" "__wbg_alert_3d9cbee15c16469e" (func $__wbg_alert_3d9cbee15c16469e (type $t0)))
该函数__wbg_alert_3d9cbee15c16469e由 wasm-pack 生成。最后要更改的是最初通过import语句导入的对象。我现在有一个变量,它的内容obj.instance.exports是在 then 语句中设置的内容,WebAssembly.instatiateStreaming(fetch(...), importObjects).then(obj => { wasm = obj.instance.exports; })
这些更改对我有用(向/从 WebAssembly 发送和读取字符串)

于 2018-12-23T17:34:02.757 回答
0

跟进本的回答。该.wasm文件是通过application/javascriptmime 发送的,因此浏览器正试图将其作为 javascript 执行。要使用 mime 发送它,请application/wasm确保您的响应是 type Option<rocket::response::NamedFile>

这是一个例子:

#[get("/pkg/<file..>")]
fn get_pkg(file : PathBuf) -> Option<rocket::response::NamedFile> {
   NamedFile::open(Path::new("client/pkg/").join(file)).ok()
}

关于第二个问题 - 事实证明,wasm-pack build您实际上可以要求wasm-pack生成可以在浏览器中运行并加载您的 wasm 的 javascript,而不是手动编辑生成的 javascript。干脆做 wasm-pack build --target web

剩下要做的就是在你身边添加这样的东西:

<script type="module">
  import init from './pkg/client.js'; //client.js is the file generated by wasm
  async function run() {
    await init();
  }
  run();
</script>
于 2019-12-29T12:56:04.687 回答