从Wasm加载文件?

时间:2018-11-14 16:33:26

标签: javascript rust webassembly

我正在使用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();

1 个答案:

答案 0 :(得分:4)

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

Rust标准库当前为所有目标提供统一的API表面积,无论目标是否实际支持该功能。事实证明,几乎所有平台基本上都实现了标准库的所有稳定表面积,但是具体的wasm32-unknown-unknown目标有些奇怪。在这个wasm目标上,标准库尤其无法在std::netstd::fs之类的模块中实现函数,因此这些函数无条件返回错误。您在这里看到的是File::openwasm32-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中,也没有很好的方法将File::open作为wasm32-unknown-unknown目标的Rust API实现。用来。但是,如果您使用的是Node.js,我建议阅读有关JS interop的内容,并建议您查阅wasm-bindgen guide来导入Node.js函数以实现此目的。