يعتبر
Yew نظيرًا لـ React و Elm ، وقد كتب بالكامل في Rust وتم تجميعه في WebAssembly النزيه. في المقالة ، يتحدث دينيس كولودين ، مطور Yew ، عن كيفية إنشاء إطار بدون جامع القمامة ، والتأكد من أنه غير قابل للتغيير ، دون الحاجة إلى نسخ الحالة بسبب قواعد ملكية بيانات Rust ، وما هي الميزات عند ترجمة Rust إلى WebAssembly.
تم إعداد المنشور على أساس تقرير دينيس في مؤتمر HolyJS 2018 Piter . تحت قص - نص الفيديو ونسخة من التقرير.تعمل Denis Kolodin في Bitfury Group ، وهي شركة تقوم بتطوير العديد من حلول blockchain. لأكثر من عامين حتى الآن ، تم ترميزها في Rust ، وهي لغة برمجة من Mozilla Research. خلال هذا الوقت ، تمكن دينيس من دراسة هذه اللغة بدقة واستخدامها في تطوير تطبيقات النظام المختلفة ، وهي الواجهة الخلفية. الآن ، فيما يتعلق بظهور معيار WebAssembly ، بدأت أتطلع نحو الواجهة الأمامية.جدول الأعمال
اليوم سنتعرف على ما هو Yew (اسم الإطار يقرأ نفس الكلمة الإنجليزية "أنت" - أنت ؛ "yew" هي شجرة الطقسوس المترجمة من الإنجليزية).
دعونا نتحدث قليلاً عن الجوانب المعمارية ، حول الأفكار التي تم بناء الإطار عليها ، حول الاحتمالات المضمنة فيه ، وكذلك حول الميزات التي يمنحناها Rust بالإضافة إلى اللغات الأخرى.
في النهاية ، سأوضح لك كيفية البدء في استخدام Yew و WebAssembly اليوم.
ما هو الطقسوس؟
بادئ ذي بدء ، هذا هو WebAssembly ، أي كود بايت قابل للتنفيذ يعمل في المتصفحات. هناك حاجة لتشغيل الخوارزميات المعقدة من جانب المستخدم ، على سبيل المثال ، التشفير ، التشفير / فك التشفير. من الأسهل تنفيذ ذلك في لغات النظام بدلاً من تثبيت العكازات.
WebAssembly هو معيار يتم وصفه بوضوح وفهمه ودعمه من قبل جميع المتصفحات الحديثة. يسمح لك باستخدام لغات برمجة مختلفة. وهذا مثير للاهتمام في المقام الأول لأنه يمكنك إعادة استخدام التعليمات البرمجية التي أنشأها المجتمع بلغات أخرى.
إذا كنت ترغب في ذلك ، يمكنك كتابة تطبيق بالكامل على WebAssembly ، ويتيح لك Yew القيام بذلك ، ولكن من المهم ألا تنسى أنه حتى في هذه الحالة تظل JavaScript في المتصفح. من الضروري إعداد WebAssembly - خذ الوحدة (WASM) ، وأضف البيئة إليها وقم بتشغيلها. على سبيل المثال جافا سكريبت لا غنى عنها. لذلك ، يستحق WebAssembly امتدادًا بدلاً من بديل ثوري لـ JS.
كيف تبدو التنمية

لديك مصدر ، هناك مترجم. يمكنك ترجمة كل هذا إلى تنسيق ثنائي وتشغيله في متصفح. إذا كان المتصفح قديمًا ، بدون دعم WebAssembly ، فيكون إذن emscripten مطلوبًا. هذا تقريبًا محاكي WebAssembly لمتصفح.
الطقسوس - جاهز لاستخدام إطار wasm
دعنا ننتقل إلى Yew. لقد قمت بتطوير هذا الإطار في نهاية العام الماضي. ثم كتبت نوعًا من تطبيق العملة المشفرة على Elm وواجهت حقيقة أنه بسبب القيود اللغوية لا يمكنني إنشاء هيكل متكرر. وفي تلك اللحظة فكرت: في روست ، سيتم حل مشكلتي بسهولة بالغة. وبما أن 99٪ من الوقت الذي أكتب فيه في Rust وأحب هذه اللغة فقط لميزاتها ، قررت أن أجرب - لتجميع التطبيق مع نفس وظيفة التحديث في Rust.
استغرق الرسم الأول مني عدة ساعات ، وكان عليّ معرفة كيفية تجميع WebAssembly. لقد أطلقته وأدركت أنه في غضون ساعات قليلة فقط كان قد وضع اللب ، وهو سهل التطوير. استغرق الأمر مني بضعة أيام فقط للوصول بكل شيء إلى الحد الأدنى لمحرك الهيكل.
لقد نشرته في مصدر مفتوح ، ولكن لم أتوقع أن يكون له أي شعبية. ومع ذلك ، فقد جمع اليوم أكثر من 4 آلاف نجمة على GitHub. يمكنك عرض المشروع
هنا . هناك العديد من الأمثلة.
الإطار مكتوب بالكامل باللغة الصدأ. يدعم Yew الترجمة مباشرة إلى WebAssembly (هدف wasm32-unknown-unknown) بدون emscripten. إذا لزم الأمر ، يمكنك العمل من خلال emscripten.
العمارة
الآن بضع كلمات حول كيفية اختلاف إطار العمل عن الأساليب التقليدية الموجودة في عالم JavaScript.
أولاً ، سأوضح لك القيود اللغوية التي واجهتها في Elm. خذ الحالة عندما يكون هناك نموذج ورسالة تسمح لك بتحويل هذا النموذج.
type alias Model = { value : Int } type Msg = Increment | Decrement
case msg of Increment -> { value = model.value + 1 } Decrement -> { value = model.value - 1 }
في Elm ، نقوم ببساطة بإنشاء نموذج جديد وعرضه على الشاشة. الإصدار السابق من النموذج يبقى دون تغيير. لماذا أركز على هذا؟ لأن النموذج في Yew قابل للتغيير ، وهذا هو أحد الأسئلة الأكثر شيوعًا. بعد ذلك ، سأشرح لماذا يتم ذلك.
في البداية ، اتبعت المسار الكلاسيكي عندما تم إعادة إنشاء النموذج. ولكن مع تطور الإطار ، رأيت أنه لا معنى لتخزين النسخة السابقة من النموذج. يسمح لك Rust بتعقب عمر جميع البيانات ، سواء تم تعديلها أم لا. وهكذا يمكنني تغيير النموذج بأمان ، مع العلم أن روست يتحكم في غياب الصراع.
struct Model { value: i64, } enum Msg { Increment, Decrement, }
match msg { Msg::Increment => { self.value += 1; } Msg::Decrement => { self.value -= 1; } }
هذه هي اللحظة الأولى. النقطة الثانية: لماذا نحتاج إلى النسخة القديمة من النموذج؟ في نفس الدردار ، لا توجد مشكلة في نوع من الوصول التنافسي. النموذج القديم مطلوب فقط لفهم موعد العرض. سمح لي الوعي بهذه اللحظة بالتخلص تمامًا من الثبات وعدم الاحتفاظ بالنسخة القديمة.

انظر إلى الخيار عندما يكون لدينا وظيفة
update
وحقلان -
value
name
. هناك قيمة يتم حفظها عند إدخال البيانات في حقل
input
. النموذج يتغير.

من المهم أن
value
لا تشارك في التقديم. وهكذا يمكننا تغييره بقدر ما نرغب. لكننا لسنا بحاجة للتأثير على شجرة DOM ولا نحتاج إلى بدء هذه التغييرات.
قادني ذلك إلى فكرة أن المطور فقط هو الذي يمكنه معرفة اللحظة المناسبة التي يحتاج فيها العرض بالفعل إلى البدء. للبدء ، بدأت في استخدام العلم - مجرد قيمة منطقية -
ShouldRender
، مما يشير إلى أن النموذج قد تغير ونحن بحاجة إلى بدء التقديم. في الوقت نفسه ، لا يوجد حمل للمقارنات المستمرة ، ولا يوجد استهلاك للذاكرة - التطبيقات المكتوبة بلغة Yew هي الأكثر فعالية.
في المثال أعلاه ، لم يكن هناك تخصيص للذاكرة على الإطلاق باستثناء الرسالة التي تم إنشاؤها وإرسالها. احتفظ النموذج بحالته ، وقد انعكس هذا في العرض فقط بمساعدة العلم.
الاحتمالات
إن كتابة إطار عمل يعمل في WebAssembly ليست مهمة سهلة. لدينا جافا سكريبت ، ولكن يجب أن يخلق نوعًا من البيئة للتفاعل معها ، وهذا قدر كبير من العمل. بدا الإصدار الأولي من هذه الحزم مثل هذا:

أخذت عرضًا توضيحيًا من مشروع آخر. هناك العديد من المشاريع التي تسير على هذا النحو ، لكنها تؤدي بسرعة إلى طريق مسدود. بعد كل شيء ، يعد الإطار تطورًا كبيرًا إلى حد ما ويجب عليك كتابة الكثير من كود الإرساء. بدأت في استخدام مكتبات في روست تسمى الصناديق ، على وجه الخصوص ،
Stdweb
.
شبيبة متكاملة
بمساعدة وحدات الماكرو Rust ، يمكنك توسيع اللغة - يمكننا تضمين أجزاء من JavaScript في شفرة Rust ، وهذه ميزة مفيدة جدًا للغة.
let handle = js! { var callback = @{callback}; var action = function() { callback(); }; var delay = @{ms}; return { interval_id: setInterval(action, delay), callback: callback, }; };
سمح لي استخدام وحدات الماكرو و Stdweb بكتابة جميع الروابط الضرورية بسرعة وكفاءة.
قوالب Jsx
في البداية ، ذهبت في مسار Elm وبدأت في استخدام النماذج التي تم تنفيذها باستخدام التعليمات البرمجية.
fn view(&self) -> Html<Context, Self> { nav("nav", ("menu"), vec![ button("button", (), ("onclick", || Msg::Clicked)), tag("section", ("ontop"), vec![ p("My text...") ]) ]) }
لم أكن أبدًا من أنصار React. ولكن عندما بدأت في كتابة إطار العمل الخاص بي ، أدركت أن JSX في React شيء رائع جدًا. هنا عرض ملائم للغاية لقوالب الكود.
ونتيجة لذلك ، أخذت ماكرو على Rust وطبقت مباشرة داخل Rust القدرة على كتابة ترميز HTML الذي يولد على الفور عناصر شجرة افتراضية.
impl Renderable<Context, Model> for Model { fn view(&self) -> Html<Context, Self> { html! { <div> <nav class="menu",> <button onclick=|_| Msg::Increment,>{ "Increment" }</button> <button onclick=|_| Msg::Decrement,>{ "Decrement" }</button> </nav> <p>{ self.value }</p> <p>{ Local::now() }</p> </div> } } }
يمكننا القول أن القوالب الشبيهة بـ JSX هي قوالب كود نقية ، ولكن على المنشطات. يتم تقديمها بتنسيق مناسب. لاحظ أيضًا أنه هنا أدرج تعبير Rust مباشرة في الزر (يمكن إدراج تعبير Rust داخل هذه القوالب). هذا يسمح لك بالاندماج عن كثب.
مكونات منظمة إلى حد ما
ثم بدأت في تطوير النماذج وأدركت إمكانية استخدام المكونات. هذه هي القضية الأولى التي تم إجراؤها في المستودع. لقد قمت بتطبيق المكونات التي يمكن استخدامها في رمز القالب. تعلن ببساطة بنية صادقة في Rust وتكتب بعض الخصائص لذلك. ويمكن تعيين هذه الخصائص مباشرة من القالب.

مرة أخرى ، ألاحظ أن المهم هو أن يتم إنشاء هذه القوالب الصدأ رمز الصدق. لذلك ، سوف يلاحظ المترجم أي خطأ هنا. على سبيل المثال لا يمكنك أن تكون مخطئًا ، كما هو الحال غالبًا في تطوير JavaScript.
المناطق المكتوبة
ميزة أخرى مثيرة للاهتمام هي أنه عندما يتم وضع مكون داخل مكون آخر ، يمكن أن يرى نوع رسالة الأصل.

يقوم المترجم بربط هذه الأنواع بشكل صارم ولن يمنحك الفرصة لارتكاب خطأ. عند معالجة الأحداث ، يجب أن تتطابق الرسائل التي يتوقع المكوِّن أو يمكن أن يرسلها مع الوالد.
ميزات أخرى
لقد قمت بنقل تنفيذ من Rust مباشرة إلى الإطار الذي يسمح لك بسهولة باستخدام تنسيقات تسلسل / إلغاء تسلسل مختلفة (تزويده بأغلفة إضافية). فيما يلي مثال: نذهب إلى التخزين المحلي ، واستعادة البيانات ، حدد غلافًا معينًا - ما نتوقعه هنا هو json.
Msg::Store => { context.local_storage.store(KEY, Json(&model.clients)); } Msg::Restore => { if let Json(Ok(clients)) = context.local_storage.restore(KEY) { model.clients = clients; } }
يمكن أن يكون أي تنسيق ، بما في ذلك ثنائي. وبالتالي ، يصبح التسلسل وإلغاء التسلسل شفافًا ومريحًا.
جاءت فكرة فرصة أخرى نفذتها من مستخدمي الإطار. طلبوا عمل شظايا. وهنا صادفت شيئًا مثيرًا للاهتمام. بالنظر إلى JavaScript القدرة على إدراج أجزاء في شجرة DOM ، قررت أولاً أنه سيكون من السهل جدًا تنفيذ هذه الوظيفة في إطار العمل الخاص بي. لكنني جربت هذا الخيار ، وتبين أنه لا يعمل. كان علي أن أفهمها ، أمشي على هذه الشجرة ، لأرى ما الذي تغير هناك ، إلخ.
يستخدم إطار Yew شجرة DOM افتراضية ، كل شيء موجود في البداية فيه. في الواقع ، عندما تكون هناك بعض التغييرات في القالب ، فإنها تتحول إلى تصحيحات تغير بالفعل شجرة DOM المعروضة.
html! { <> <tr><td>{ "Row" }</td></tr> <tr><td>{ "Row" }</td></tr> <tr><td>{ "Row" }</td></tr> </> }
مزايا إضافية
يوفر الصدأ العديد من الميزات القوية المختلفة ، سأتحدث فقط عن أهمها.
الخدمات: التفاعل مع العالم الخارجي
أول فرصة أريد الحديث عنها هي الخدمات. يمكنك وصف الوظائف اللازمة في شكل خدمة ما ، ونشرها كصندوق وإعادة استخدامها.
في Rust ، يتم تنفيذ القدرة على إنشاء مكتبات ودمجها وإرساءها ولصقها بشكل جيد للغاية. في الواقع ، يمكنك إنشاء واجهات برمجة تطبيقات متنوعة للتفاعل مع خدمتك ، بما في ذلك واجهات JavaScript. في الوقت نفسه ، يمكن أن يتفاعل الإطار مع العالم الخارجي ، على الرغم من حقيقة أنه يعمل داخل وقت تشغيل WebAssembly.
أمثلة على الخدمات:
- TimeOutService ؛
- IntervalService ؛
- FetchService ؛
- WebSocketService ؛
- خدمات مخصصة ...
خدمات الصدأ
والصناديق :
crates.io .
السياق: متطلبات الدولة
الشيء الآخر الذي قمت بتطبيقه في الإطار ليس تقليديًا تمامًا ، هو السياق. يحتوي React على واجهة برمجة تطبيقات Context API ، لكنني استخدمت السياق بمعنى مختلف. يتكون إطار Yew من المكونات التي تقوم بها ، والسياق هو حالة عالمية. قد لا تأخذ المكونات هذه الحالة العالمية في الاعتبار ، ولكنها قد تقدم بعض المطالب - بحيث يستوفي الكيان العالمي بعض المعايير.
لنفترض أن مكوننا المجرد يتطلب القدرة على تحميل شيء إلى S3.

يمكن أن نرى أدناه أنه يستخدم هذا التحميل ، أي يرسل البيانات إلى S3. يمكن وضع هذا المكون على شكل رف. سيواجه المستخدم الذي يقوم بتنزيل هذا المكون وإضافته داخل القالب إلى تطبيقه خطأً - سيسأله المترجم أين دعم S3؟ سيتعين على المستخدم تنفيذ هذا الدعم. بعد ذلك ، يبدأ المكون تلقائيًا في العيش حياة كاملة.
أين هو مطلوب؟ تخيل أنك تقوم بإنشاء مكون بتشفير ذكي. لديه متطلبات أن يسمح السياق المحيط له بتسجيل الدخول في مكان ما. كل ما عليك فعله هو إضافة نموذج تفويض في القالب وفي السياق الخاص بك تنفيذ الاتصال مع الخدمة الخاصة بك. على سبيل المثال سيكون حرفيا ثلاثة أسطر من التعليمات البرمجية. بعد ذلك ، يبدأ المكون في العمل.
تخيل أن لدينا عشرات المكونات المختلفة. وجميعهم لديهم نفس المتطلبات. هذا يسمح لك بتنفيذ نوع من الوظائف مرة واحدة لإحياء جميع المكونات وسحب البيانات المطلوبة. الحق خارج السياق. ولن يسمح لك المترجم بارتكاب خطأ: إذا لم يكن لديك واجهة تتطلب مكونًا ، فلن يعمل أي شيء.
لذلك ، يمكنك بسهولة إنشاء أزرار دقيقة للغاية ستطلب بعض API أو ميزات أخرى. بفضل Rust ونظام هذه الواجهات (يطلق عليها سمة في Rust) ، يصبح من الممكن الإعلان عن متطلبات المكونات.
لن يسمح لك المترجم بارتكاب خطأ
تخيل أننا نقوم بإنشاء مكون يحتوي على بعض الخصائص ، أحدها هو القدرة على إعادة الاتصال. وعلى سبيل المثال ، قمنا بتعيين الخاصية وفاتنا حرف واحد باسمها.

في محاولة للترجمة ، يستجيب Rust بسرعة. يقول أننا أخطأنا ولا توجد مثل هذه الممتلكات:

كما ترى ، يستخدم Rust هذا النموذج مباشرةً ويمكنه عرض جميع الأخطاء داخل الماكرو. يقول لك ما يجب أن يسمى الممتلكات حقا. إذا تجاوزت المترجم ، فلن يكون لديك أخطاء وقت تشغيل سخيفة مثل الأخطاء المطبعية.
تخيل الآن ، لدينا زر يطلب من سياقنا العالمي أن يكون قادرًا على الاتصال بـ S3. وإنشاء سياق لا ينفذ دعم S3. دعنا نرى ما يحدث.

أفاد المترجم أننا أدرجنا زرًا ، لكن هذه الواجهة لم يتم تنفيذها للسياق.

يبقى فقط للذهاب إلى المحرر ، إضافة رابط إلى Amazon في السياق ، وسيبدأ كل شيء. يمكنك إنشاء خدمات جاهزة باستخدام نوع ما من API ، ثم ببساطة إضافة إلى السياق ، واستبدال ارتباط به ، ويبدأ المكون على الفور في الحياة. يتيح لك هذا القيام بأشياء رائعة جدًا: فأنت تضيف مكونات ، وتخلق سياقًا ، وتحشوها بالخدمات. وكل هذا يعمل بشكل تلقائي تمامًا ؛ هناك حاجة إلى الحد الأدنى من الجهود لربطه معًا.
كيف تبدأ باستخدام Yew؟
من أين تبدأ إذا كنت ترغب في محاولة تجميع تطبيق WebAssembly؟ وكيف يمكن القيام بذلك باستخدام إطار Yew؟
تجميع من الصدأ إلى الغشاء
أولا ، تحتاج إلى تثبيت المترجم. هناك أداة الصدأ لهذا:
curl https://sh.rustup.rs -sSf | sh
بالإضافة إلى ذلك ، قد تحتاج إلى emscripten. ما فائدة ذلك؟ تم تطوير معظم المكتبات التي تمت كتابتها للغات برمجة النظام ، خاصة بالنسبة لـ Rust (نظام في الأصل) ، لأنظمة التشغيل Linux و Windows وأنظمة تشغيل كاملة أخرى. من الواضح أن المتصفح لا يحتوي على العديد من الميزات.
على سبيل المثال ، لا يتم إنشاء أرقام عشوائية في متصفح بنفس الطريقة التي يتم بها في Linux. emscripten مفيد إذا كنت تريد استخدام المكتبات التي تتطلب واجهة برمجة تطبيقات للنظام.
تتحول المكتبات والبنية التحتية بأكملها بهدوء إلى WebAssembly النزيهة ، ولم تعد هناك حاجة إلى emscripten (أنت تستخدم القدرات المستندة إلى JavaScript لإنشاء أرقام عشوائية وأشياء أخرى) ، ولكن إذا كنت بحاجة إلى إنشاء شيء غير مدعوم في المتصفح على الإطلاق ، فلا يمكنك الاستغناء عن emscripten .
أوصي أيضًا باستخدام ويب بضائع:
cargo install cargo-web
من الممكن تجميع WebAssembly بدون أدوات مساعدة إضافية. لكن cargo-web هي أداة رائعة توفر العديد من الأشياء المفيدة لمطوري JavaScript. على وجه الخصوص ، سيراقب الملفات: إذا قمت بإجراء أي تغييرات ، فسيبدأ في الترجمة على الفور (لا يوفر المترجم مثل هذه الوظائف). في هذه الحالة ، سيسمح لك Cargo-web بتسريع عملية التطوير. هناك أنظمة بناء مختلفة لـ Rust ، لكن الشحن هو 99.9٪ من جميع المشاريع.
يتم إنشاء مشروع جديد على النحو التالي:
cargo new --bin my-project
[package]
name = "my-project"
version = "0.1.0"
[dependencies]
yew = "0.3.0"
ثم ابدأ المشروع فقط:
cargo web start --target wasm32-unknown-unknown
أعطيت مثالاً على WebAssembly الصادقة. إذا كنت بحاجة إلى ترجمة تحت emscripten (يمكن لمحول الصدأ أن يربط emscripten نفسه) ، يمكنك إدراج كلمة
emscripten
في آخر عنصر
unknown
، مما يسمح لك باستخدام المزيد من الصناديق. لا تنس أن emscripten هي مجموعة إضافية كبيرة إلى حد ما لملفك. لذلك ، من الأفضل كتابة رمز WebAssembly الصادق.
القيود القائمة
يمكن لأي شخص لديه خبرة في البرمجة بلغات برمجة النظام أن يشعر بالإحباط بسبب القيود الموجودة في إطار العمل. لا يمكن استخدام جميع المكتبات في WebAssembly. على سبيل المثال ، في بيئة JavaScript لا توجد سلاسل رسائل. لا يعلن WebAssembly هذا من حيث المبدأ ، وبالطبع يمكنك استخدامه في بيئة متعددة الخيوط (هذا سؤال مفتوح) ، ولكن JavaScript لا تزال بيئة مفردة الترابط. نعم ، هناك عمال ، لكن هذه عزلة ، لذلك لن يكون هناك تدفقات هناك.
يبدو أنه يمكنك العيش بدون تدفقات. ولكن إذا كنت ترغب في استخدام المكتبات التي تعتمد على سلاسل المحادثات ، على سبيل المثال ، فأنت تريد إضافة نوع من وقت التشغيل ، فقد لا ينجح هذا.
أيضًا ، لا توجد واجهة برمجة تطبيقات للنظام ، باستثناء تلك التي ستنقلها من جافا سكريبت إلى WebAssembly. لذلك ، لن يتم نقل العديد من المكتبات. لا يمكنك كتابة وقراءة الملفات مباشرة ، ولا يمكن فتح مآخذ ، ولا يمكنك الكتابة على الشبكة. إذا كنت تريد إنشاء مقبس ويب ، على سبيل المثال ، فأنت بحاجة إلى سحبه من JavaScript.
عيب آخر هو أن مصحح WASM موجود ، ولكن لم يره أحد. لا يزال في هذه الحالة الخام أنه من غير المحتمل أن يكون مفيدًا لك. لذا فإن تصحيح أخطاء WebAssembly هو سؤال صعب.
عند استخدام Rust ، سيتم ربط جميع مشاكل وقت التشغيل تقريبًا بالأخطاء في منطق الأعمال ، وسيكون من السهل إصلاحها. ولكن نادرًا ما تظهر الأخطاء ذات المستوى المنخفض - على سبيل المثال ، تقوم إحدى المكتبات بالإرساء الخطأ - وهذا بالفعل سؤال صعب. على سبيل المثال ، في الوقت الحالي ، هناك مشكلة من هذا القبيل: إذا جمعت إطار العمل مع emscripten وكانت هناك خلية ذاكرة متغيرة ، يتم التخلص من حيازتها ، يتم إعطاؤها ، ينهار emscripten في مكان ما في الوسط (وأنا لست متأكدًا حتى إذا كان emscripten). تعرف ، إذا واجهتك مشكلة في مكان ما في الوسيطة على مستوى منخفض ، فسيكون إصلاحها صعبًا في الوقت الحالي.
مستقبل الإطار
كيف ستطور Yew أكثر؟ أرى الغرض الرئيسي منه في إنشاء مكونات متجانسة. سيكون لديك ملف WebAssembly المترجمة ، ويمكنك ببساطة لصقه في التطبيق. على سبيل المثال ، قد يوفر إمكانات تشفير أو عرض أو تحرير.
تكامل JS
سيتم تعزيز التكامل مع JavaScript. كتبت JavaScript عددًا كبيرًا من المكتبات الرائعة سهلة الاستخدام. وهناك أمثلة في المستودع تظهر فيها كيف يمكنك استخدام مكتبة JavaScript الموجودة مباشرة من إطار Yew.
CSS المكتوب
نظرًا لاستخدام Rust ، فمن الواضح أنه يمكنك إضافة CSS مكتوب يمكن إنشاؤه باستخدام الماكرو نفسه كما هو الحال في محرك نموذج يشبه JSX. في هذه الحالة ، سيتحقق المترجم ، على سبيل المثال ، إذا قمت بتعيين بعض السمات الأخرى بدلاً من اللون. هذا سيوفر أطنان من وقتك.
مكونات جاهزة
وأتطلع أيضًا إلى إنشاء مكونات جاهزة للاستخدام. على الإطار ، يمكنك عمل شقوق ستوفر ، على سبيل المثال ، مجموعة من بعض الأزرار أو العناصر التي سيتم توصيلها كمكتبة ، وإضافتها إلى القوالب واستخدامها.
تحسين الأداء في الحالات الخاصة
الأداء قضية دقيقة ومعقدة للغاية. هل WebAssembly أسرع من JavaScript؟ ليس لدي أي دليل يؤكد إجابة إيجابية أو سلبية. يبدو الأمر ، ووفقًا لبعض الاختبارات البسيطة جدًا التي أجريتها ، فإن WebAssembly سريع جدًا. وأنا واثق تمامًا من أن أدائها سيكون أعلى من أداء JavaScript ، لمجرد أنه رمز ثانوي منخفض المستوى حيث لا يلزم تخصيص الذاكرة وهناك العديد من اللحظات الأخرى التي تتطلب موارد.
المزيد من المساهمين
أود جذب المزيد من المساهمين. أبواب المشاركة في الإطار مفتوحة دائمًا. يمكن لكل من يريد ترقية شيء ما وفهم النواة وتحويل الأدوات التي يعمل عليها عدد كبير من المطورين الاتصال بسهولة وتعديل تعديلاته الخاصة.
وقد حضر المشروع بالفعل العديد من المساهمين. ولكن لا يوجد مساهمون أساسيون في الوقت الحالي ، لأنك تحتاج إلى فهم ناقلات تطوير الإطار ، ولكن لم يتم صياغته بوضوح بعد. ولكن هناك العمود الفقري ، الرجال الذين هم على دراية كبيرة في الطقسوس - حوالي 30 شخصًا. إذا كنت تريد أيضًا إضافة شيء إلى الإطار ، فيرجى دائمًا إرسال طلب سحب.
التوثيق
نقطة إلزامية في خططي هي إنشاء كمية كبيرة من الوثائق حول كيفية كتابة الطلبات على Yew. من الواضح أن نهج التنمية في هذه الحالة يختلف عما رأيناه في React و Elm.
في بعض الأحيان يظهر لي الرجال حالات مثيرة للاهتمام حول كيفية استخدام الإطار. ومع ذلك ، فإن إنشاء إطار عمل يختلف عن الكتابة عليه باحتراف. لا تزال ممارسات استخدام الإطار قيد التكوين.
جربه ، قم بتثبيت Rust ، قم بتوسيع قدراتك كمطور. سيكون إتقان WebAssembly مفيدًا لكل منا ، لأن إنشاء تطبيقات معقدة للغاية هو اللحظة التي ننتظرها لفترة طويلة. بمعنى آخر ، لا يتعلق WebAssembly بمتصفح الويب فقط ، ولكنه بشكل عام وقت تشغيل يتطور بالتأكيد وسيتطور بشكل أكثر نشاطًا.
إذا أعجبك التقرير ، انتبه: في 24-25 نوفمبر ، سيعقد HolyJS جديد في موسكو ، وسيكون هناك أيضًا العديد من الأشياء المثيرة للاهتمام. — , ( ).