#web-apps #web-frontend #front-end #web-api #assembly #back-end #rust

ianaio

IanaIO后端前端用Rust Web Assembly RustWasm TS网站编写

8个版本

0.1.7 2024年6月17日
0.1.6 2024年6月17日

#164WebAssembly

Download history 204/week @ 2024-06-07 648/week @ 2024-06-14 67/week @ 2024-06-21 4/week @ 2024-06-28 13/week @ 2024-07-05 6/week @ 2024-07-19 45/week @ 2024-07-26

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-sysweb-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