js_name = blah

js_name 属性可用于绑定到 JavaScript 中与 Rust 中定义的标识符不同的函数。

最常见的情况是,它用于将驼峰式 JavaScript 标识符转换为蛇形式 Rust 标识符。


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_name = jsOftenUsesCamelCase)]
    fn js_often_uses_camel_case() -> u32;
}
#}

有时,它用于绑定到不是有效的 Rust 标识符的 JavaScript 标识符,在这种情况下,使用 js_name = "some string" 而不是 js_name = ident


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_name = "$$$")]
    fn cash_money() -> u32;
}
#}

但是,您也可以使用 js_name 为多态 JavaScript 函数定义多个签名。


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console, js_name = log)]
    fn console_log_str(s: &str);

    #[wasm_bindgen(js_namespace = console, js_name = log)]
    fn console_log_u32(n: u32);

    #[wasm_bindgen(js_namespace = console, js_name = log)]
    fn console_log_many(a: u32, b: &JsValue);
}
#}

所有这些函数都将在 JavaScript 中调用 console.log,但每个标识符在 Rust 中将只有一个签名。

请注意,如果在导入类型时使用 js_name,则在定义该类型的方法时还需要使用 js_class 属性


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_name = String)]
    type JsString;
    #[wasm_bindgen(method, getter, js_class = "String")]
    pub fn length(this: &JsString) -> u32;
}
#}

在 JavaScript 模块使用 export default 的情况下,也可以使用 js_name 属性。在这种情况下,在 type 声明上将 js_name 属性设置为 “default”,并在导出的对象的任何方法上将 js_class 属性 设置为 “default”,将生成正确的导入。

例如,一个可以直接在 JavaScript 中导入的模块

import Foo from "bar";

let f = new Foo();

可以使用 Rust 中的以下定义来访问


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen(module = "bar")]
extern "C" {
    #[wasm_bindgen(js_name = default)]
    type Foo;
    #[wasm_bindgen(constructor, js_class = default)]
    pub fn new() -> Foo;
}
#}