ينشر Discourse الآن أصول JavaScript مُعدة مسبقًا، مما سيسرع بشكل كبير عملية التثبيت والتحديثات، خاصة للخوادم ذات الموارد المحدودة.
لطالما كانت عملية تجميع وتحسين أصول JavaScript واحدة من أكثر العمليات استهلاكًا للموارد في تشغيل Discourse. مع تطور قاعدة الكود الخاصة بنا ونظام JavaScript البيئي، أصبحت هذه العملية أكثر تطلبًا.
في اختباراتنا، تقلل هذه التغييرات من وقت بناء الأصول على خادم Digital Ocean بسعة 1 جيجابايت من ذاكرة الوصول العشوائي من 45 دقيقة إلى 3 دقائق فقط.
كيف يعمل؟
عند دمج كل التزام في main، يقوم سير عمل GitHub Actions ببناء وتجميع الأصول في ملفات .tar.gz (واحد للإنتاج، وواحد للتطوير). يتم نشر هذه الحزم عبر إصدارات GitHub في مستودع مخصص. نضمن نشر الأصول قبل أن ينتقل أي التزام إلى tests-passed.
عند بناء موقعك الخاص، يتحقق Discourse الآن من وجود حزمة مُعدة مسبقًا مطابقة ويقوم بتنزيلها. ثم يتم بناء الإضافات فوقها. إذا لم يتم العثور على حزمة أو حدث خطأ، يعود Discourse إلى البناء من المصدر.
هل يؤثر هذا على المستخدمين النهائيين؟
لا. لا تزال الأصول تُقدم للمستخدمين النهائيين من الخادم الخاص بك / شبكة توصيل المحتوى (CDN).
هل يمكنني إلغاء الاشتراك؟
نعم! إذا كنت تفضل بناء أصولك الخاصة ولديك خادم قوي بما فيه الكفاية، قم بتعيين DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 في ملف app.yml الخاص بك.
ماذا لو كنت أقوم بتشغيل نسخة من Discourse مُشعبة أو مُعدلة؟
تتم تسمية حزم الأصول حسب تجزئة الالتزام. إذا كنت تقوم بتشغيل نسخة مشعبة، فلن يتم العثور على حزمة وسيتم بناء الأصول من المصدر. إذا كانت نسخة Discourse الخاصة بك مُعدلة (أي أن شجرة العمل في git ليست نظيفة)، فلن يحاول Discourse تنزيل حزمة.
ماذا عن خطوات البناء الأخرى المتعلقة بالأصول؟
حاليًا، ينطبق هذا التحسين فقط على أصول JavaScript الأساسية. في المستقبل، قد نقوم بتوسيعه ليشمل بعض الإضافات وخطوات أخرى مثل ضغط gz/brotli.
ماذا عن الفرع المستقر؟
سيتم نشر الأصول المُعدة مسبقًا للفرع المستقر بدءًا من التحديث الرئيسي التالي، والمخطط له في أغسطس 2025.
إليك ما يحدث عندما لا يفي التثبيت الخاص بك بالمعايير:
I, [2025-08-01T06:43:09.560655 #1] INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake assets:precompile:build'
[assemble_ember_build] حد heap_size_limit لـ Node.js أقل من 2048 ميجابايت. جارٍ تعيين --max-old-space-size=2048 و CHEAP_SOURCE_MAPS=1
[assemble_ember_build] لم يتم العثور على ملف معلومات البناء الموجود.
[assemble_ember_build] دليل عمل Git غير نظيف. لا يمكن تنزيل الأصول المجمعة مسبقًا.
[assemble_ember_build] جارٍ تشغيل بناء أساسي كامل...
أقوم ببعض التعديلات على config/initializers/100-sidekiq.rb في app.yml لإضافة دعم لعدد محاولات إعادة لجميع مهام sidekiq (والذي أفترض أنه الطريقة الوحيدة لتحقيق ذلك وليس ضمن مكون إضافي؟ ولكن يمكن إعادة النظر فيه) لذلك أعتقد أن هذا يكفي لعدم تلبية المعايير …
إنه ممكّن افتراضيًا. تحتاج فقط إلى تحديد التكوين إذا كنت تريد إلغاء الاشتراك.
نعم بالضبط. أي نوع من الاختلافات في مستودع git سيؤدي إلى فشله.
بخصوص أمر sidekiq، إذا فتحت موضوعًا حوله، فمن المؤكد أننا سنتمكن من إيجاد طريقة للقيام بذلك إما من مكون إضافي، أو ربما يمكننا تقديم GlobalSetting جديد له.
4 دقائق لإعادة البناء. لقد فعلت هذا عدة مرات اليوم وتم الترحيل بالكامل! ديسكورس مثير للإعجاب! في إعادة البناء التالية، سأتذكر استخدام هذا الأمر الرائع، شكرًا للجميع.
ربما تكون فكرة الحد من هذا إلى app/assets و config/locales للنواة والإضافات؟ في الوقت الحالي، سيؤدي هذا أيضًا إلى إعادة بناء كاملة عند تطبيق تصحيحات Ruby فقط (أمنية).
نعم، من الممكن أن نقيد هذا بشكل أكبر. على الرغم من أنه في حالة تصحيحات الأمان، من الشائع جدًا أن تؤثر على تطبيق JS أيضًا… لذا سيظل إعادة البناء الكامل ضروريًا.
التحديث إلى 3.6.0.beta1 والأصول المعدة مسبقًا غير موجودة
Fetching and extracting https://get.discourse.org/discourse-assets/3.6.0.beta1-d63a2431/production.tar.gz...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 9 100 9 0 0 24 0 --:--:-- --:--:-- --:--:-- 24
curl: (22) The requested URL returned error: 404
[assemble_ember_build] Failed to download prebuilt assets: Command failed with exit 22: curl
[assemble_ember_build] Running full core build...