使用 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 (nullundefined) ,则 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";
}
#}