ชุดเครื่องมือสำหรับการสร้างเว็บแอปพลิเคชันและห้องสมุดที่รวดเร็วเชื่อถือได้ด้วย Rust และ WASM
GLOO เป็นชุดของห้องสมุดและห้องสมุดเหล่านั้นให้ wrappers สนิมตามหลักสรีรศาสตร์สำหรับ API ของเบราว์เซอร์ web-sys / js-sys นั้นยากมาก / ไม่สะดวกที่จะใช้โดยตรงดังนั้น GLOO จึงมี wrappers รอบ BindNG แบบดิบซึ่งทำให้ง่ายต่อการใช้ API เหล่านั้น นี่คือเหตุผลที่เรียกว่า "ชุดเครื่องมือ" แทนที่จะเป็น "ห้องสมุด" หรือ "เฟรมเวิร์ก"
ในแผนงาน 2019 ของ Rust และ WebAssembly Working Working เราเลือกที่จะปลูกฝังระบบนิเวศห้องสมุดของเราโดยการสร้างชุดเครื่องมือแบบแยกส่วน:
การร่วมมือกันในชุดเครื่องมือแบบแยกส่วน
ความคิดในการสร้าง [ห้องสมุดระดับสูง] ในแบบแยกส่วนที่จะช่วยให้ผู้อื่นในชุมชนนำส่วนประกอบเข้าด้วยกันในวิธีที่แตกต่างกันเป็นเรื่องที่น่าตื่นเต้นสำหรับฉัน หวังว่าสิ่งนี้จะทำให้ระบบนิเวศแข็งแกร่งขึ้นมาก
โดยเฉพาะอย่างยิ่งฉันชอบที่จะเห็นความพยายามแบบแยกส่วนในการใช้ไลบรารี DOM เสมือนกับ JSX เช่นไวยากรณ์ มีความพยายามหลายอย่างในหน้านี้ แต่ทุกคนดูเหมือนจะค่อนข้างเสาหินและ "รวมแบตเตอรี่" ฉันหวังว่าสิ่งนี้จะเปลี่ยนแปลงในปี 2562
- Ryan Levick ใน Rust Webassembly 2019
อย่าสร้างไซโลที่มีตราสินค้า การสร้างแบรนด์อาจเป็นประโยชน์เพื่อให้ได้ชื่อเสียง แต่ถ้าเราต้องการให้เรื่องราว WASM ของ Rust ประสบความสำเร็จอย่างแท้จริงเราควรคิดถึงวิธีการทำงานร่วมกันแทนการแกะสลักดินแดน
- Yoshua Wuyts ใน WASM 2019
ในปี 2561 เราได้สร้างห้องสมุดพื้นฐานเช่น
js-sysและweb-sysในปี 2562 เราควรสร้างห้องสมุดระดับสูงที่อยู่ด้านบนของพวกเขาและรวบรวมห้องสมุดภายใต้ลังเครื่องมือร่มสำหรับประสบการณ์แบบองค์รวม ชุดเครื่องมือนี้และห้องสมุดของมันจะทำให้แบตเตอรี่ทั้งหมดที่คุณต้องการเมื่อกำหนดเป้าหมาย WASMการสร้างเว็บแอปพลิเคชัน Greenfield? ใช้ชุดเครื่องมือทั้งหมดเพื่อเข้าสู่พื้นดิน สร้างโมดูล WASM ขนาดเล็กอย่างระมัดระวังและรวมกลับเข้าสู่โครงการ JavaScript ที่มีอยู่หรือไม่? คว้าห้องสมุดเป้าหมายหนึ่งที่คุณต้องการจากชุดเครื่องมือและใช้ด้วยตัวเอง
Gloo เป็นชุดเครื่องมือแบบแยกส่วนนี้
รองรับทั้งเว็บแอปพลิเคชันและห้องสมุดขนาดเล็กเป้าหมาย: Gloo และคอลเลกชันของลังยูทิลิตี้ที่ประกอบขึ้นเป็นชุดเครื่องมือควรช่วยให้คุณมีประสิทธิผลหากคุณกำลังเขียนเว็บแอปพลิเคชันสนามสีเขียวด้วย Rust และ WASM และควรช่วยให้คุณมีประสิทธิผลหากคุณกำลังเขียนไลบรารี WASM ขนาดเล็กเป้าหมายที่จะรวมเข้ากับแอปพลิเคชัน JavaScript ที่มีอยู่
ปลูกฝังระบบนิเวศของห้องสมุดสนิมและ WASM: เราต้องการใช้ GLOO เป็นฟังก์ชั่นบังคับสำหรับการสร้างและแบ่งปันการสร้างบล็อกการพัฒนาเว็บ ประเภทของห้องสมุดที่ กรอบ หรือห้องสมุดระดับสูงจะต้องสร้าง เราต้องการคลี่คลายไลบรารีเหล่านี้อย่างชัดเจนและทำให้พวกเขาสามารถแบ่งปันได้ในระบบนิเวศทั้งหมด
ชุดเครื่องมือแบบแยกส่วนไม่ใช่เฟรมเวิร์ก: Gloo ควรเป็นคอลเลกชันที่หลวมของลังยูทิลิตี้ที่สามารถใช้เป็นรายบุคคลหรือทั้งหมดเข้าด้วยกัน Gloo ไม่คิดว่ามัน "เป็นเจ้าของ" เว็บเพจทั้งหมดว่ามันควบคุมฟังก์ชั่น start ของ WASM ฯลฯ การขาดสมมติฐานนี้ช่วยให้สามารถเข้าถึงกรณีการใช้งานได้มากขึ้น หากเป็นไปได้ GLOO ควรชอบอินเทอร์เฟซมากกว่าการใช้งานเพื่อให้การใช้งานที่แตกต่างกันด้วยวิธีการที่แตกต่างกันสามารถแลกเปลี่ยนได้
Fast: ลองใช้ประโยชน์จาก abstractions ที่ไม่มีค่าใช้จ่ายของ Rust และการออกแบบโดยคำนึงถึงประสิทธิภาพในใจเพื่อแสดงให้ทุกคนเห็นว่าเว็บสามารถทำได้เร็วแค่ไหน;)
เชื่อถือได้: ทุกลังควรได้รับการทดสอบอย่างละเอียด การทดสอบเบราว์เซอร์แบบไม่มีหัว การทดสอบ QuickCheck การใช้ระบบประเภทเพื่อทำให้บั๊กทั้งหมดเป็นไปไม่ได้
ขนาดเล็ก: ขนาดเล็กรหัสสำหรับโหลดหน้าเร็วขึ้น ไม่มีการดึงโครงสร้างพื้นฐานการตื่นตระหนกและการจัดรูปแบบโดยไม่ตั้งใจ ผู้ใช้ไม่ควรทำการแลกเปลี่ยนระหว่างการใช้ห้องสมุด GLOO และมีไบนารี WASM ขนาดเล็ก
สำนวน: เราต้องการสร้าง Rust-y APIs ซึ่งรู้สึกเป็นธรรมชาติที่จะใช้ API ของเว็บไม่ได้ออกแบบมาสำหรับภาษาสนิมและคุณสามารถรู้สึกถึงความต้านทานต่อความต้านทานที่ไม่ตรงกันทุกครั้ง ให้ถูกต้องกันสะพานเชื่อมช่องว่างและสร้างห้องสมุดที่มีความสุขที่จะใช้
ตัวอย่างนี้ใช้ 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 !