不能直接实现。 #[wasm_bindgen]
属性依赖于能够解析结构体和 impls 以生成绑定。您需要创建包装类型和函数,供属性进行绑定。
假设您的 myproject-lib
如下:
pub struct MyStruct {
pub foo: i32,
}
impl MyStruct {
pub fn bar(&self) {
}
}
绑定将在
myproject-web
中实现,例如:
use myproject_lib::*;
use wasm_bindgen::prelude::*;
#[wasm_bindgen(js_name = MyStruct)]
pub struct MyStructWrapper(MyStruct);
#[wasm_bindgen(js_class = MyStruct)]
impl MyStructWrapper {
#[wasm_bindgen(getter)]
pub fn foo(&self) -> i32 {
self.0.foo
}
#[wasm_bindgen(setter)]
pub fn set_foo(&mut self, value: i32) {
self.0.foo = value;
}
pub fn bar(&self) {
self.0.bar();
}
}
正如您所看到的一样,所有工作都是非常明确地完成的。
我相信更广泛使用的方法是将绑定添加到原始库中,但仅在启用功能时才启用。这避免了很多重复工作,实现起来更加轻松,并确保绑定始终保持同步。
在Cargo.toml
中添加一个名为"wasm"
的特性,将wasm-bindgen
作为可选择的依赖项添加进去:
[features]
wasm = ["wasm-bindgen"]
[dependencies]
wasm-bindgen = { version = "X.X.X", optional = true }
然后您可以使用 cfg
和 cfg_attr
,仅在启用该功能时才启用wasm_bindgen
属性:
#[cfg(feature = "wasm")]
use wasm_bindgen::prelude::*;
#[cfg_attr(feature = "wasm", wasm_bindgen)]
pub struct MyStruct {
pub foo: i32,
}
#[cfg_attr(feature = "wasm", wasm_bindgen)]
impl MyStruct {
pub fn bar(&self) {
}
}
#[wasm_bindgen]
,使用 Rust 的条件编译和 features 来只在依赖于 lib 的 crate 需要时才#[wasm_bindgen]
。 - MindSwipe