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
375KB
8K SLoC
hotdrink-wasm
一个围绕hotdrink-rs
的库,用于编译成WebAssembly。
先决条件
该项目使用多个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 License,版本2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您提交的任何有意包含在工作中的贡献,均将根据上述方式双重许可,不附加任何其他条款或条件。
依赖关系
~11MB
~197K SLoC