用於構建快速,可靠的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 !