معمل
تدقيق الأداء وإصلاحه
25 دقيقة
متوسط3 المحاولات المجانية
التعليمات
الهدف
لديك تطبيق React يعاني من مشاكل أداء حادة. مهمتك هي تحديد وإصلاح المشاكل التي تؤثر على جميع مقاييس Core Web Vitals الثلاثة: LCP و CLS و INP.
التطبيق المشكل
التطبيق هو صفحة قائمة منتجات تحتوي على مشاكل أداء متعمدة:
مشاكل LCP
- صورة البطل بحجم 2 ميغابايت بتنسيق PNG غير محسّن بدون سمات عرض/ارتفاع
- ثلاثة خطوط Google تحجب العرض مُحمّلة عبر
<link>في الرأس - جميع CSS في حزمة واحدة كبيرة (بدون استخراج CSS حرج)
- لا يوجد تحميل مسبق لصورة البطل
مشاكل CLS
- صور المنتجات بدون عرض/ارتفاع أو نسبة عرض إلى ارتفاع محددة
- لافتة ترويجية تُدرج ديناميكيًا بعد ثانيتين
- تبديل خط الويب يسبب إزاحة تخطيط مرئية (بدون
size-adjust) - مساحة إعلانية بدون ارتفاع محجوز
مشاكل INP
- تصفية المنتجات تُشغّل حلقة متزامنة على 10,000 عنصر عند كل ضغطة مفتاح
- دالة الترتيب تحجب الخيط الرئيسي لأكثر من 300 مللي ثانية
- معالجات النقر تُطلق إعادة حسابات تخطيط متزامنة (إعادة تدفق قسرية)
مهامك
المهمة 1: إصلاح LCP (35 نقطة)
- حوّل صورة البطل لاستخدام
<picture>مع مصادر AVIF/WebP وبديل JPG - أضف
widthوheightوfetchpriority="high"لصورة البطل - أضف
<link rel="preload">لصورة البطل - استخدم
font-display: swapللخطوط المخصصة وحمّل ملف الخط الأساسي مسبقًا - استخرج CSS الحرج فوق الطي في كتلة
<style>مضمنة
المهمة 2: إصلاح CLS (30 نقاط)
- أضف سمات
widthوheight(أو CSSaspect-ratio) لجميع صور المنتجات - احجز مساحة للافتة الترويجية باستخدام
min-heightقبل تحميلها - أضف
size-adjustوascent-overrideوdescent-overrideلقاعدة@font-faceلتقليل إزاحة تبديل الخط - حدد
min-heightثابتًا لحاوية المساحة الإعلانية
المهمة 3: إصلاح INP (35 نقطة)
- أجّل إدخال البحث/التصفية بتأخير 300 مللي ثانية
- قسّم تصفية المنتجات لدفعات باستخدام
setTimeout(fn, 0)أوscheduler.yield()للتنازل للخيط الرئيسي - انقل مقارنة الترتيب لـ Web Worker أو قسّمها لدفعات متنازلة
- استبدل أنماط إعادة التدفق القسرية (قراءة
offsetHeightبعد كتابة الأنماط) بتجميعrequestAnimationFrame
كود البداية
يمثل كود البداية أدناه التطبيق المعطل. أصلح المشاكل في مكانها.
معايير التقييم
سيتم تقييم تقديمك بناءً على ما إذا كانت الإصلاحات تعالج بشكل صحيح كل مشكلة Core Web Vital. لا تحتاج لتشغيل Lighthouse — معايير التقييم تتحقق من كودك لأنماط التحسين المحددة.
معايير التقييم
إصلاح LCP — صورة البطل تستخدم <picture> مع مصادر AVIF/WebP، لديها عرض/ارتفاع و fetchpriority='high'، أُضيف <link rel='preload'>، الخطوط تستخدم font-display: swap والخط الأساسي محمّل مسبقًا، CSS الحرج مُضمّن35 نقاط
إصلاح CLS — صور المنتجات لديها عرض/ارتفاع أو نسبة عرض إلى ارتفاع، حاوية اللافتة الترويجية لديها min-height لحجز المساحة حتى قبل تحميل المحتوى، @font-face يتضمن size-adjust/ascent-override/descent-override، المساحة الإعلانية لديها min-height ثابت30 نقاط
إصلاح INP — إدخال البحث مؤجل (300 مللي ثانية)، تصفية المنتجات تستخدم معالجة مُقسمة مع setTimeout أو scheduler.yield لتجنب الحجب، إعادة التدفق القسرية أُزيلت باستخدام requestAnimationFrame لقراءة/كتابة الأنماط35 نقاط
حلك
يمكنك استخدام أي لغة برمجة
3 محاولات مجانية متبقية