支持的 Rust 目标

注意: 本节介绍的是 Rust 目标三元组,而不是像节点/Web 工作线程/浏览器这样的目标。有关该方面的更多信息即将发布!

`wasm-bindgen` 项目旨在针对 Rust 中的 `wasm32-unknown-unknown` 目标。此目标是 Rust 的一个“基础”目标,它输出 WebAssembly。标准库在很大程度上是惰性的,因为像 `std::fs` 和 `std::net` 这样的模块只会返回错误。

非 wasm 目标

请注意,`wasm-bindgen` 还旨在编译所有目标。这意味着,如果你愿意,即使编译到 Windows(例如),使用 `#[wasm_bindgen]` 也是安全的。例如

#[wasm_bindgen]
pub fn add(a: u32, b: u32) -> u32 {
    a + b
}

#[cfg(not(target_arch = "wasm32"))]
fn main() {
    println!("1 + 2 = {}", add(1, 2));
}

此程序将在所有平台上编译并运行,而不仅仅是 `wasm32-unknown-unknown`。请注意,使用 `#[wasm_bindgen]` 导入的函数在非 wasm 目标上将无条件地出现恐慌。例如

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

fn main() {
    log("hello!");
}

此程序将在除 `wasm32-unknown-unknown` 之外的所有平台上无条件地出现恐慌。

但是,为了获得更好的编译时间,你可能希望只在 `wasm32-unknown-unknown` 目标上使用 `#[wasm_bindgen]`。你可以像这样拥有一个特定于目标的依赖项

[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen = "0.2"

在你的代码中,你可以使用


# #![allow(unused_variables)]
#fn main() {
#[cfg(target_arch = "wasm32")]
#[wasm_bindgen]
pub fn only_on_the_wasm_target() {
    // ...
}
#}

其他 Web 目标

`wasm-bindgen` 目标不支持 `wasm32-unknown-emscripten` 也不支持 `asmjs-unknown-emscripten` 目标。目前也没有计划支持这些目标。所有注释都像其他平台上的目标一样工作,保留导出的函数并导致所有导入出现恐慌。