يبدو أن أحد الأشياء الأولى التي أوصي بها عملائي لتسريع مواقع الويب مثل التناقض في البداية: يجب عليك وضع موارد ثابتة على الاستضافة ، والتخلي عن البنية التحتية لشبكة CDN لجهة خارجية. في هذا المقال القصير ، كما آمل ، أريد أن أوجز عيوب تخزين الملفات الثابتة الخاصة بك "على الجانب" والمزايا الرائعة لاستضافتها على الاستضافة الخاصة بي.
عن ماذا أتحدث؟
من الشائع للمطورين أن ينقروا على رابط الأصول الثابتة ، مثل المكتبات أو الإضافات الموجودة في المواقع وموارد CDN. والمثال الكلاسيكي هو مسج.
هناك عدد من المزايا الواضحة ، لكن هدفي في وقت لاحق من المقالة هو كشف هذا النهج ، وإظهار أن العيوب أكثر انتشارًا.
(أولا ، النظر في الفوائد).
- هذا مريح. هذا يتطلب القليل جدا من الجهد لربط الملفات. انسخ سطر تعليمات HTML البرمجية ، وقد انتهيت. بسهولة.
- يمكننا الوصول إلى CDN. يتم توفير code.jquery.com بواسطة StackPath ، وهو CDN. من خلال الاتصال بالمحتوى الموجود في هذا المورد ، نحصل على تسليم بجودة CDN مجانًا.
- قد تكون ملفات المستخدم مخزنة مؤقتًا بالفعل. إذا كان site-a.com يربط بـ code.jquery.com/jquery-3.3.1.slim.min.js ويذهب المستخدم من هنا إلى site-b.com ، والذي يرتبط أيضًا بـ code.jquery.com/jquery-3.3 .1.slim.min.js ، سيكون لدى المستخدم هذا الملف في ذاكرة التخزين المؤقت.
المخاطر: انخفاض السرعة والفشل
لن أخوض في الكثير من التفاصيل في هذا المنشور. لدي مقال كامل حول مدى صلاحية طرف ثالث والمخاطر المرتبطة بالتأخير والانقطاع. يكفي أن نقول أنه إذا كان لديك أي موارد حرجة مرتبطة بمزودي الطرف الثالث ، وإذا كان الموفر يعاني من حوادث تعطل وانخفاض في السرعة أو انقطاع التيار الكهربائي ، فهذه أخبار غير سارة بالنسبة لك. سوف تعاني من هذا أيضا.
إذا كان لديك أي CSS يحظر التجسيد أو JS متزامن مستضاف على موارد الطرف الثالث ، فقم بالمضي قدمًا وقم بنقلها إلى البنية الأساسية الخاصة بك على الفور. الأصول الهامة قيمة للغاية بحيث لا يمكن تركها على خوادم الجهات الخارجية.
الخطر: إنهاء الخدمة
هذا أقل شيوعًا ، ولكن ماذا يحدث إذا قرر المزود أنه بحاجة إلى إيقاف الخدمة؟ هذا هو بالضبط ما فعله Rawgit في أكتوبر 2018 ، حتى الآن (وقت كتابة هذا التقرير) ، لا يزال البحث الخام على رمز GitHub يوفر أكثر من مليون رابط للخدمة ، التي يتم إغلاقها حاليًا ، وما زال هناك 20.000 موقع حالي الرجوع إلى ذلك.
المخاطر: نقاط الضعف الأمنية
شيء آخر يجب الانتباه إليه هو مسألة ثقة بسيطة. إذا أحضرنا محتوى من موارد الطرف الثالث إلى صفحتنا ، فيجب أن نأمل أن تكون الملفات التي نتلقاها هي بالضبط ما نتوقع استلامه ، وأنهم يفعلون بالضبط ما نتوقعه منهم.
تخيل الضرر الذي يمكن أن يحدث إذا تمكن شخص ما من التحكم في مزود مثل code.jquery.com وابدأ في تقديم محتوى ضار أو ضار. إنه أمر مخيف أن نفكر في ذلك!
سلامة المصدر الفرعي
يجب أن نشيد بجميع مزودي الطرف الثالث المذكورين حتى الآن في هذه المقالة ، إنهم يبذلون قصارى جهدهم لضمان تكامل المصدر الفرعي (تكامل المصدر الفرعي - SRI). SRI هي الآلية التي يوفر بها الموفر التجزئة (تقنيًا ، تجزئة يتبعها ترميز Base64) للملف المحدد الذي تتوقعه وتنوي استخدامه. يمكن للمتصفح بعد ذلك التحقق من أن الملف الذي تلقيته هو بالضبط ما طلبته.
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha256-pasqAKBDmFT4eHoN2ndd6lN370kFiGUFyTiUHWhU7k8=" crossorigin="anonymous"></script>
مرة أخرى ، إذا كنت تحتاج بالتأكيد إلى توصيل محتوى ثابت بمورد تابع لجهة خارجية ، فتأكد من أن SRI نشط. يمكنك توصيل SRI بنفسك.
الحساب: مفاوضات الشبكة
واحدة من أكبر التكاليف وأكثرها إلحاحا التي نتحملها هي تكلفة فتح اتصالات TCP جديدة. يتطلب كل مورد جديد نحتاج إلى زيارته فتح اتصال ، والذي قد يكون مكلفًا للغاية: دقة DNS ، مصافحة TCP ، تفاوض TLS ، وكل ذلك يساهم ، والقصة تزداد سوءًا مع تأخير الاتصال.
سأقدم مثالًا مأخوذًا مباشرةً من صفحة بدء التشغيل الخاصة بـ Bootstrap. يوجهون المستخدمين لإرفاق أربعة ملفات.
توجد هذه الملفات الأربعة على ثلاثة موارد مختلفة ، أي أننا نحتاج إلى فتح ثلاثة اتصالات TCP. كم يكلف؟ حسنًا ، مع اتصال سريع إلى حد ما ، يكون محتوى هذه الملفات الثابتة على الجانب 311 مللي ثانية ، أو 1.65 x أبطأ من عند وضعها على الاستضافة الخاصة بك.
من خلال الاتصال بثلاثة مصادر مختلفة لخدمة الأصول الثابتة ، نفقد مجتمعة 805 مللي ثانية غير الضرورية لموافقات الشبكة.
حسنًا ، هذا ليس مخيفًا للغاية ، ولكن ترين لاين ، موكلي ، وجد أنه عندما تم تخفيض التأخير بمقدار 300 مليون ، دفع الزوار 8 ملايين جنيه إضافية سنويًا. هذه طريقة سهلة للغاية لكسب 8 ملايين.
فقط بنقل مواردنا إلى نطاقك ، فإننا نحذف تكلفة الاتصالات الإضافية تمامًا.
للحصول على اتصال أبطأ ، مع تأخير أطول ، القصة أسوأ بكثير. بالنسبة للجيل الثالث 3G ، يأتي إصدار الطرف الثالث أبطأ من 1.765. اعتقدت أنه يهدف إلى جعل موقعنا أسرع.
عند الاتصال مع تأخير كبير ، فإن إجمالي تكاليف الشبكة هي 5.037s وحشية. ما يمكن تجنبه تماما.
يؤدي نقل الملفات إلى البنية الأساسية الخاصة بنا إلى تقليل وقت التنزيل من 5.4 إلى 3.6 ثانية.
إذا لم يكن هذا سببًا جيدًا لاستضافة مواردك الثابتة ، فلا أعرف ما الذي ستجلبه.
المسبق ل
بطبيعة الحال ، الهدف من عرضي التقديمي هنا هو أنه يجب عليك عدم نشر أي موارد ثابتة على الجانب إذا كنت قادرًا على القيام بذلك على الاستضافة. ومع ذلك ، إذا كانت يديك مرتبطين بطريقة أو بأخرى ، فيمكنك استخدام Resource Hint preconnect لفتح اتصال TCP بشكل استباقي لمصدر (مصادر) محدد: علاوة على ذلك ، سيكون نشرها كرؤوس HTTP أسرع.
المذكرة. حتى إذا كنت تستخدم برنامج preconnect ، فإن مقدار الوقت الضائع سينخفض قليلاً فقط: لا تزال بحاجة إلى فتح الاتصالات المناسبة ، ومن غير المرجح أن تكون التكاليف مبررة على الإطلاق ، خاصة بالنسبة للاتصالات البطيئة.
حساب: فقدان الأولويات
يأتي الحساب الثاني في شكل تحسين على مستوى البروتوكول ، والذي نفتقده عندما نقسم المحتوى إلى مجالات. إذا كنت تستخدم HTTP / 2 ، فما الذي يجب عمله ، يمكنك الوصول إلى تحديد الأولويات.
تحتفظ جميع التدفقات (وبالتالي الموارد) التي لها نفس اتصال TCP بالأولوية ، ويعمل المتصفح والخادم جنبًا إلى جنب لبناء شجرة التبعية لجميع هذه التدفقات ذات الأولوية ، حتى نتمكن من إرجاع الموارد الحيوية بشكل أسرع وربما تأخير تسليم التدفقات الأقل أهمية.
المذكرة. من الناحية الفنية ، نظرًا لدمج اتصالات HTTP / 2 ، يمكن إعطاء الأولوية للطلبات بالنسبة لبعضها البعض عبر مجالات مختلفة ، طالما أنها تشترك في نفس عنوان IP.
إذا قمنا بتوزيع مواردنا عبر مجالات مختلفة ، فعلينا فتح العديد من اتصالات TCP الفريدة. لا يمكننا الإسناد الأولويات المرجعية لهذه الاتصالات ، أي أننا نفقد القدرة على تسليم الملفات بطريقة معينة مدروسة جيدًا.
من خلال استضافة جميع المحتويات على استضافة واحدة ، يمكننا بناء شجرة تبعية أكثر تعقيدًا. كل مؤشر ترابط له معرف خاص به ، لأنه ينتمي إلى نفس الشجرة. إذا قدمنا أكبر قدر ممكن من المحتوى من مجال واحد ، فيمكننا السماح لـ HTTP / 2 بالقيام بوظيفته وتحديد أولويات الأصول بشكل كامل على أمل استجابة أسرع.
التخزين المؤقت
على العموم ، يبدو أن مضيفي الموارد الثابتة يعملون بشكل جيد مع وضع توجيهات العمر الأقصى الطويل. هذا منطقي لأن المحتوى الثابت على عناوين URL التي تم إصدارها (كما هو مذكور أعلاه) لن يتغير أبدًا. هذا يجعل الأمر آمنًا وعقلانيًا للغاية لفرض سياسة مخبأ قوية بشكل معقول.
ومع ذلك ، ليس هذا هو الحال دائمًا ، ومن خلال وضع مواردك بشكل مستقل ، يمكنك تطوير استراتيجيات تخزين فردية أكثر بكثير.
أسطورة: التخزين المؤقت عبر المجال
أكثر إثارة للاهتمام هو القدرة على التخزين المؤقت للأصول عبر المجال. أي إذا كانت هناك العديد من المواقع ترتبط بنفس الإصدار من jQuery ، الموجود على CDN ، فمن المؤكد أن المستخدمين لديهم بالفعل هذا الملف المعين على جهاز الكمبيوتر الخاص بهم. شيء مثل مشاركة موارد نظير إلى نظير. هذه واحدة من أكثر الوسائط شيوعًا لاستخدام موفر الأصول الثابتة التابع لجهة خارجية.
لسوء الحظ ، لا يوجد دليل منشور يدعم هذه الادعاءات: لا يوجد سبب للاعتقاد بأن هذا صحيح. على العكس ، تشير دراسة حديثة أجراها بول كالفانو إلى أن العكس قد يكون صحيحًا:
توجد فجوة ملحوظة بين عمر ذاكرة التخزين المؤقت لمورد CSS وخطوط الويب من الطرف الأول والثالث. يزيد عمر خطوط الخطوط الأولى عن 95٪ عن أسبوع واحد مقارنة بنسبة 50٪ من خطوط الأطراف الخارجية التي يقل عمرها عن أسبوع واحد. يوفر هذا أسبابًا جيدة لخطوط الويب المستضافة ذاتيًا.
بشكل عام ، يبدو أن محتوى الجهة الخارجية مخبأ بشكل أسوأ من المحتوى الخاص به.
والأهم من ذلك ، قام Safari بتعطيل هذه الميزة تمامًا بسبب المخاوف من إساءة استخدام الخصوصية ، لذلك قد لا تعمل تقنية ذاكرة التخزين المؤقت المشتركة في وقت كتابة هذا التقرير لـ 16٪ من المستخدمين في جميع أنحاء العالم.
باختصار ، على الرغم من أن هذا أمر جيد من الناحية النظرية ، إلا أنه لا يوجد دليل على أن التخزين المؤقت عبر المجال فعال إلى حد ما.
وصول CDN
فائدة أخرى واسعة النطاق من الاتصال بمزود موارد ثابت هي أنه من المحتمل أن يستخدم بنية أساسية قوية مع إمكانيات CDN: التوزيع العالمي ، قابلية التوسع ، الكمون المنخفض ، والتوافر العالي.
نظرًا لأن هذا صحيح تمامًا ، إذا كنت تهتم بأدائك ، فيجب عليك تشغيل المحتوى الخاص بك من CDN. مع مستوى أسعار الاستضافة الحالية ، هناك عدد قليل للغاية من الأعذار لماذا لا تستخدم هذا لمواردك.
بمعنى آخر: إذا كنت تعتقد أنك بحاجة إلى شبكة CDN لمنسقك ، فستحتاج إلى شبكة CDN لكل شيء.
استضافة موارد ثابتة على استضافة الخاص بك
في الواقع ، هناك أسباب قليلة للغاية لترك مواردك الثابتة في البنية التحتية لشخص آخر. الفوائد المحتملة غالبًا ما تكون أسطورة ، وحتى لو لم يكن الأمر كذلك ، فإن الحلول الوسط ببساطة لا تستحق العناء. تحميل الموارد من مصادر مختلفة أبطأ بكثير. خلال الأيام القليلة المقبلة ، يمكنك قضاء عشر دقائق في تدقيق مشاريعك والتحكم في جميع الموارد الثابتة التابعة لجهات خارجية.