على مدار الأشهر القليلة الماضية، عملنا على نظام بناء جديد لأكواد JavaScript الخاصة بالمكونات الإضافية (Plugins). سيؤدي هذا إلى تحديث المكونات الإضافية بما يتماشى مع التغييرات التي قمنا بها على نظام بناء السمات في يوليو 2025، والتي تعتمد على تقنيات المتصفحات الحديثة وأدوات بناء JavaScript.
هذا التغيير متوافق إلى حد كبير مع الإصدارات السابقة. لن يحتاج معظم مؤلفي المكونات الإضافية إلى القيام بأي شيء. ![]()
الفوائد
إلى جانب التحديثات التي تتم في الخلفية، سيحقق هذا التغيير العديد من الفوائد الوظيفية لمطوري Discourse ومضيفيه:
-
يتم تخزين أصول المكونات الإضافية بشكل مكثف في الذاكرة المؤقتة، ويتم ربطها بمفتاح خاص بكل مكون إضافي على حدة. وهذا يعني أن إعادة تشغيل الخادم في بيئة التطوير لن يتطلب إعادة بناء جميع المكونات الإضافية من الصفر.
-
يمكننا البدء في تضمين أكواد مُترجمة مسبقًا للمكونات الإضافية الشائعة في حزم الأصول الموجودة لدينا. أثناء إعادة البناء، ستحتاج فقط إلى بناء المكونات الإضافية التي تم تغييرها أو الجديدة. وهذا سيكون مفيدًا بشكل خاص للآلات ذات الموارد المحدودة.
-
سيتم تحويل كود المكونات الإضافية إلى وحدة ES أصلية. وهذا يجلب بناءً جمليًا أبسط بكثير، وتنفيذًا أسرع في المتصفح، ويفتح المجال لاستخدامات مستقبلية لأشياء مثل
import()لتقسيم الحزم في المستقبل.
الاختبار / الجدول الزمني
لقد قمنا باختبار هذا النظام داخليًا لبعض الوقت، وقد تأكدنا من وظائفه على مئات المكونات الإضافية الرسمية. تعمل منصة Meta مع النظام الجديد منذ أسابيع.
إذا كنت ترغب في تجربته بنفسك، يمكنك تعيين متغير البيئة ROLLUP_PLUGIN_COMPILER=1.
نخطط لتغيير الإعداد الافتراضي قريبًا جدًا. ستكون هناك فترة قصيرة يمكن خلالها تعطيل النظام الجديد باستخدام ROLLUP_PLUGIN_COMPILER=0، في حال حدوث أي مفاجآت، لكننا نعتزم تقليل فترة الانتقال إلى الحد الأدنى.
مشاكل محتملة مع المكونات الإضافية المعقدة
بالنسبة للمكونات الإضافية الأكثر تعقيدًا، هناك بعض الأمور التي أصبح النظام الجديد أكثر صرامة بشأنها:
-
استيراد وحدات الإدارة من أكواد غير خاصة بالإدارة سيؤدي الآن إلى استثناء. كان يُنصح دائمًا بتجنب ذلك، وكان سيسبب أخطاءً مفاجئة. الآن يتم اكتشافه ومنعه بشكل أكثر دقة.
إذا واجهت هذه المشكلة، فيجب عليك التفكير فيما إذا كان من الأفضل وضع كود مكونك الإضافي في مجلد admin-js (
admin/assets/javascripts/...). إذا كنت بحاجة حقًا إلى استيراد وحدات الإدارة بشكل مشروط، فيجب عليك استخدام دالةoptionalRequireالأساسية لتحقيق ذلك. -
الاستيراد بين المكونات الإضافية لا يزال مدعومًا. ومع ذلك، وبشكل مشابه لوحدات الإدارة، فإن استيراد وحدات من مكون إضافي غير مثبت أو غير مفعّل سيؤدي الآن إلى ظهور خطأ أكثر وضوحًا. إذا كان الاعتماد بين المكونات الإضافية مقصودًا كخيار اختياري، فيجب عليك استخدام دالة
optionalRequireالأساسية. -
تغييرات توقيت دقيقة يمكن أن تسبب مشاكل في حالات نادرة. الآن بعد أن يتم تجميع كود المكونات الإضافية إلى وحدات ES أصلية، يتم تنفيذ أي شيء في نطاق الوحدة بشكل عاجل. إذا كان لديك أي منطق غير عادي في نطاق الوحدة، فقد تحتاج إلى نقله إلى كود وقت التشغيل (على سبيل المثال، داخل منشئ فئة، أو ما شابه ذلك).
إذا واجهت أيًا من هذه المشاكل وتحتاج إلى مساعدة في حلها، فلا تتردد في النشر أدناه.
أخطاء CORS / Access-Control-Allow-Origin
إذا واجهت أخطاء CORS بعد التحديث، وتستخدم شبكة توصيل محتوى (CDN)، فيجب عليك تشغيل إعادة بناء كاملة عبر سطر الأوامر (./launcher rebuild app) لجلب هذا التغيير في تكوين NGINX.
إذا كنت تستخدم تخزين S3 (أو متوافق مع S3) للأصول، فيجب عليك تكوين شبكة توصيل المحتوى (CDN) لإضافة رأس الاستجابة Access-Control-Allow-Origin: * لجميع الأصول.