4个版本

0.1.3 2021年5月4日
0.1.2 2021年4月28日
0.1.1 2021年4月14日
0.1.0 2021年4月14日

#1184 in WebAssembly

MIT/Apache

375KB
8K SLoC

hotdrink-wasm

一个围绕hotdrink-rs的库,用于编译成WebAssembly。

Crates.io docs.rs

先决条件

该项目使用多个nightly特性,必须使用nightly Rust构建。我建议使用rustup,可以从这里下载,

您还需要wasm-pack将您的项目编译成WebAssembly,可以从这里下载。

为了将Web Workers作为线程使用,必须重新编译标准库以启用原子操作,这意味着我们需要标准库的源代码。这可以通过rustup component add rust-src来下载。

使用方法

将以下内容添加到您的Cargo.toml

hotdrink-wasm = "0.1.1"

单线程

use hotdrink_rs::{component, model::ConstraintSystem};
use hotdrink_wasm::{component_type_wrapper, constraint_system_wrapper};
use wasm_bindgen::{JsValue, prelude::wasm_bindgen};

component_type_wrapper! {
    pub struct ValueWrapper {
        #[derive(Clone, Debug)]
        pub enum Value {
            i32,
            String
        }
    }
}

constraint_system_wrapper!(MyCs, ValueWrapper, Value);

#[wasm_bindgen]
pub fn make_cs() -> Result<MyCs, JsValue> {
    let mut cs = ConstraintSystem::new();
    cs.add_component(component! {
        component MyComponent {
            let a: i32 = 0, b: String = "";
            // <contraints>
        }
    });
    MyCs::wrap(cs)
}

使用以下命令在www/pkg生成JavaScript模块后

wasm-pack build --out-dir www/pkg --release

您可以像这样使用包装器

let cs = wasm.make_cs();
cs.subscribe("MyComponent", "a",
    new_value => console.log("a =", new_value),
    () => console.log("a is pending"),
    err => console.log("a failed:", err)
);
cs.set_variable("MyComponent", "a", wasm.ValueWrapper.i32(5));
cs.set_variable("MyComponent", "b", wasm.ValueWrapper.String("Hello"));
cs.update();

多线程

请记得在您的Cargo.toml中添加thread功能标志。

hotdrink-wasm = { version = "0.1.1", features = ["thread"] }

要使用多线程约束系统,您将创建它,如下所示

use hotdrink_wasm::{component_type_wrapper};
#[cfg(feature = "thread")]
use hotdrink_wasm::{constraint_system_wrapper_threaded, thread::{StaticPool, TerminationStrategy}};

component_type_wrapper! {
    pub struct ValueWrapper {
        #[derive(Clone, Debug)]
        pub enum Value {
            i32,
            String
        }
    }
}

#[cfg(feature = "thread")]
constraint_system_wrapper_threaded!(
    MyCs,
    ValueWrapper,
    Value,
    StaticPool, // Or DynamicPool
    4,          // Number of threads
    TerminationStrategy::UnusedResultAndNotDone
);

要从Rust中使用Web Workers,我们必须使用--target no-modules进行编译。

wasm-pack build --out-dir www/pkg --target no-modules --release

这将生成www/pkg中的WebAssembly代码和JS包装器,然后可以在那里导入。有关更多信息,请参阅wasm-pack的文档。

许可证

根据您选择以下任一许可证

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您提交的任何有意包含在工作中的贡献,均将根据上述方式双重许可,不附加任何其他条款或条件。

依赖关系

~11MB
~197K SLoC