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; } #}
js_name
属性也可以用于 JavaScript 模块使用 export default
的情况。在这种情况下,在 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; } #}