لا يكفي أن يحقق الموقع درجة ممتازة في اختبار واحد ليكون سريعًا لدى المستخدمين. هذه خطة قياس تفرق بين أثر JavaScript على الرسم الأول وبين الصور والخادم و CSS، وتشرح كيف تفسر الفروق بدل إسناد كل تأخير إلى السكربتات.
ابدأ بسؤال تجريبي لا برقم Lighthouse
عندما يشكو الزائر من صفحة بيضاء أو عنوان يتأخر ظهوره، قد يكون JavaScript سببًا، لكن الصور والخطوط ووقت استجابة الخادم و CSS يمكن أن تخلق العرض نفسه. لذلك صغ فرضية محددة: «تأجيل الحزمة الخاصة بالتعليقات سيجعل المحتوى الأساسي يظهر أسرع على هاتف متوسط». لا تبدأ بإزالة كل الشيفرات أو إضافة defer عشوائيًا؛ حدد عنصر المحتوى الأساسي وما يعتبر نجاحًا، ثم سجّل الحالة الأصلية قبل التعديل. فرّق بين أول رسم بكسل First Paint، وأول رسم محتوى FCP، وأكبر عنصر مرئي LCP، وبين قابلية التفاعل. قد يظهر هيكل الصفحة مبكرًا بينما يتأخر العنوان الحقيقي أو تتوقف الواجهة بعد الرسم بسبب مهمة JavaScript طويلة.
صمم مصفوفة قياس صغيرة ومفيدة
اختر صفحة مقالة وصفحة تصنيف وصفحة بحث بدل الاكتفاء بالرئيسية. كرر الاختبار على هاتف متوسط واتصال محدود وعلى جهاز مكتبي سريع، لأن حجم JavaScript الذي لا يسبب مشكلة على المعالج القوي قد يشغل الخيط الرئيسي لثوانٍ على هاتف ضعيف. جرّب تحميلًا باردًا وآخر دافئًا لأن ذاكرة المتصفح والتخزين المؤقت تغيران التوقيت. ثبت إصدار المتصفح وإعدادات الشبكة والنسخة البرمجية خلال المقارنة. لا تجعل التشغيل المتكرر يتم بالتوازي إذا كان يزاحم المعالج؛ نفذ سلسلة A ثم B، أو تناوب A/B إذا كان تغير حمل الخادم عاملًا مهمًا. سجل عدد المحاولات والقيم الفردية، وليس المتوسط النهائي فقط.
افصل تحميل الملف عن تفسيره وتنفيذه
تقليل حجم حزمة JavaScript مفيد أحيانًا لكنه لا يصف التكلفة كلها. قد ينزل ملف صغير ثم يستهلك وقتًا كبيرًا في parse و compile و execute، وقد يؤخر بناء DOM أو حساب التنسيق أو الاستجابة للنقرات. افتح تسجيل Performance في أدوات المطور وراقب الشريط الزمني: طلبات الشبكة، المهام الطويلة، استدعاءات السكربت، وتوقيت الرسم. انظر هل العنصر الأكبر يتأخر بسبب صورة لم تصل أم بسبب إنشاء مكونات بعد طلب API. وإذا كان هناك SSR أو توليد HTML من الخادم، افصل زمن وصول HTML عن hydration على العميل. لا تحكم على المكتبة بأنها بطيئة لمجرد ظهور اسمها في التتبع؛ راجع ما يستدعيها ومتى ولماذا.
ضع علامة على الحدث الذي يهم المستخدم
المقاييس القياسية لا تعرف دائمًا متى يصبح مربع البحث أو قارئ المقال جاهزًا بالفعل. استخدم performance.mark عند بدء تركيب الجزء الحاسم وعند اكتماله، ثم performance.me asure لتسجيل الفترة بينهما. يمكنك استخدام PerformanceObserver لمراقبة إدخالات الرسم والموارد المدعومة، مع الانتباه إلى اختلاف دعم أنواع الإدخالات بين المتصفحات وحدود مخزن البيانات. أضف علامة عندما يظهر عنوان المقال الفعلي أو عندما يصبح زر البحث قابلًا للاستخدام، وليس عندما يُركّب عنصر مخفي. لا تجمع نصوص المستخدمين أو مدخلاتهم في سجلات الأداء؛ احتفظ بالزمن ونوع الصفحة وخصائص الجهاز المجمعة فقط. هذه العلامات مكمّلة ل ـLCP وليست بديلًا عنه.
التعامل مع التذبذب الإحصائي
إذا أظهر اختبار واحد تحسنًا من 2.4 إلى 1.7 ثانية فلا تعلن نجاحًا عامًا. ربما تغيرت حالة الشبكة أو استجاب الخادم من الذاكرة المؤقتة أو شُغّل برنامج آخر في الخلفية. نفذ عددًا مناسبًا من المحاولات، مثل عشر مرات في بيئة معملية مستقرة كبداية، ثم انظر إلى الوسيط والمدى والمئين 75 أو 95 بحسب الهدف. قارن شكل التوزيع: هل تحسن معظم المستخدمين أم انخفض أفضل وقت فقط؟ البيانات الحقيقية من الزوار تكمل التجربة المعملية لأنها تشمل أجهزة وشبكات متعددة، لكنها تحتاج مدة جمع وعينة معقولة. لا تخلط بيانات قبل تغيير التصميم وبعده إذا اختلف جمهور الموقع أو توقيت الزيارات بصورة كبيرة.
اختبر أثر defer و async وتقسيم الحزم بحذر
السكربت الذي يعتمد عليه عرض المحتوى الأساسي لا يصح تأجيله بلا خطة، بينما قد يكون تحميل أداة إحصاءات أو ويدجت ثانوي بعد ظهور المحتوى مناسبًا. يتيح defer تنزيل السكربت الخارجي مع الحفاظ على ترتيب التنفيذ بين سكربتات defer التقليدية، في حين أن async ينفذ عند جاهزيته دون ضمان ترتيب مماثل. الوحدات البرمجية لها سلوك تحميل مختلف يجب اختباره في سياقها. تقسيم الحزم عبر dynamic import قد يقلل ما يحتاجه المسار الأول، لكنه قد يضيف طلبات وتأخيرًا عند فتح جزء من الصفحة. اختبر التحميل الأول والتنقل الداخلي وعودة المستخدم، ثم راقب أخطاء التهيئة قبل اعتبار التغيير تحسينًا.
حالة تطبيقية: صفحة مقال فيها ثلاث إضافات
افترض أن صفحة مقال تعرض العنوان والنص، وتحمّل في الوقت نفسه شريط المشاركة والتعليقات والبحث التفاعلي. سجل أولًا ما إذا كان النص موجودًا في HTML الأولي، ووقت ظهور العنوان، وأثر سكربت التعليقات على الخيط الرئيسي. جرّب تأجيل التعليقات إلى ما بعد عرض المحتوى، ثم قارن القياسات دون تغيير الخطوط أو الصور في الاختبار نفسه. إذا تحسن LCP لكن زر التعليقات توقف عن العمل، فالتجربة فاشلة وظيفيًا رغم تحسن رقم الأداء. إذا انخفض زمن الرسم في الاختبار المعملي بينما لم يتحسن لدى الزوار، افحص نسبة مستخدمي الأجهزة البطيئة وتوزيع الصفحات. لا تنسب النتيجة إلى JavaScript وحده ما لم يكن المتغير الذي عدلته معزولًا بوضوح.
كيف تربط نتائج المعمل ببيانات المستخدمين؟
استخدم بيانات الحقل لقياس تجربة الزيارات الحقيقية مع مراعاة الخصوصية، واجمعها حسب نوع الصفحة والجهاز والاتصال إن كان ذلك ممكنًا دون تعقب شخصي. المقاييس المجمعة لا تكشف وحدها سبب التأخير؛ استعملها لتحديد أين تبدأ التحقيقات المعملية. راقب حالات الواجهة التي تعمل بعد التفاعل الأول لأن INP يصف الاستجابة للتفاعل لا الرسم الأول. لا تجمع النتائج من فترة تسويقية شديدة الازدحام مع فترة هادئة دون إشارة إلى تغير الحمل. قد تكون التحسينات محدودة عند مستخدمي CDN القريبين وكبيرة لدى شبكات أخرى. اذكر نطاق القياس في تقريرك حتى لا تتحول أرقام الاختبار إلى وعود مطلقة.
جدول قرار بعد كل تجربة
قس أثر التغيير على ظهور المحتوى والتفاعل والأخطاء واستهلاك البيانات. إن تحسن الرسم ولم تتغير الوظائف فاحتفظ بالتعديل مؤقتًا وراقب بيانات الحقل. إن تحسن رقم واحد وتدهورت قابلية الاستخدام فراجع ترتيب التنفيذ. إن لم يتغير شيء، أعد فحص فرضيتك وابحث عن CSS أو صور أو خادم بدل إضافة تعديلات أخرى بلا دليل. احفظ trace قبل وبعد وأرقام إصدار الكود والجهاز والوقت؛ بهذه المعلومات يستطيع فريق آخر إعادة التجربة. للمزيد اقرأ شرح Performance API في MDN ومقال إيجي تاج عن Core Web Vitals، لكن تعامل مع المقاييس بوصفها أدوات لفهم المستخدم لا مسابقات للحصول على درجة مثالية.
المؤشرات إرشادية ولا تثبت السببية دون اختبار معزول
| تحسن FCP فقط | ربما ظهر هيكل مبكر | تحقق من العنوان الحقيقي و LCP |
| تحسن LCP وتدهور INP | تأجيل عمل إلى وقت التفاعل | راقب المهام بعد الرسم |
| لم يتغير الرسم بعد تقسيم JS | قد تكون الصورة أو CSS العامل الأكبر | راجع شريط الشبكة والتتبع |
| تحسن المختبر لا الحقل | اختلاف الأجهزة أو العينة | قارن فئات الزيارات |
قائمة تجربة قابلة للإعادة
- حدد العنصر المرئي الحاسم
- ثبت بيئة القياس قبل التغيير
- سجل عشر محاولات أو أكثر عند الحاجة
- اعزل تغيير JavaScript واحدًا
- افحص الأخطاء والتفاعل إلى جانب الرسم
- قارن الوسيط والتوزيع وبيانات الزوار
اختبار العودة إلى الصفحة والتنقل داخل التطبيق
يختلف تحميل صفحة لأول مرة عن العودة إليها من سجل المتصفح أو التنقل داخل تطبيق أحادي الصفحة. عند الرجوع قد يستعيد المتصفح حالة سابقة من bfcache دون تشغيل سلسلة تحميل جديدة، وفي التنقل الداخلي قد يتغير المحتوى دون حدث navigation تقليدي. لذلك لا تخلط هذه السيناريوهات مع تحميل بارد في رسم واحد. اختبر الضغط على رابط داخلي ثم الرجوع، وتحقق من أن العنصر الأساسي لا يختفي خلف شاشة تحميل إضافية أو حركة دخول مزدوجة. قد تكون المشكلة في ترتيب hydration أو في إعادة تنفيذ تأثير مرئي، لا في حجم JavaScript وحده. سجل نوع الانتقال مع كل قياس، وراجع ما إذا كانت أدواتك ترصد التنقلات الناعمة بصورة صحيحة. إذا لم تدعم الأداة ذلك، استخدم علامات أداء مخصصة ولا تعرض النتيجة باعتبارها LCP رسميًا لكل الحالات. والأهم أن تجمع بين الأداء وصحة العرض: ظهور النص بسرعة ثم وميضه وإعادة تركيبه قد يكون أسوأ للمستخدم من عرض ثابت أبطأ قليلًا. اعتمد قرارك على تجربة مرئية وتفاعل حقيقي بجانب الأرقام.
مصادر وتوسّع
تشرح وثائق MDN واجهات Performance و PerformanceObserver وقيود تسجيل البيانات: https://developer.mozilla.org/en-US/docs/Web/API/Performance_API و https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver . واقرأ كذلك على إيجي تاج «Core Web Vitals: ماذا تقيس ولماذا تهم المستخدم أكثر من رقم Lighthouse؟» لفهم الفروق بين مؤشرات التجربة العامة والتشخيص. المرجع لا يعني أن رقمًا واحدًا يصلح لجميع المواقع.
شارك في تقييم ونقاش المقال
رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.
النقاش
جارٍ تحميل التعليقات…