8个版本
0.1.7 | 2024年6月17日 |
---|---|
0.1.6 | 2024年6月17日 |
#164 在 WebAssembly
51 每月下载量
用于 3 crate
330KB
225 行
IanaIO
一个用于使用Rust和Wasm构建快速、可靠的Web应用程序和库的工具包。
是什么?
IanaIO是一组库,这些库为浏览器API提供便利的Rust封装。 web-sys
/js-sys
直接使用非常困难/不方便,因此ianaio在原始绑定周围提供封装,这使得消费这些API变得更容易。这就是为什么它被称为“工具包”,而不是“库”或“框架”。
背景
在 2019年Rust和WebAssembly工作组路线图 中,我们选择有意识地通过构建模块化工具包来培养我们的库生态系统
协作构建模块化工具包
将[高级库]以模块化方式构建的想法,以便社区中的其他人以不同的方式将组件组合在一起,对我来说非常令人兴奋。这有望使整个生态系统变得更强大。
特别是,我非常希望看到一种模块化的努力,以实现具有JSX语法虚拟DOM库。在这方面已经有一些努力,但所有这些似乎相对集中且“一应俱全”。我希望这将在2019年有所改变。
— Ryan Levick 在 Rust WebAssembly 2019
不要创建品牌孤岛。品牌可能有助于获得知名度。但如果我们真的希望Rust的Wasm故事成功,我们应该考虑合作的方式,而不是划分领土。
— Yoshua Wuyts 在 Wasm 2019
在2018年,我们创建了基础库,例如
js-sys
和web-sys
。在2019年,我们应该在这些库的基础上构建模块化、高级的库,并将这些库收集到一个工具箱crate中,以获得整体体验。这个工具箱及其库将使您在针对Wasm时能够获得所有想要的电池。构建绿色Web应用程序?使用整个工具箱快速上手。仔细构建一个小型Wasm模块并将其集成到现有的JavaScript项目中?从工具箱中抓取您需要的那个目标库,并单独使用它。
IanaIO是这个模块化工具箱。
目标
-
支持整个Web应用程序和小型目标库: IanaIO及其工具箱中的实用crate集合应帮助您在使用Rust和Wasm编写绿色田野Web应用程序时提高生产效率。它还应帮助您在编写将集成到现有JavaScript应用程序中的小型目标Wasm库时提高生产效率。
-
培养Rust和Wasm库生态系统: 我们希望将IanaIO作为创建和共享Web开发构建块的动力。任何框架或高级库都需要构建的库。我们希望明确分离这些库,并使它们在整个生态系统中共享。
-
模块化工具箱,而不是框架: IanaIO应是一组可以单独使用或全部一起使用的实用crate集合。IanaIO不假设它“拥有”整个Web页面,它控制Wasm的
start
函数等。这种无假设的性质使它能够触及比单体框架更多的用例(如从JS中手术性地替换热代码路径)。 wherever possible,IanaIO应优先考虑接口而不是实现,以便不同方法的不同实现可以互换。 -
快速: 让我们利用Rust的零成本抽象,并考虑性能进行设计,向每个人展示Web可以有多快 ;)
-
可靠: 每个crate都应经过彻底测试。无头浏览器测试。Quickcheck测试。使用类型系统使整个类别的错误成为不可能。
-
小巧: 小型代码量以实现更快的页面加载。不会意外地引入所有恐慌和格式化基础设施。用户不需要在使用IanaIO库和拥有小型Wasm二进制文件之间做出权衡。
-
符合语言风格: 我们想构建Rust风格的API,感觉自然易用。Web的API并非为Rust语言设计,您有时会感受到阻抗不匹配。让我们纠正这一点,弥合差距,并创建令人愉悦的库。
示例
此示例使用 ianaio::events
添加事件监听器和 ianaio::timers
创建超时。它创建一个 <button>
元素,并向它添加一个“click”事件监听器。每当按钮被点击时,它将启动一个一秒的超时,将按钮的文本内容设置为“一秒前的问候!”。
use ianaio::{events::EventListener, timers::callback::Timeout};
use wasm_bindgen::prelude::*;
pub struct DelayedHelloButton {
button: web_sys::Element,
on_click: events::EventListener,
}
impl DelayedHelloButton {
pub fn new(document: &web_sys::Document) -> Result<DelayedHelloButton, JsValue> {
// Create a `<button>` element.
let button = document.create_element("button")?;
// Listen to "click" events on the button.
let button2 = button.clone();
let on_click = EventListener::new(&button, "click", move |_event| {
// After a one second timeout, update the button's text content.
let button3 = button2.clone();
Timeout::new(1_000, move || {
button3.set_text_content(Some("Hello from one second ago!"));
})
.forget();
});
Ok(DelayedHelloButton { button, on_click })
}
}
参与其中!
想帮助我们构建IanaIO?查看 CONTRIBUTING.md
!
依赖关系
~0–2.4MB
~43K SLoC