【问题标题】:Loading a file From Wasm?从 Wasm 加载文件?
【发布时间】:2018-11-14 16:33:25
【问题描述】:

我正在使用 rust 和 webassembly。我收到此错误消息operation not supported on wasm yet。所以两件事中的任何一件都在发生,我很好奇是否有人知道答案。所以要么我的文件路径不正确,这是最没有帮助的错误消息,要么 wasm 不支持加载文件。

#[wasm_bindgen]
#[macro_use]
pub fn file() -> () {
    let mut data: Vec<u8> = Vec::new();
    ///I would load the png with the same path in my javascript.
    let opened = File::open("./png/A_SingleCell.png");
    let unwraped = match opened {
        Ok(a) => log(&format!("opened {}", "worked")),
        Err(e) => log(&format!("{}", e)),
    };
    // .read_to_end(&mut data)
    // .unwrap();
    return ();
}

#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    fn log(msg: &str);
}

而 javascript 调用只是 file()

我需要使用不同的目录路径来获取 png 还是真的不加载文件?

编辑 添加我的 index.js 以显示 webpack 已经加载了 png。

import { memory } from "break-game/break_game_bg";
import A from './png/A_SingleCell.png';
import { alloc, fill, decode, file } from "break-game";


file();

【问题讨论】:

  • 浏览器无法直接加载文件。您需要使用 AJAX。
  • 该文件已经打包并随 webpack 一起发布

标签: javascript rust webassembly


【解决方案1】:

从文件系统加载文件不适用于 Rust 标准库和 wasm32-unknown-unknown 目标。因此,此错误是使用 File::open 的预期运行时错误。

Rust 标准库目前为所有目标提供统一的 API 表面区域,无论目标是否实际支持该功能。事实证明,几乎所有平台基本上都实现了标准库的所有稳定表面区域,但具体的 wasm32-unknown-unknown 目标有点奇怪。在这个 wasm 目标上,标准库显然无法在 std::netstd::fs 等模块中实现函数,因此函数无条件返回错误。您在这里看到的是File::open 无条件地在wasm32-unknown-unknown 目标上返回错误。

具体说一下wasm32-unknown-unknown 目标,这个目标用来表示“Rust 和 wasm 兼容的基础层”。在这个目标上,标准库只能假设 WebAssembly 指令集,没有别的。因为 WebAssembly 不提供执行 I/O 或加载文件的方法,这意味着这些存根被留在标准库中返回错误。

请注意,我们在wasm32-unknown-unknown 目标上提供标准库的另一种方法是根本不提供这些函数,当尝试使用它们时会导致编译时错误。我们选择不走这条路,无论好坏,以在 Rust 中保持跨目标的一致性。希望像 proposed portability lint 这样的东西可以改变这个故事的演算,但 Rust 还没有完全出现!


不过,与此同时,您可能仍想完成此任务! wasm-bindgen 项目有一些关于 wasm32-unknown-unknown 目标的指南,可以帮助您在这里取得一些进展:

值得注意的是,Web 平台目前不提供从文件系统加载文件的能力,因此即使使用 JS,也没有很好的方法在 Rust 中将 File::open 实现为 wasm32-unknown-unknown 目标的 API。不过,如果您使用的是 Node.js,我建议您阅读有关 JS interop 的信息,并查看 wasm-bindgen guide 以导入 Node.js 函数来实现这一点。

【讨论】:

  • 谢谢。不过我很好奇,因为该文件在客户端的“某处”。它应该是可检索的,也许不使用标准库,但应该有某种方法可以检索它,不是吗?或者 wasm 甚至被客户端沙盒化了?
  • Web 上的 Wasm 通常与普通网页一样被沙盒化,因此您在 wasm 中访问文件的方式与通过普通网页相同。
  • 所以理论上我可以对 localhost/png/location.png 进行 ajax 调用,这样就可以了!谢谢。
  • 是否也可以使用include_bytes!() 宏,将像图像这样的资源嵌入到 .wasm 二进制文件中?
猜你喜欢
  • 2020-06-25
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 2012-07-14
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多