مكونات ثيم Discourse تدعم Wasm الآن

WebAssembly (Wasm) هي تقنية يتم شحنها في جميع المتصفحات الحديثة والتي تتيح للمطورين شحن برامج ثنائية محمولة.

هذا يعني أنه يمكن للمطورين استخدام أي لغة برمجة تقريبًا واستهداف الويب.

في سياق Discourse، يفتح هذا الباب لشحن مجموعة غنية إلى حد ما من الملحقات التي كانت متاحة فقط لمنشئي الإضافات في الماضي.

يمكن أن تشمل الأمثلة:

  • وضع علامات مائية على الصور / تغيير حجمها / قصها
  • إنشاء الرسوم البيانية باستخدام graphviz أو svgbob
  • صناديق الرمل البرمجية (على سبيل المثال: مشاركات تتضمن وقت تشغيل Ruby)
  • وأكثر من ذلك بكثير

في الماضي، وبسبب سياسة أمان المحتوى في Discourse، تم إيقاف الوصول إلى Wasm باستثناء التثبيتات التي تحتوي على تحميلات محلية ولا تستخدم شبكة توصيل المحتوى (CDN).

تمت إضافة واجهات جديدة إلى جانب العميل لدعم شحن أصول JavaScript في سمة يمكن الوصول إليها بشكل غير مشروط عبر النطاق المحلي.

هذا يمكّن مطوري السمات من استضافة Wasm بشكل نظيف، والتدفق هو:

مكون → عامل ويب محلي → Wasm مستضاف على شبكة توصيل المحتوى (CDN)

https://meta.discourse.org/t/discourse-svgbob/223573 هو مثال شامل للأنماط الجديدة، والتغييران الرئيسيان هما:

  1. جميع أصول .js متاحة أيضًا خارج شبكة توصيل المحتوى (CDN) على الخادم المحلي:
{
...
  "assets": {
    "worker": "assets/will-be-avilable-on-local.js"
  }
}
  1. يمكن الوصول إلى عنوان URL للأصل المحلي عبر settings.theme_uploads_local

لذلك في المثال أعلاه:

settings.theme_uploads_local.worker; // الأصل المحلي
settings.theme_uploads.worker; // أصل شبكة توصيل المحتوى (CDN)
36 إعجابًا

ليس متعلقًا بـ wasm على وجه التحديد، ولكني وجدت شيئًا آخر مثيرًا للاهتمام حول هذا الرمز، هل هو جديد؟

في مثالك، لم يعد loadScript مطلوبًا؟ (أعتقد أن الاستيراد زائد عن الحاجة؟):

وبدلاً من ذلك، يتم تحميل البرنامج النصي للعامل JIT عندما يُكتشف أن العامل غير موجود؟

باستخدام عنوان URL المبني من مرجع الأصول.

هذا نمط جيد ومفيد للغاية!

ومع ذلك، لدي سؤال حول العمال.

إذا استخدمت برنامجًا نصيًا لعامل طرف ثالث، وكان يحتوي على عبارات importScripts() لتضمين برامج نصية إضافية في النطاق العام للعامل، فكيف أقوم بتضمين هذه البرامج النصية للاستيراد داخل مكون السمة؟

قد أكون أسأل: كيف نطلب برنامجًا نصيًا من عنوان URL داخل مكون سمة Discourse؟

إعجابَين (2)

ما فعلته في هذا السيناريو هو استخدام postMessage من البرنامج النصي الرئيسي لـ JS مع عناوين URL المراد استيرادها. يتم استقبال هذا في معالج الرسائل في العامل الذي يمكنه importScript عناوين URL المستلمة.

إعجابَين (2)

شكرا رافائيل!. هل لديك مثال مفتوح المصدر للإشارة إليه؟

إعجابَين (2)

لقد استخدمت هذا النمط نفسه في النواة

6 إعجابات

أنا أستخدم منشئ السمات لإنشاء مكون سمة جديد من المفترض أن يستخدم wasm. كنقطة انطلاق، حاولت تحميل svgbob كمكون سمة. ومع ذلك، لم يُسمح لي بذلك، لأنه يحتوي على ملف wasm.

هل هذا قيد مقصود لمنشئ السمات؟ أم لا يمكن للمرء تثبيت svgbob كما هو؟

إعجابَين (2)

أعتقد أن لدينا فقط قيودًا على أنواع الملفات في منشئ السمات تحتاج إلى رفعها.

3 إعجابات

لقد أعدت تعيين themecreator لاستخدام “ملحقات السمات المصرح بها” الافتراضية، والتي تتضمن WASM. لذا يجب أن تعمل الآن يا @Heinenen.

(لست متأكدًا من سبب وجودها على إعداد غير افتراضي… ربما في الماضي كانت إحدى الملحقات الشائعة مفقودة :man_shrugging:)

إعجابَين (2)

نعم، رائع جدًا، يمكنني تأكيد أنه يعمل الآن. شكرًا لك!

3 إعجابات

حسنًا، يبدو أنني بحاجة إلى التراجع قليلاً، لا أعتقد أن الأمر يعمل بشكل مثالي حتى الآن.
حاولت تحميل svgbob مرة أخرى وقد نجح ذلك.

بعد محاولة تحميل ملف wasm الخاص بي، المأخوذ من MDN، أحصل على الخطأ:
حدث خطأ: لقد قدمت معلمات غير صالحة للطلب: السلسلة تحتوي على بايت فارغ

على حاوية التطوير الخاصة بي، هذه ليست مشكلة ويمكنني تحميل نفس الملف دون مشكلة.

إعجابَين (2)

أليس تشغيل ملف ثنائي من موقع الويب يمثل تعرضًا أمنيًا يجب اختياره بعناية؟ قد يكون هذا سببًا لعدم كونه افتراضيًا. ماذا تعتقد يا @Roman؟

إعجاب واحد (1)

إنه مسموح به في السمات افتراضيًا. لقد تم تغيير إعداد الموقع فقط على discourse.theme-creator.io. (هذا موقع discourse عادي، مع إضافة تسمح لأي شخص بتحميل ومشاركة السمات).

لا يزال WASM محصورًا في المتصفح، لذا فإن التعرض الأمني يعادل ملف .js.

4 إعجابات