على مدى الأشهر القليلة الماضية، كنا نعمل على نظام بناء جديد لتعليمات JavaScript الإضافية (plugins). سيؤدي هذا إلى تحديث الإضافات بما يتماشى مع التغييرات التي أجريناها على نظام بناء الثيمات في يوليو 2025، والتي تعتمد على تقنيات المتصفح الأكثر حداثة وأدوات بناء JS.
هذا التغيير متوافق إلى حد كبير مع الإصدارات السابقة. لن يحتاج معظم مطوري الإضافات إلى القيام بأي شيء. ![]()
الفوائد
بالإضافة إلى التحديث الداخلي، سيجلب هذا التغيير عددًا من الفوائد الوظيفية لمطوري ومستضيفي Discourse:
-
يتم تخزين أصول الإضافة مؤقتًا بكثافة، ويتم ربطها على أساس كل إضافة على حدة. هذا يعني أن إعادة تشغيل الخادم الخاص بك في وضع التطوير لن تتطلب إعادة بناء جميع الإضافات من الصفر.
-
يمكننا البدء في تضمين التعليمات البرمجية المترجمة مسبقًا للإضافات الشائعة في حزم الأصول الحالية لدينا. أثناء إعادة البناء، ستحتاج فقط الإضافات التي تم تغييرها/إضافتها إلى البناء. سيكون هذا مفيدًا بشكل خاص للأجهزة ذات الموارد المحدودة
-
سيتم تحويل تعليمات الإضافة البرمجية إلى وحدة (module) ES أصلية. وهذا يجلب تركيبًا أبسط بكثير، وتنفيذًا أسرع في المتصفح، ويفتح المجال للاستخدام المستقبلي لأشياء مثل
import()لتقسيم الحزمة في المستقبل.
الاختبار / الجدول الزمني
لقد كنا نختبر هذا النظام داخليًا لبعض الوقت، وتحققنا من وظيفته على مئات الإضافات الرسمية. تعمل Meta بهذا النظام الجديد لأسابيع.
إذا كنت ترغب في تجربته بنفسك، يمكنك تعيين متغير البيئة ROLLUP_PLUGIN_COMPILER=1.
نخطط لتغيير القيمة الافتراضية قريبًا جدًا. ستكون هناك فترة وجيزة يمكن فيها تعطيل النظام الجديد باستخدام ROLLUP_PLUGIN_COMPILER=0، في حالة حدوث أي مفاجآت، ولكننا نعتزم إبقاء فترة الانتقال عند الحد الأدنى.
المشاكل المحتملة مع الإضافات المعقدة
بالنسبة للإضافات الأكثر تعقيدًا، هناك بعض الأشياء التي يكون النظام الجديد أكثر صرامة بشأنها:
-
استيراد وحدات المسؤول (admin modules) من تعليمات برمجية غير إدارية سيؤدي الآن إلى إثارة استثناء. لقد تم دائمًا التوصية بتجنب هذا، وكان يمكن أن يسبب أخطاء مفاجئة. والآن يتم اكتشافه وحظره بشكل أكثر تعمدًا.
إذا واجهت هذه المشكلة، يجب أن تفكر فيما إذا كان من الأفضل وضع تعليمات الإضافة البرمجية الخاصة بك في دليل مسؤول واجهة المستخدم (
admin/assets/javascripts/...). إذا كنت بحاجة حقًا إلى استيراد وحدات المسؤول بشكل شرطي، فيجب عليك استخدام مساعدoptionalRequireالأساسي لتحقيق ذلك. -
الاستيراد بين الإضافات (Cross-plugin imports) لا يزال مدعومًا. ومع ذلك، على غرار وحدات المسؤول، فإن استيراد الوحدات من إضافة غير مثبتة/مُمكّنة سيؤدي الآن إلى إثارة خطأ أكثر وضوحًا بكثير. إذا كان الاعتماد المتبادل بين الإضافات مقصودًا أن يكون اختياريًا، فيجب عليك استخدام مساعد
optionalRequireالأساسي. -
تغيرات التوقيت الدقيقة (Subtle timing changes) يمكن أن تسبب مشاكل في حالات نادرة. الآن بعد أن يتم تجميع تعليمات الإضافة البرمجية كوحدات ES أصلية، يتم تشغيل أي شيء في نطاق الوحدة (module scope) بشكل فوري. إذا كان لديك أي منطق غير معتاد في نطاق الوحدة، فقد تحتاج إلى نقله إلى تعليمات وقت التشغيل البرمجية (على سبيل المثال، داخل مُنشئ فئة، أو ما شابه).
إذا واجهت أياً من هذه المشكلات، وكنت بحاجة إلى مساعدة في حلها، فلا تتردد في النشر أدناه.