لو الـ PageSpeed Insights بيقولّك إن LCP أخضر بس INP أحمر فوق 500ms، الموقع بيبان "ميت" وقت أول كليك حقيقي. المشكلة مش في السيرفر — الـ main thread اتقفل لـ 300ms أو أكتر بسبب JavaScript بيتنفّذ في وقت غلط.
المشكلة باختصار
في مارس 2024، Google استبدلت FID بـ INP في Core Web Vitals الرسمية. الفرق بالظبط: FID كان بيقيس أول تفاعل بس ومتوسط التأخير، INP بياخد أسوأ تفاعل في الجلسة كلها (تقريبًا P98). يعني لو في زرار واحد بيعلّق الصفحة 600ms، الموقع كله بياخد INP أحمر حتى لو باقي الأزرار سريعة.
النتيجة العملية: 64% من المواقع كانت بتعدّي FID قبل 2024. بعد التحويل لـ INP، النسبة نزلت لـ 56% حسب بيانات HTTP Archive. يعني حوالي 8% من المواقع وقعت من الأخضر للأحمر بدون ما حد يلمس الكود.
مثال بسيط قبل التعريف العلمي
تخيّل صفحة قائمة منتجات فيها 200 منتج، كل ما المستخدم يضغط على فلتر "السعر من الأقل للأعلى"، الكود بيشتغل دالة JavaScript بتعمل sort وtransform لكل الـ array. الـ click نفسه بياخد 1ms من المتصفح. لكن الـ JavaScript بياخد 450ms قبل ما المتصفح يقدر يرسم الشاشة من تاني. الـ INP هنا = 451ms = أحمر.
المستخدم اللي ضغط الزرار بيشوف فجوة 450ms قبل ما الصفحة تتغيّر. في الفترة دي، أي scroll أو click تاني بيتجاهل. الإحساس النفسي: "الصفحة عاطلة".
التعريف العلمي الدقيق
INP بيقيس الزمن من بداية تفاعل المستخدم (pointerdown، keydown، أو click) لحد أول paint بعد ما الـ event handlers خلصوا. بياخد أسوأ تفاعل في الجلسة، وبيتم القياس من المستخدمين الحقيقيين (Field Data) وليس من lab.
- Good: أقل من 200ms.
- Needs Improvement: 200ms إلى 500ms.
- Poor: أكثر من 500ms.
ليه الـ main thread بيتقفل أصلاً
المتصفح بيشتغل على main thread واحد. لو في JavaScript بياخد 300ms، الـ rendering وأي event هاندلر تاني بيستنوا. أكتر مصادر long tasks في تطبيقات الإنتاج:
- مكتبات تقيلة بتشتغل عند event (مثل lodash deepClone على object كبير، أو date-fns بدون tree-shaking).
- React re-render لقائمة طويلة بدون useMemo أو virtualization.
- Third-party scripts (Hotjar، Intercom، GTM) بتشتغل sync في الـ load handler.
- Hydration في Next.js على صفحة فيها أكتر من 50 component.
- JSON.parse على response أكبر من 1MB.
أي function بتاخد أكتر من 50ms، Chrome بيعتبرها "long task" رسميًا.
الحل في 4 خطوات بترتيب الـ ROI
1) قياس INP الحقيقي من المستخدمين (RUM)
PageSpeed Insights بيدّيك lab data من جهاز Moto G4 افتراضي، اللي ممكن يكون مختلف عن أجهزة المستخدمين الحقيقيين. ركّب web-vitals library على الإنتاج:
]]>