مجموعة أدوات لإنشاء تطبيقات ويب سريعة وموثوقة ومكتبات مع Rust و WASM.
Gloo عبارة عن مجموعة من المكتبات ، وتوفر تلك المكتبات أغلفة الصدأ المريحة لواجهة برواديات المتصفح. من الصعب للغاية / غير مريح للغاية استخدام web-sys / js-sys مباشرة ، لذا فإن Gloo يوفر أغلفة حول Bindngs الخام مما يجعل من السهل استهلاك واجهات برمجة التطبيقات هذه. هذا هو السبب في أنه يسمى "مجموعة الأدوات" ، بدلاً من "المكتبة" أو "الإطار".
في خريطة الطريق لعام 2019 الخاصة بمجموعة Rust and Webassembly ، اخترنا تنمية نظامنا الإيكولوجي للمكتبات عن عمد من خلال إنشاء مجموعة أدوات معيارية:
التعاون على مجموعة أدوات معيارية
فكرة بناء [المكتبات رفيعة المستوى] بطريقة معيارية تسمح للآخرين في المجتمع بوضع المكونات معًا بطريقة مختلفة أمر مثير للغاية بالنسبة لي. نأمل أن يجعل النظام البيئي كقوة أقوى بكثير.
على وجه الخصوص ، أحب أن أرى جهدًا معياريًا نحو تنفيذ مكتبة DOM الظاهرية مع بناء الجملة JSX. كانت هناك العديد من الجهود على هذه الجبهة ، لكن جميعها بدت متجانسة نسبيًا و "البطاريات المدرجة". آمل أن يتغير هذا في عام 2019.
- ريان ليفيك في Rust Webassembly 2019
لا تنشئ صوامع ذات علامة تجارية. قد تكون العلامة التجارية مفيدة لتحقيق الشهرة. ولكن إذا كنا نريد حقًا أن تنجح قصة Rust's WASM ، فيجب أن نفكر في طرق للتعاون بدلاً من نحت الأراضي.
- Yoshua Wuyts في WASM 2019
في عام 2018 ، أنشأنا مكتبات أساسية مثل
js-sysوweb-sys. في عام 2019 ، يجب أن نبني مكتبات معيارية وعالية المستوى فوقها ، ونجمع المكتبات تحت صندوق مجموعة أدوات المظلة لتجربة شاملة. ستجعل مجموعة الأدوات ومكتباتها جميع البطاريات التي تريدها عند استهداف WASM.بناء تطبيق ويب Greenfield؟ استخدم مجموعة الأدوات بأكملها لضرب الأرض. صياغة وحدة WASM صغيرة ودمجها مرة أخرى في مشروع جافا سكريبت حالي؟ احصل على تلك المكتبة المستهدفة التي تحتاجها من مجموعة الأدوات واستخدمها بنفسها.
Gloo هي مجموعة الأدوات المعيارية هذه.
دعم كل من تطبيقات الويب الكاملة والمكتبات الصغيرة المستهدفة: Gloo ، ومجموعة من صناديق الأدوات المساعدة التي تشكل مجموعة أدواتها ، يجب أن تساعدك على أن تكون منتجًا إذا كنت تكتب تطبيق ويب للحقل الأخضر مع Rust و WASM. ويجب أن يساعدك أيضًا في أن تكون منتجًا إذا كنت تكتب مكتبة WASM صغيرة مستهدفة سيتم دمجها في تطبيق JavaScript الحالي.
زراعة النظام الإيكولوجي لمكتبة الصدأ و WASM: نريد استخدام GLOO كدالة التأثير لإنشاء ومشاركة لبنات تطوير الويب. أنواع المكتبات التي تحتاج أي إطار أو مكتبة عالية المستوى إلى البناء. نريد فصل هذه المكتبات بشكل صريح وإتاحةها للمشاركة عبر النظام البيئي بأكمله.
مجموعة الأدوات المعيارية ، وليس الإطار: يجب أن تكون Gloo مجموعة فضفاضة من صناديق الأدوات المساعدة التي يمكن استخدامها بشكل فردي ، أو جميعًا معًا. لا تفترض Gloo أنه "يمتلك" صفحة الويب بأكملها ، وأنها تتحكم في وظيفة start WASM ، وما إلى ذلك. يتيح هذا الافتراضات للوصول إلى المزيد من حالات الاستخدام (مثل استبدال مسار الرمز الساخن من JS) أكثر من أطر العمل المتجانسة. كلما كان ذلك ممكنًا ، يجب أن تفضل Gloo واجهات على التطبيقات ، بحيث تكون التطبيقات المختلفة ذات الأساليب المختلفة قادرة على التبادل.
Fast: دعنا نستفيد من تجريدات الصفر من الصفر ، والتصميم مع وضع الأداء في الاعتبار ، لإظهار الجميع مدى سرعة الويب ؛)
موثوقة: يجب اختبار كل قفص بدقة. اختبارات المتصفح مقطوعة الرأس. اختبارات QuickCheck. باستخدام نظام النوع لجعل فئات كاملة من الأخطاء مستحيلة.
صغير: حجم رمز صغير لتحميل صفحة أسرع. لا تسحب بطريق الخطأ في جميع البنية التحتية للذعر والتنسيق. يجب ألا يضطر المستخدمون إلى إجراء تبادل بين استخدام مكتبات Gloo ووجود ثنائيات WASM الصغيرة.
Idiomatic: نريد بناء واجهات برمجة تطبيقات الصدأ ، التي تشعر بأنها طبيعية للاستخدام. لم يتم تصميم واجهات برمجة تطبيقات الويب الخاصة بلغة الصدأ ، ويمكنك أن تشعر بعدم تطابق المقتاومة بين الحين والآخر. دعنا نؤمن بذلك ، سدخل الفجوة ، ونصنع المكتبات التي هي فرحة للاستخدام.
يستخدم هذا المثال gloo::events إضافة مستمعي الأحداث و gloo::timers لإنشاء مهلة. يقوم بإنشاء عنصر <button> ويضيف مستمعًا "انقر فوق" إليه. كلما تم النقر فوق الزر ، يبدأ مهلة ثانية واحدة ، والتي تحدد محتوى نص الزر إلى "Hello من ثانية واحدة!".
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 .