wasm-bindgen
是一个强大的工具,它提供了多种方式来实现 Rust 和 JavaScript 之间的互操作性。
本文将总结 wasm-bindgen
的几种常见用法,并结合代码案例进行说明。
1. 使用 JavaScript 模块中的自定义函数
你可以在 Rust 中使用 extern "C"
块来声明从 JavaScript 导入的函数,然后在 Rust 中调用它们。
这种方式非常适合需要调用现有 JavaScript 函数的场景。
示例
- JavaScript 部分 (
foo.js
)
export function js_add(a, b) {
return a + b;
}
- Rust 部分
use wasm_bindgen::prelude::*;
// Declare the JavaScript function
#[wasm_bindgen(module = "/js/foo.js")]
extern "C" {
fn js_add(a: i32, b: i32) -> i32;
}
// Define a Rust function that uses the imported JavaScript function
#[wasm_bindgen]
pub fn add_in_rust(a: i32, b: i32) -> i32 {
js_add(a, b)
}
2. 使用 JavaScript 基础功能
如果你需要使用 JavaScript 的基础功能,可以依赖 js-sys
crate。
js-sys
提供了对 JavaScript 标准库的绑定,例如 Math
、Date
、Array
等。
示例
use wasm_bindgen::prelude::*;
use js_sys::Math;
#[wasm_bindgen]
pub fn random_number() -> f64 {
Math::random()
}
3. 使用 DOM 内容
如果你需要操作 DOM,可以依赖 web-sys
crate。
web-sys
提供了对 Web API 的绑定,例如 document
、window
、Element
等。
示例
use wasm_bindgen::prelude::*;
use web_sys::window;
#[wasm_bindgen]
pub fn set_document_title(title: &str) {
let window = window().expect("no global `window` exists");
let document = window.document().expect("should have a document on window");
document.set_title(title);
}