用于构建快速,可靠的Web应用程序和使用Rust和Wasm的库的工具包。
Gloo是库的集合,这些库为浏览器API提供了人体工程学的生锈包装纸。 web-sys / js-sys很难直接使用,因此Gloo为Raw Bindngs提供包装纸,从而更容易消耗这些API。这就是为什么它被称为“工具包”,而不是“库”或“框架”。
在Rust和Websembly工作组的2019年路线图中,我们选择通过建立模块化工具包故意培养我们的图书馆生态系统:
在模块化工具包上合作
以模块化的方式构建[高级图书馆]的想法,这将使社区中的其他人以不同的方式将组件放在一起,这对我来说非常令人兴奋。希望这将使生态系统变得更加强大。
特别是,我很想看到使用JSX(例如语法)实现虚拟DOM库的模块化努力。这方面已经做出了几项努力,但所有人似乎都相对单片,包括“电池”。我希望这将在2019年改变。
- Rust WebAssembly 2019的Ryan Levick
不要创建品牌孤岛。品牌推广可能对获得名望很有用。但是,如果我们真正希望Rust的Wasm故事成功,我们应该考虑合作而不是雕刻领土的方法。
- WASM 2019中的Yoshua Wuyts
在2018年,我们创建了
js-sys和web-sys等基础库。在2019年,我们应该在它们的顶部构建模块化的高级图书馆,并在雨伞工具包板条板下收集图书馆,以获得整体体验。该工具包及其库将在定位WASM时提供您想要的所有电池。构建Greenfield Web应用程序?使用整个工具包进行地面运行。仔细制定一个小的WASM模块,然后将其集成到现有的JavaScript项目中?从工具包中抓住您需要的一个目标库,然后单独使用它。
Gloo是这个模块化工具包。
支持整个Web应用程序和针对性的小型库: Gloo和组成其工具包的实用程序板条箱的收集,如果您正在编写带有Rust和Wasm的绿色网络应用程序,则可以帮助您提高效率。如果您正在编写一个将集成到现有的JavaScript应用程序中的针对性的WASM库,它也应该帮助您提高生产力。
培养Rust和WASM库生态系统:我们希望将Gloo用作强迫功能来创建和共享Web开发的构建基础。任何框架或高级库都需要构建的库种类。我们希望明确地删除这些库,并使它们可以在整个生态系统中共享。
模块化工具包,而不是框架: Gloo应该是可以单独或全部使用的实用程序板条箱集合。 Gloo不认为它“拥有”整个网页,它可以控制WASM start功能等。缺乏假设使得与单片框架相比,达到更多的用例(例如,从JS中替换Hot Code Path)可以达到更多的用例(例如,手术替换了Hot Code Path)。在可能的情况下,Gloo应该更喜欢接口而不是实现,以便可以交换不同方法的不同实现。
快速:让我们利用Rust的零成本抽象,并考虑到性能的设计,以向所有人展示网络的速度;)
可靠:每个板条箱都应进行彻底测试。无头浏览器测试。快速检查测试。使用类型系统使整个错误不可能。
小:更快的页面加载的小型代码大小。没有意外地拉动所有惊慌和格式化的基础设施。用户不必在使用Gloo库和拥有小的Wasm二进制文件之间取得权衡。
惯用性:我们想构建生锈的API,这种API自然使用。网络的API不是为Rust语言而设计的,您会时不时地感觉到阻抗不匹配。让我们纠正这一点,弥合差距,并制作出一种乐趣的库。
此示例使用gloo::events添加事件侦听器和gloo::timers以创建超时。它创建一个<button>元素,并添加一个“单击”事件侦听器。每当单击按钮时,它将开始一个第二个超时,将按钮的文本内容设置为“一秒钟前!”。
use gloo :: { 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 } )
}
} 想帮助我们建立Gloo吗?查看CONTRIBUTING.md !