支持的 Rust 目标

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

`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 目标上将无条件地 panic。例如

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

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

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

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

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

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

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

其他 Web 目标

`wasm-bindgen` 目标不支持 `wasm32-unknown-emscripten` 也不支持 `asmjs-unknown-emscripten` 目标。目前也没有计划支持这些目标。所有注释在这些目标上的工作方式与其他平台相同,保留导出的函数并导致所有导入 panic。