导入非浏览器 JS
#[wasm_bindgen]
属性可以在 extern "C" { .. }
块上使用,以从 JS 导入功能。这就是 js-sys
和 web-sys
crate 的构建方式,但你也可以在自己的 crate 中使用它!
例如,如果你正在使用这个 JS 文件
// defined-in-js.js
export function name() {
return 'Rust';
}
export class MyClass {
constructor() {
this._number = 42;
}
get number() {
return this._number;
}
set number(n) {
return this._number = n;
}
render() {
return `My number is: ${this.number}`;
}
}
你可以在 Rust 中使用它,方法是
#![allow(unused)] fn main() { use wasm_bindgen::prelude::*; #[wasm_bindgen(module = "/defined-in-js.js")] extern "C" { fn name() -> String; type MyClass; #[wasm_bindgen(constructor)] fn new() -> MyClass; #[wasm_bindgen(method, getter)] fn number(this: &MyClass) -> u32; #[wasm_bindgen(method, setter)] fn set_number(this: &MyClass, number: u32) -> MyClass; #[wasm_bindgen(method)] fn render(this: &MyClass) -> String; } // lifted from the `console_log` example #[wasm_bindgen] extern "C" { #[wasm_bindgen(js_namespace = console)] fn log(s: &str); } #[wasm_bindgen(start)] fn run() { log(&format!("Hello from {}!", name())); // should output "Hello from Rust!" let x = MyClass::new(); assert_eq!(x.number(), 42); x.set_number(10); log(&x.render()); } }
你也可以 探索配置导入的完整方法列表