Javascript 从Wasm加载文件?

Javascript 从Wasm加载文件?,javascript,rust,webassembly,Javascript,Rust,Webassembly,我用的是铁锈和webassembly。我收到此错误消息wasm尚不支持此操作。所以有两件事发生了,我很好奇是否有人知道答案。因此,要么我的文件路径不正确,这是最没有帮助的错误消息,要么wasm不支持加载文件 #[wasm_bindgen] #[macro_use] pub fn file() -> () { let mut data: Vec<u8> = Vec::new(); ///I would load the png with the same path

我用的是铁锈和webassembly。我收到此错误消息
wasm尚不支持此操作
。所以有两件事发生了,我很好奇是否有人知道答案。因此,要么我的文件路径不正确,这是最没有帮助的错误消息,要么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);
}

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

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

具体谈到
wasm32未知
目标,该目标用于表示“Rust和wasm兼容的基础层”。在这个目标上,标准库只能采用WebAssembly指令集,而不能采用其他指令集。由于WebAssembly不提供执行I/O或加载文件的方法,这意味着这些存根将在标准库中返回错误

请注意,我们在
wasm32 unknown
目标上提供标准库的另一种方法是根本不提供这些函数,在尝试使用它们时会导致编译时错误。我们选择不走这条路线,无论是好是坏,都是为了在锈迹斑斑的目标上保持一致。希望像这样的东西可以改变这个故事的演算,但锈还没有完全存在


不过,在此期间,您可能仍然希望完成此任务!
wasm bindgen
项目提供了一些关于
wasm32未知
目标的指南,可以帮助您在此取得一些进展:


值得注意的是,web平台目前不提供从文件系统加载文件的能力,因此没有很好的方法将
File::open
实现为
wasm32 unknown
目标的Rust API,即使使用了JS。但是,如果您使用的是Node.js,我建议您阅读并查看用于导入Node.js函数以实现此功能的

浏览器无法直接加载文件。您需要使用AJAX。该文件已经打包并随附webpack@christopherclark如果Webpack正在绑定它,那么您根本没有加载一个文件,您要么加载一个字符串,要么加载一个碰巧来自文件的数组缓冲区。谢谢。不过我很好奇,因为该文件在客户端的“某处”。它应该是可检索的,也许不使用标准库,但应该有某种方法来检索它不?或者wasm甚至是来自客户端的沙盒吗?一般来说,web的wasm就像普通网页一样是沙盒,所以在wasm中访问文件的方式与在普通网页中访问文件的方式相同。因此,理论上我可以对localhost/png/location.png进行ajax调用,这样就可以了!谢谢。是否也可以使用
include_字节!()
macro,将像图像一样的资源嵌入到.wasm二进制文件中?
import { memory } from "break-game/break_game_bg";
import A from './png/A_SingleCell.png';
import { alloc, fill, decode, file } from "break-game";


file();