gpt4 book ai didi

rust - 是否可以在另一个 crate 中定义 #[wasm_bindgen] 公共(public)结构和函数?

转载 作者:行者123 更新时间:2023-12-03 11:36:35 25 4
gpt4 key购买 nike

我有一个箱子 lib包含大量结构和实现。然后我还有一个叫 web这将使核心的可移植性lib到网络。还有api以防我希望应用程序位于服务器端。

  • myproject-api
  • myproject-lib
  • myproject-web

  • 我不想要的是添加所有 wasmlib 的依赖关系, 仅在 web项目并将主库的部分公开给网络。有没有可能 #[wasm_bindgen] myproject-lib 中定义的结构在 myproject-web ?

    最佳答案

    不是直接的。 #[wasm_bindgen]属性依赖于能够解析结构和实现来生成绑定(bind)。您必须为要绑定(bind)的属性创建包装器类型和函数。
    说出你的 myproject-lib好像:

    pub struct MyStruct {
    pub foo: i32,
    }

    impl MyStruct {
    pub fn bar(&self) {
    // do something
    }
    }
    绑定(bind)将在 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(getter)]
    pub fn set_foo(&mut self, value: i32) {
    self.0.foo = value;
    }

    pub fn bar(&self) {
    self.0.bar();
    }
    }
    如您所见,一切都非常明确地完成。
  • 封装原始结构并使用 js_name 以原始名称导出它和 js_class
  • 列出并实现getters and setters公共(public)领域
  • 向原始结构添加简单的转发功能。

  • 我相信更广泛使用的方法是将绑定(bind)添加到原始库中,但仅由功能启用。这避免了很多重复,实现起来不那么令人头疼,并确保绑定(bind)始终同步。
    添加 "wasm" feature增加了 wasm-bindgen作为您的 Cargo.toml 中的一个选择加入依赖项:
    [features]
    wasm = ["wasm-bindgen"]

    [dependencies]
    wasm-bindgen = { version = "X.X.X", optional = true }
    然后你可以使用 cfg and 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) {
    // do something
    }
    }

    关于rust - 是否可以在另一个 crate 中定义 #[wasm_bindgen] 公共(public)结构和函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65332927/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com