我正在使用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();
答案 0 :(得分:4)
从文件系统加载文件不适用于Rust标准库和wasm32-unknown-unknown
目标。因此,此错误是使用File::open
时的预期运行时错误。
Rust标准库当前为所有目标提供统一的API表面积,无论目标是否实际支持该功能。事实证明,几乎所有平台基本上都实现了标准库的所有稳定表面积,但是具体的wasm32-unknown-unknown
目标有些奇怪。在这个wasm目标上,标准库尤其无法在std::net
或std::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中,也没有很好的方法将File::open
作为wasm32-unknown-unknown
目标的Rust API实现。用来。但是,如果您使用的是Node.js,我建议阅读有关JS interop的内容,并建议您查阅wasm-bindgen
guide来导入Node.js函数以实现此目的。