使用 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_variables)] #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_variables)] #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_variables)] #fn main() { extern "C" { type Crypto; #[wasm_bindgen(thread_local_v2, js_name = crypto)] static CRYPTO: Option<Crypto>; } #}
如果在 JavaScript 中未声明或为 nullish (null
或 undefined
) ,则 crypto
将在 Rust 中简单地返回 None
。这也将适用于命名空间:只有当所有部分都被声明且不为 nullish 时,它才会返回 Some(T)
。
静态字符串
可以导入字符串,以避免在仅需要 JsString
时通过 TextDecoder/Encoder
。当处理 TextDecoder/Encoder
不可用的环境时(例如在音频处理工作单元中)这会很有用。
# #![allow(unused_variables)] #fn main() { #[wasm_bindgen] extern "C" { #[wasm_bindgen(thread_local_v2, static_string)] static STRING: JsString = "a string literal"; } #}