从 Wasm 加载文件?
Loading a file From Wasm?
我正在使用 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();
从文件系统加载文件不适用于 Rust 标准库和 wasm32-unknown-unknown
目标。因此,此错误是使用 File::open
.
的预期运行时错误
Rust 标准库目前为所有目标提供统一的 API 表面积,无论目标是否实际支持该功能。事实证明,几乎所有平台基本上都实现了标准库的所有稳定表面积,但 wasm32-unknown-unknown
目标具体来说有点奇怪。在这个 wasm 目标上,标准库显然无法在 std::net
或 std::fs
等模块中实现函数,因此函数无条件地 return 出错。您在这里看到的是 File::open
无条件地 return 是 wasm32-unknown-unknown
目标上的一个错误。
具体说到wasm32-unknown-unknown
目标,这个目标用来表示"base layer of compatibility for Rust and wasm"。在这个目标上,标准库只能假设 WebAssembly 指令集,没有别的。因为 WebAssembly 不提供执行 I/O 或加载文件的方法,这意味着这些存根留给标准库中的 return 错误。
请注意,我们在 wasm32-unknown-unknown
目标上提供标准库的另一种方法是根本不提供这些函数,在尝试使用它们时会导致编译时错误。我们选择不走这条路,不管是好是坏,以在 Rust 中保持跨目标的一致性。希望像 proposed portability lint 这样的东西可以改变这个故事的演算,但 Rust 还没有完全实现!
与此同时,您可能仍想完成这件事! wasm-bindgen
项目有一些关于 wasm32-unknown-unknown
目标的指南,可以帮助您在此处取得一些进展:
- Which crates will work off the shelf with WebAssembly?
- How to add WebAssembly support to a general purpose crate
值得注意的是,Web 平台目前不提供从文件系统加载文件的能力,因此没有很好的方法将 File::open
作为 API 在 Rust 中实现 wasm32-unknown-unknown
目标,即使使用了JS。不过,如果您使用的是 Node.js,我建议您阅读有关 JS interop as well as checking out the wasm-bindgen
guide 的内容以导入 Node.js 函数来实现它。
我正在使用 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();
从文件系统加载文件不适用于 Rust 标准库和 wasm32-unknown-unknown
目标。因此,此错误是使用 File::open
.
Rust 标准库目前为所有目标提供统一的 API 表面积,无论目标是否实际支持该功能。事实证明,几乎所有平台基本上都实现了标准库的所有稳定表面积,但 wasm32-unknown-unknown
目标具体来说有点奇怪。在这个 wasm 目标上,标准库显然无法在 std::net
或 std::fs
等模块中实现函数,因此函数无条件地 return 出错。您在这里看到的是 File::open
无条件地 return 是 wasm32-unknown-unknown
目标上的一个错误。
具体说到wasm32-unknown-unknown
目标,这个目标用来表示"base layer of compatibility for Rust and wasm"。在这个目标上,标准库只能假设 WebAssembly 指令集,没有别的。因为 WebAssembly 不提供执行 I/O 或加载文件的方法,这意味着这些存根留给标准库中的 return 错误。
请注意,我们在 wasm32-unknown-unknown
目标上提供标准库的另一种方法是根本不提供这些函数,在尝试使用它们时会导致编译时错误。我们选择不走这条路,不管是好是坏,以在 Rust 中保持跨目标的一致性。希望像 proposed portability lint 这样的东西可以改变这个故事的演算,但 Rust 还没有完全实现!
与此同时,您可能仍想完成这件事! wasm-bindgen
项目有一些关于 wasm32-unknown-unknown
目标的指南,可以帮助您在此处取得一些进展:
- Which crates will work off the shelf with WebAssembly?
- How to add WebAssembly support to a general purpose crate
值得注意的是,Web 平台目前不提供从文件系统加载文件的能力,因此没有很好的方法将 File::open
作为 API 在 Rust 中实现 wasm32-unknown-unknown
目标,即使使用了JS。不过,如果您使用的是 Node.js,我建议您阅读有关 JS interop as well as checking out the wasm-bindgen
guide 的内容以导入 Node.js 函数来实现它。