使用 static
访问 JS 对象
JavaScript 模块通常会导出任意静态对象,以供其提供的接口使用。可以通过在 extern
块中使用 #[wasm_bindgen(thread_local_v2)]
属性声明命名的 static
从 Rust 访问这些对象。wasm-bindgen
将为这些对象绑定一个 JsThreadLocal
,可以将其克隆到 JsValue
中。
这些值缓存在线程本地,仅用于绑定静态值或对象。对于可能更改其返回值或抛出错误的 getter,请参阅 如何导入 getter。
例如,给定以下 JavaScript
let COLORS = {
red: 'rgb(255, 0, 0)',
green: 'rgb(0, 255, 0)',
blue: 'rgb(0, 0, 255)',
};
static
可以帮助从 Rust 访问此对象
#![allow(unused)] fn main() { #[wasm_bindgen] extern "C" { #[wasm_bindgen(thread_local_v2)] static COLORS: JsValue; } fn get_colors() -> JsValue { COLORS.with(JsValue::clone) } }
由于 COLORS
实际上是一个 JavaScript 命名空间,我们可以使用相同的机制直接引用从 JavaScript 模块导出的命名空间,甚至引用导出的类
let namespace = {
// Members of namespace...
};
class SomeType {
// Definition of SomeType...
};
export { SomeType, namespace };
此模块的绑定
#![allow(unused)] fn main() { #[wasm_bindgen(module = "/js/some-rollup.js")] extern "C" { // Likewise with the namespace--this refers to the object directly. #[wasm_bindgen(thread_local_v2, js_name = namespace)] static NAMESPACE: JsValue; // Refer to SomeType's class #[wasm_bindgen(thread_local_v2, js_name = SomeType)] static SOME_TYPE: JsValue; // Other bindings for SomeType type SomeType; #[wasm_bindgen(constructor)] fn new() -> SomeType; } }
可选静态
如果您期望尝试访问的 JavaScript 值并非始终可用,则可以使用 Option<T>
来处理这种情况
#![allow(unused)] fn main() { extern "C" { type Crypto; #[wasm_bindgen(thread_local_v2, js_name = crypto)] static CRYPTO: Option<Crypto>; } }
如果在 JavaScript 中未声明或为 null(null
或 undefined
),则 crypto
将在 Rust 中简单地返回 None
。这还将考虑命名空间:仅当所有部分都声明且不为 null 时,它才会返回 Some(T)
。
静态字符串
可以导入字符串,以避免在只需要 JsString
时通过 TextDecoder/Encoder
。这在处理 TextDecoder/Encoder
不可用的环境(如音频工作器)中非常有用。
#![allow(unused)] fn main() { #[wasm_bindgen] extern "C" { #[wasm_bindgen(thread_local_v2, static_string)] static STRING: JsString = "a string literal"; } }