عنوان URL الكامل في ملف assets erb يؤدي إلى مشاكل في المواقع المتعددة

تستخدم تنفيذ عامل الخدمة الجديد في workbox دالة UrlHelper.absolute. وبما أن هذا أصل مُجمَّع، فإنه يخزن عنوان URL الكامل، الذي يحتوي على اسم النطاق الكامل للمضيف الرئيسي في بيئة متعددة المواقع.

https://github.com/discourse/discourse/blob/master/app/assets/javascripts/service-worker.js.erb#L3-L6

أعتقد أنه يجب استخدام UrlHelper.local_cdn_url بدلاً من ذلك. كما أن هذا يتجاوز الحاجة إلى إعادة تجميع الأصول بعد تغيير اسم النطاق.

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

أعتقد أن الإجماع العام هو أنه لا ينبغي تقديم عمال الخدمة (Service Workers) أبدًا من خلال شبكة توصيل المحتوى (CDN):

أوه، هل تقصد ملفات importScripts؟ هل لديك مجموعة من المواقع المتعددة حيث يحتوي كل موقع على عنوان CDN مختلف؟

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

نعم، importScripts و modulePathPrefix، في السطور 3 و6 من ملف ERB ذلك.

لكنك لم تفهمني تمامًا. المشكلات تحدث في الأماكن التي لا يوجد فيها أي CDN في مجموعة مواقع متعددة.

كلا الدالتين UrlHelper.absolute و UrlHelper.local_cdn_url يمكنهما التعامل مع الحالات التي يوجد فيها CDN وتلك التي لا يوجد فيها.

absolute:

بدون CDN: https://primarysite.ofmultisitecluster.com/javascripts/workbox/workbox-sw.js سيء - مصدر بعيد لجميع المواقع ما عدا الموقع الرئيسي، مما يعرض اسم المضيف للمجموعة الرئيسية
مع CDN: //cdnurl/javascripts/workbox/workbox-sw.js

local_cdn_url:

بدون CDN: /javascripts/workbox/workbox-sw.js جيد - رابط نسبي
مع CDN: //cdnurl/javascripts/workbox/workbox-sw.js

لذا فإن الخيار الأخير هو ما نريده.

المشكلة هي أن هذين السطرين (3 و6) لا يتعلقان بملف عامل الخدمة.

يأتي عامل الخدمة من النطاق الأساسي (حيث لا يمكن تقديمه عبر شبكة توصيل المحتوى)، لكن هذا العامل يستورد البرامج النصية بشكل كسول أثناء وقت التشغيل (في هذه الحالة ملفات مكتبة workbox)، ويمكن تقديم هذه الملفات عبر شبكة توصيل المحتوى.

إذن، المشكلة هي أن مجموعة المواقع المتعددة (multisite cluster) الخاصة بك لا تحتوي على شبكة توصيل محتوى مُهيأة، وهذا ما يكشف عن هذا الخطأ، الذي يتم إخفاؤه عند تعيين DISCOURSE_CDN. أردت فقط معرفة السبب في أنه لا يؤثر علينا.

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

أنت محق، لقد قمت بتحرير منشوري الثاني لتصحيح أخطائي.
المسألة لا تتعلق بملف عامل الخدمة، بل هي موجودة داخل ملف عامل الخدمة.

نعم، هذا بالضبط الوقت الذي يُكشف فيه عن الخلل.

3 إعجابات

فقط أتأكد - هل تشخيصي صحيح وهل هذه مشكلة سيتم إصلاحها؟ هل هناك أي شيء تحتاجونه منا لمساعدتكم؟

3 إعجابات

نعم، يبدو أنه خطأ يحتاج إلى إصلاح. سأقوم بمعالجته هذا الأسبوع!

3 إعجابات

هه، لقد جربته للتو على وحدة تحكم Meta:

## الحالي
[1] pry(main)> UrlHelper.absolute("/javascripts/workbox/workbox-sw.js")
=> "https://d3bpeqsaub0i6y.cloudfront.net/javascripts/workbox/workbox-sw.js"

### التغيير المقترح
[2] pry(main)> UrlHelper.local_cdn_url("/javascripts/workbox/workbox-sw.js")
=> "/javascripts/workbox/workbox-sw.js"

لا تبدو هذه الدوال قابلة للتبادل بالنسبة لي.

3 إعجابات

أنت محق، local_cdn_url تحل رابط URL محليًا برابط CDN. وهذا ليس رابط URL محليًا حتى، بل هو رابط نسبي.

لذا أعتقد أن هذا يكفي بدلًا من استدعاءات UrlHelper تلك؟

importScripts("<%= (Discourse.asset_host || '') + "/javascripts/workbox/workbox-sw.js" %>");

و

modulePathPrefix: (Discourse.asset_host || '') + "/javascripts/workbox",

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

عند قراءة التنفيذ الحالي لـ UrlHelper.absolute:

يبدو أنه يقوم بتكوين عنوان URL عن طريق دمج Discourse.base_url_no_prefix مع المعامل عندما يكون CDN nil، وهو حالتك.

إذن المشكلة هي أن Discourse.base_url_no_prefix يعيد دائمًا المضيف الأول في بيئة المواقع المتعددة؟

ننظر في الكود :eyes:

اسم المتغير هنا current_hostname عند السطر 288 يُشير بقوة إلى شيء يدرك تعدد المواقع :thinking:

ومن خلال:

يبدو أنه كذلك. طريق مسدود حتى الآن…

بالبحث في أماكن أخرى، حصل هذا المسار على بعض المعالجة الخاصة لأن المتصفحات تحب أن تضغط عليه بشدة، ولا يُسمح لنا بوضعه على CDN وجعل المشكلة مشكلة شخص آخر. أثناء القيام بذلك، كان لدينا خطأ يتعلق بتسرب في بيئة المواقع المتعددة، تم إصلاحه بواسطة @sam قبل عام:

هل هناك احتمال أن الطريقة التي تقدم بها هذه المجموعة من المواقع المتعددة تقوم بتخزين هذا المسار في ذاكرة التخزين المؤقت بطريقة تسمح بالتسرب، مثلما كنا في أوائل عام 2018؟

إعجابَين (2)

لا، المشكلة هي أنها تفعل ذلك عند تجميع الأصول مسبقًا، مما يصبح مشكلة في بيئة المواقع المتعددة.
لذلك الحل هو عدم تضمين اسم المضيف في الأصول أبدًا (إلا إذا كان هناك CDN للأصول تم تعيينه، حيث أنه يُشارك دائمًا بين مستضيفات المواقع المتعددة على أي حال).

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

@falco هل رأيت الحل المقترح في منشورين أعلاه؟

نعم، لكن في اختباراتي لا يغطي المجلدات الفرعية بدون CDN :sob:

أعتقد أننا سنحتاج إلى استخدام:

"#{Discourse.asset_host}#{Discourse.base_prefix}/javascripts/workbox"
إعجاب واحد (1)

حسناً، نقطة جيدة بخصوص المجلد الفرعي.

لكن… يمكن أن يكون Discourse.asset_host فارغاً (nil)، ولم أسمع أبداً عن Discourse.base_prefix؟

ماذا عن هذا:

importScripts("<%= (Discourse.asset_host || GlobalSetting.relative_url_root) + "/javascripts/workbox/workbox-sw.js" %>");

modulePathPrefix: "<%= (Discourse.asset_host || GlobalSetting.relative_url_root) + "/javascripts/workbox" %>",

هذا بالضبط ما نريده في هذه الحالة:

irb(main):001:0> puts "a#{nil}bc"
abc

أعني في الواقع Discourse.base_path.

لقد قمت للتو بتسليم إصلاح، يرجى التحقق منه.

3 إعجابات

يبدو الأمر جيدًا لحالتنا.. شكرًا لك!

لكن.. فقط للتأكد.. لست متأكدًا من كيفية تعاملكم مع الأصول على شبكة توصيل المحتوى (CDN) بالاقتران مع مجلد فرعي، ولكن إذا استخدمتم Discourse.asset_host، فهل لا تزالون تضيفون بادئة المسارات جميعها على مضيف الأصول مع مسار المجلد الفرعي أيضًا؟ لأن هذا ما يفعله الكود حاليًا.
إذا كان هذا هو ما تفعلونه، فيمكنكم تجاهل هذه الفقرة تمامًا :slight_smile:

3 إعجابات

أدى هذا الأمر المتعلق بالمجلد الفرعي + شبكة توصيل المحتوى (CDN) إلى تسببه في العديد من المشكلات بالفعل. قام @featheredtoast ببعض العمل لتبسيط هذا الأمر، وقضينا وقتًا طويلاً في التأكد من أن جميع أكواد تقديم الأصول لدينا تعمل بشكل صحيح مع هذه المجموعات الغريبة من الدلاء والمجلدات الفرعية وما إلى ذلك.

أعتقد أننا بأمان :smile:، ولكن إذا لزم الأمر، يمكننا إعادة فتح هذا الموضوع.

شكرًا لك على تقرير الخطأ!

8 إعجابات

تم إغلاق هذا الموضوع تلقائيًا بعد 7 أيام. لم يعد مسموحًا بإضافة ردود جديدة.