المستوى: محترف
أتمتة Performance Budget على CI: ارفض أي PR يخفّض الأداء قبل الـ merge
كل أسبوع تطبيقك بيتقل 80ms في الـ LCP وانت ما تلاحظش. بعد سنة الموقع بقى أبطأ بـ 4 ثواني والمنافس سرق نصف الزوار. السبب مش مهندس واحد عمل غلطة كبيرة. السبب 30 PR كل واحد ضايف 30KB من JavaScript أو طلب API جديد، ومحدش قاس الأثر التراكمي لأن الأداء بيتقاس مرة واحدة وقت الكوارث. الـ Performance Budget على CI بيمنع ده تلقائيًا: لو PR زوّد الـ LCP أكثر من 200ms أو رفع حجم الـ bundle 50KB، الـ build بيفشل والـ merge بيتقفل لحد ما المطور يصلح.
المشكلة باختصار
Code review بيمسك bugs المنطق. لكن هل المراجع هيلاحظ إن مكتبة جديدة بتضيف 80KB gzipped؟ لو هو شخصيًا فاتح DevTools على tab الـ Network وبيقارن قبل/بعد، أكيد. لكن في Pull Request عادي بيشوف diff الكود فقط، الأداء غير مرئي. النتيجة: regression بيتسرّب أسبوعيًا في تطبيقات كبيرة وبيتراكم بصمت.
تخيّل صاحب مطعم يضيف صنف جديد كل أسبوع للقائمة بدون ما يحسب الأكل اللي بيتبهدل. بعد سنة المطبخ مش قادر يسلّم الطلب في وقته، والزبون بيشتكي من غير ما حد يعرف ليه. أنت محتاج "ميزان" بيقيس قبل ما الصنف يتضاف للقائمة. ده بالظبط الـ Performance Budget على CI: ميزان آلي بيقيس كل تغيير قبل ما يدخل الإنتاج.
الـ Performance Budget — التعريف الدقيق
Performance Budget هو ملف اتفاق بين الفريق على حدود قصوى لمقاييس قابلة للقياس: LCP، INP، CLS، حجم الـ JavaScript، عدد الطلبات، وزمن TTFB. الـ CI بيشغّل قياس فعلي لكل PR وبيقارن بالحد. لو القياس تخطّى الحد، الـ build حالته فاشل ومحدش يقدر يـ merge.
الفرق بين Performance Budget و Lighthouse العادي: Lighthouse بيدّيك رقم. Budget بيحوّل الرقم لـ assertion. assertion يفشل = workflow يفشل = merge مقفول. ده اللي بيحوّل الأداء من "حاجة بنشوفها لما تبوظ" لـ "حاجة الـ pipeline بيحرسها زي اختبارات الوحدة".
المقاييس الأساسية اللي تحطّها في الميزانية
- LCP (Largest Contentful Paint): زمن ظهور أكبر عنصر مرئي. الميزانية الموصى بها < 2.5 ثانية على شبكة 4G محاكاة.
- INP (Interaction to Next Paint): زمن استجابة الواجهة لأسوأ تفاعل. < 200ms.
- CLS (Cumulative Layout Shift): مقدار قفز التخطيط. < 0.1.
- Total Byte Weight: مجموع الـ assets المحمّلة. ابدأ بـ 1.6MB واتشدد كل ربع سنة.
- Unused JavaScript: الكود اللي بيتحمّل وما بيتنفّذش. < 50KB warning.
الإعداد بـ Lighthouse CI
Lighthouse CI أداة من Google مفتوحة المصدر بتشغّل Lighthouse في الـ pipeline وبتقارن النتيجة بميزانيتك. خطوات الإعداد على GitHub Actions أربعة فقط:
- ثبّت الأداة كـ devDependency:
npm i -D @lhci/cli. - أنشئ ملف
lighthouserc.jsonفي جذر المشروع.