المستوى المطلوب: مبتدئ
Resource Hints: 4 سطور HTML بتقطع 280ms من زمن تحميل صفحتك
لو صفحتك بتحمّل خطوط من Google Fonts، أو صورة كبيرة في الـ hero section، أو بتنادي API على دومين تاني، أول زيارة بتدفع من 180 لـ 480 مللي ثانية ضايعة في حاجة المستخدم مش شايفها أصلاً: تجهيز الاتصال. الخبر الحلو إن في 4 سطور HTML، اسمها Resource Hints، بتقول للمتصفح: "ابدأ التحضير من دلوقتي بدل ما تستنى لما الكود يحتاج المورد". النتيجة بتظهر مباشرة في First Contentful Paint وبتتحسن بنسبة تتراوح بين 20% و 40% على الموبايل.
المشكلة باختصار
لما المتصفح يلاقي صورة أو خط من دومين خارجي زي fonts.gstatic.com، بيعمل 3 خطوات تسلسلية قبل ما أول بايت من المورد يطلع:
- سؤال DNS عن الـ IP بتاع الدومين (من 30 لـ 80 مللي ثانية)
- فتح TCP connection بـ handshake = round trip كامل (من 50 لـ 150 مللي ثانية على 4G)
- عمل TLS handshake لو الموقع HTTPS = round trip أو اتنين زيادة (من 100 لـ 250 مللي ثانية)
الإجمالي: من 180 لـ 480 مللي ثانية ضايعة لكل دومين خارجي بشكل منفصل. ولو عندك 3 دومينات (fonts، analytics، CDN صور)، الضريبة بتتضرب 3.
قبل التعريف العلمي: مثال مطعم الديليفري
تخيل إنك رايح مطعم delivery تاخد طلبك. عندك سيناريوهين:
السيناريو الأول (بدون Resource Hints): توصل المطعم على غفلة. الويتر يلاقيلك ترابيزة، تقعد، تقرأ المنيو، تأكد البيانات بتاعتك، الكاشير يحضّر الفاتورة، الشيف يبتدي يطبخ. كل خطوة بياخد دقيقة. الأكل وصلك بعد 8 دقايق.
السيناريو الثاني (مع Resource Hints): اتصلت قبل ما تخرج من البيت بـ 10 دقايق وقلت "أنا جاي وعايز كذا". لما وصلت، الترابيزة جاهزة، الفاتورة محضّرة، الأكل في الفرن. أكلت بعد دقيقتين.
المطعم في المثال ده هو الدومين الخارجي. والمكالمة قبل الخروج هي الـ Resource Hint. كل خطوة من خطوات الاستقبال (الترابيزة، الفاتورة، الطلب) هي خطوة من خطوات إعداد الاتصال (DNS، TCP، TLS).
التعريف العلمي
Resource Hints هي مجموعة من قيم الـ rel لتاج <link>، اتعرّفت رسميًا في HTML Living Standard ومواصفة W3C Resource Hints. هي 4 أنواع، كل واحدة بتشتغل على طبقة مختلفة:
- dns-prefetch: يقول للمتصفح "اعمل DNS lookup للدومين ده دلوقتي". أرخص حاجة. بيوفر من 30 لـ 80 مللي ثانية.
- preconnect: يعمل DNS + TCP + TLS كلهم مسبقًا. أقوى حاجة. بيوفر من 180 لـ 480 مللي ثانية.
- preload: يقول للمتصفح "حمّل المورد ده دلوقتي بأولوية عالية" حتى لو الـ parser لسه ما وصلش له في الكود. مفيد للخطوط وصور الـ hero.
- prefetch: يحمّل مورد متوقع للصفحة التالية، بأولوية منخفضة جدًا، في وقت فراغ المتصفح. مفيد للـ checkout page بعد ما المستخدم يضيف منتج للسلة.