103 Early Hints: حمّل CSS قبل ما HTML يجهز
مستوى القارئ: متوسط
هتكسب من المقال ده طريقة عملية تقلل انتظار الموارد الحرجة لما السيرفر يتأخر في تجهيز HTML. ركز: 103 Early Hints مش بديل لتحسين الكود، لكنه يستغل وقت الانتظار بدل ما يسيبه فاضي.
المشكلة باختصار
لو عندك صفحة منتج أو لوحة تقارير بتحتاج 700 إلى 1200ms عشان السيرفر يجمع بياناتها، المتصفح غالبًا مش هيعرف ملفات CSS والخطوط المهمة غير بعد وصول HTML. اللي بيحصل فعلاً إن زمن تجهيز الصفحة وزمن تحميل الموارد بيتجمعوا فوق بعض.
سيناريو واقعي: متجر عنده 50K زائر يوميًا، وصفحة المنتج بتطلع HTML بعد 900ms بسبب قراءة المخزون والأسعار. ملف CSS الحرج حجمه 80KB وخط WOFF2 حجمه 45KB. بدون أي hint، المتصفح يبدأ تحميلهم بعد 900ms. مع 103 Early Hints، يقدر يبدأ من أول 100 إلى 150ms تقريبًا.
الفكرة بمثال بسيط
اعتبر إنك طلبت تقرير من زميلك. التقرير نفسه هياخد 10 دقائق. بدل ما يستنى يخلص التقرير ثم يقول لك افتح ملف الأرقام وملف الرسوم، يبعت لك بدري: جهّز الملفين دول عشان هتحتاجهم. لما التقرير يوصل، جزء من التحضير خلص بالفعل.
ده بالظبط دور 103 Early Hints. السيرفر يرسل ردًا مؤقتًا قبل الرد النهائي، وفيه ترويسات Link تقول للمتصفح: غالبًا هتحتاج الملفات دي. المتصفح يبدأ preload أو preconnect أثناء ما السيرفر لسه بيجهز الرد النهائي.
التعريف الدقيق: 103 هو HTTP informational status code يُرسل قبل 200 OK. استخدامه الأساسي مع ترويسة Link لتحميل موارد متوقعة مبكرًا. حسب MDN، المتصفح يبدأ جلب الموارد المذكورة بمجرد استقبال الـ hints، لكن الدعم العملي مرتبط غالبًا بـ HTTP/2 أو أحدث.
الإعداد العملي مع Cloudflare وNginx
أفضل طريقة آمنة لمعظم الفرق الصغيرة: خلّي الـ origin يرسل ترويسات Link للموارد الحرجة، وفعل Early Hints من Cloudflare لو موقعك وراه Cloudflare. Cloudflare يقدر يرسل 103 من الـ edge اعتمادًا على Link headers الموجودة في صفحات HTML.
الافتراض إن عندك تطبيق ويب وراء Nginx، وملفات ثابتة بأسماء versioned زي /assets/app.7fd2.css. لا تستخدم أسماء تتغير بدون cache busting، وإلا هتسبق تحميل ملف قديم.
server {
listen 443 ssl http2;
server_name example.com;
location / {
proxy_pass http://app:3000;
# موارد حرجة فعلًا لأول viewport فقط
add_header Link "; rel=preload; as=style" always;
add_header Link "; rel=preload; as=font; type=font/woff2; crossorigin" always;
}
}لو بتستخدم Express بدل Nginx، نفس الفكرة ممكن تتكتب داخل الرد: