100 نقطة في PageSpeed: ما الذي غيّرناه لأجل ذلك
زمن التحميل عامل في الترتيب، لكن النصائح المعتادة نادراً ما تساعد. تصف هذه المقالة ما غيّرناه فعلاً في موقعنا، وكم أفاد كل إجراء، وأين انحرفنا عن الطريق.
أهم ما في الأمر باختصار
- أكبر مكسب منفرد لم يأتِ من تصغير الملفات، بل من استبدال مكتبة بحجم 458 كيلوبايت بـ 6 كيلوبايت من كود خاص.
- ثاني أكبر سبب كان ضغطاً مضبوطاً نصفياً: الخادم كان يضغط HTML فقط، لا CSS وJavaScript.
- قفزة تخطيط بقيمة 1 كلّفت 24 نقطة — سبّبها CSS مُحمَّل لاحقاً لم يعمل إلا بعد أول بناء للصورة.
- الأقل فائدة: صيَغ الصور. الأكثر فائدة: حذف الأشياء.
كانت القيمة الابتدائية 58 من 100 على الهاتف. وهذه قيمة ليست سيّئة لموقع فيه تأثير ثلاثي الأبعاد في الرأس، لكنها قيمة يعاقب عليها Google بوضوح في البحث على الهاتف. وفي النهاية بلغنا 100 نقطة على الحاسوب و98 على الهاتف، مع 100 كذلك لإمكانية الوصول.
ما يلي ليس قائمة تحقّق عامة، بل المسار الفعلي — بما في ذلك المواضع التي أخطأنا فيها.
الوضع الابتدائي
| قيمة القياس (على الهاتف) | قبل | بعد |
|---|---|---|
| الأداء | 58 | 98 |
| إمكانية الوصول | 95 | 100 |
| أول بناء للصورة | 6,1 ث | 1,4 ث |
| أكبر عنصر ظاهر | 11,1 ث | 2,1 ث |
| إجمالي المنقول | 298 كيلوبايت | 184 كيلوبايت |
| منها JavaScript | 121 كيلوبايت | 5 كيلوبايت |
التدخّلات الخمسة التي كان لها وزن فعلي
1. استبدال المكتبة لا تحسينها
يعرض الرأس سحابة جسيمات ثلاثية الأبعاد. لأجل ذلك كانت تعمل مكتبة رسوميات معروفة — 458 كيلوبايت بعد التصغير. وأظهر القياس أن 51 كيلوبايت منها لم تُنفَّذ أبداً على الإطلاق.
النظرة الحاسمة كانت السؤال: كم نحتاج فعلاً؟ كانت أحد عشر لبنة: المُصيِّر، والمشهد، والكاميرا، والهندسة، والخامة، وبضع فئات مساعدة. وكل ذلك يمكن برمجته مباشرةً على واجهة الرسوميات في المتصفّح.
النتيجة: صارت 458 كيلوبايت إلى 6 كيلوبايت. والعرض مطابق — أخذنا المُظلِّلات نفسها.
2. الضغط كان مُشغَّلاً نصفياً فقط
في إعداد الخادم كان الضغط على «تشغيل» — لكن السطر الذي يحدّد أنواع الملفات التي تُضغَط كان معطّلاً بتعليق. وهذا هو الإعداد الافتراضي في كثير من التوزيعات. النتيجة: كان يُضغَط HTML وحده حصراً.
فكانت مكتبة الرسوميات تمرّ عبر الخطّ من دون ضغط. وبعد التشغيل: صارت 1243 كيلوبايت إلى 251 كيلوبايت. وإضافةً إلى ذلك نضع الآن النسخ المضغوطة محسوبةً مسبقاً بجانبها كي لا يحسبها الخادم من جديد عند كل طلب.
الجهد: سطران من الإعداد. الأثر: نحو ميغابايت لكل استدعاء أول.
3. إزالة مكتبة الحركة بالكامل
لأجل الظهور عند التمرير كانت تعمل مكتبة أخرى، 114 كيلوبايت. وأظهرها القياس فوق ذلك مُسبِّبةً لإعادات تخطيط قسرية — كانت تستعلم عن الهندسة أثناء التمرير وتُجبِر المتصفّح على إعادة حساب التخطيط في وسط الحركة.
استُبدِلت بـ IntersectionObserver يكتفي بوضع فئة. أما الحركة نفسها فيصنعها CSS. 114 كيلوبايت أقل، ولا إعادات بعد ذلك، ونحو 40 سطراً من كود خاص.
4. أيقونة الموقع كانت بحجم 205 كيلوبايت
أمر صغير بأثر مدهش، لأنه يُحمَّل مبكّراً جداً. استُبدِل بملف SVG بحجم 6 كيلوبايت، أُنشئ من الشعار الموجود.
هل كنت تعلم؟
لأجل العرض في نتائج بحث Google لا تنفع أيقونة SVG — فـ Google لا يقبل هناك إلا الصيَغ النقطية، ويجب أن تكون الصورة مربّعة بطول ضلع من مضاعفات 48 بكسل.
فمن يضع SVG فقط يحصل في نتيجة البحث على العنصر النائب الرمادي بدل شعاره الخاص. وذكرهما معاً جنباً إلى جنب هو الطريق الصحيح.
5. الاستعلام عن الهندسة في إطار الحركة
كان سكربت يقرأ الارتفاع الكلّي للمستند عند كل حدث تمرير. وهذه الخاصية لا يستطيع المتصفّح أن يجيب عنها من الذاكرة — بل عليه لأجلها أن يعيد حساب تخطيط الصفحة كلها، في وسط التمرير.
القاعدة التي تلي ذلك وتنطبق في كل مكان: اقرأ في الحدث، واكتب في الإطار التالي. ولا العكس أبداً. ومنذ ذلك يُقاس ارتفاع الصفحة مرة واحدة ويُحفَظ بدل أن يُستعلَم عنه ستين مرة في الثانية.
الخطأ الذي كلّف 24 نقطة
للتخلّص من آخر طلب حاجب، كنا قد قسّمنا ورقة الأنماط: الجزء اللازم للمنطقة الظاهرة يدخل مباشرةً في المستند، والباقي يُحمَّل لاحقاً. إجراء شائع.
وقع القطع عند علامة في الملف المصدر ظننّا خلفها المنطقة الظاهرة. لكن خلفها في الواقع كانت قواعد الشعار في الرأس، والمسافات تحته، والظهور. فبُنيت الصفحة من دونها ثم أُزيحت إلى موضعها بعد ثانية.
النتيجة: Cumulative Layout Shift بقيمة 1,0 — وبذلك 76 بدل 100 نقطة على الحاسوب. والأشدّ إزعاجاً: محلياً بخطّ مُبطَّأ كانت القيمة 0، لأن ورقة الأنماط كانت تصل هناك مبكّراً بما يكفي. لم يكن الخطأ ظاهراً إلا على الاتصال السريع.
الدرس: إمّا ورقة الأنماط كلها في المستند أو لا شيء منها. الإدراج الجزئي يفترض أن تعرف بالضبط أي قاعدة تلزم في المنطقة الظاهرة — وهذا لا تعرفه على صفحة متنامية بشكل دائم أبداً.
ما أفاد قليلاً
لأجل الاكتمال، إليك الإجراءات التي ترد في كل دليل وكانت لدينا بالكاد قابلة للقياس:
صيَغ الصور. صفحتنا الرئيسة تكاد لا تحوي صوراً — والشعار ملف SVG. حيث ترد الصور، يستحقّ التحويل عناءه بالطبع؛ أما كعامل رئيس فلا يصلح إلا في الصفحات الغنيّة بالصور.
مزيد من تصغير الخطوط. نستضيف عائلتَي خطوط بأنفسنا ونُحمِّل مسبقاً ما يلزم للمنطقة الظاهرة. مزيد من التحسين ممكن، لكنه لا يحرّك القيمة.
موقع الخادم. يُنصَح به كثيراً، وفي حالتنا غير ذي صلة: زمن الوصول إلى أول بايت كان أصلاً 20 مِلّي ثانية. ومن هو جيّد هناك أصلاً لا يكسب شيئاً من شبكة توزيع.
الطريقة للمحاكاة
- قِس قبل تغيير أي شيء. الهاتف والحاسوب منفصلين، ودوّن القيم.
- ابحث عن أكبر ملف منقول. يكاد يكون دائماً JavaScript. والسؤال ليس كيف تصغّره، بل هل تحتاجه.
- افحص الضغط. لا هل هو مُشغَّل، بل لأي أنواع ملفات.
- عُدّ الطلبات الحاجبة. كل ملف ورقة أنماط في الرأس يؤخّر أول بناء للصورة.
- افحص قفزات التخطيط بلا إبطاء. ذلك الاختبار الوحيد الذي فاتنا.
- قِس من جديد بعد كل تغيير. وإلا لن تعرف في النهاية ما الذي أثّر.
ساعِدني في ترجمة تقرير PageSpeed لصفحتي إلى ترتيب. كُن صارماً؛ لا تمدح شيئاً. قيم قياسي: - الهاتف: [عدد النقاط]، الحاسوب: [عدد النقاط] - LCP وTBT وCLS لكل جهاز: [قيم] - أكبر الملفات المنقولة مع الحجم: [قائمة] - الطلبات الحاجبة للتصيير: [قائمة] - رسائل التقرير: [أدرِج النصّ] عن الصفحة: - كيف بُنيت: [CMS / ثابتة / أداة بناء] - هل يُحتاج JavaScript للمحتوى الظاهر؟ [نعم/لا] - كيف يُسلَّم CSS؟ [خارجي / مسبق / مسبق جزئياً] المهام: 1. اربط كل رسالة بسبب وقُل أي مؤشّر تؤثّر فيه — LCP أو TBT أو CLS. 2. رتّب الإجراءات حسب الأثر لكل جهد. واذكر لكلٍّ كم نقطة يحرّكها واقعياً ولماذا. 3. اذكر الإجراءات من التقرير التي لا تفيد عملياً في نوع بنائي — وعلِّل بدل أن تحذفها فحسب. 4. عند كل ملف JavaScript كبير اسأل أولاً هل يُحتاج، قبل أن تقترح التصغير. 5. نبِّه إن كان CSS يُسلَّم مسبقاً جزئياً فقط، واشرح لماذا قد يكون ذلك أسوأ لـ CLS من عدمه. 6. اذكر ما ينبغي أن أقيسه من جديد بعد كل تغيير. لا تختلق قيم قياس.
الخلاصة
عدد النقاط بذاته ليس الهدف — فهو قيمة قياس لا نتيجة عمل. المهم هو التجربة خلفه: صفحة تصير مقروءة بعد 1,4 ثانية يقرؤها عدد أكبر من الناس ممن يقرؤون صفحة تحتاج ستّ ثوانٍ. ولدى زوّار الهاتف عبر شبكة الجوّال يكون الفرق أكبر من أي تحسين للنصّ.
والطريق إلى ذلك مرّ في حالتنا عبر سؤال واحد متكرّر: هل نحتاج هذا؟ خمسة من ستّة تدخّلات كانت حذف شيء، لا إضافة شيء.
أسئلة شائعة
كيف تبلغ 100 نقطة في PageSpeed Insights؟
في معظم المواقع عبر ثلاث خطوات: إزالة أكبر ملف JavaScript أو استبداله، وتشغيل الضغط فعلاً لـ CSS وJavaScript، وإزالة قفزات التخطيط. أما صيَغ الصور وموقع الخادم فنادراً ما يكونان عنق الزجاجة.
ما مدى أهمية زمن التحميل لترتيب Google؟
هو عامل مؤكَّد لكنه ليس قوياً — المحتوى والملاءمة أثقل وزناً. الأثر الأكبر غير مباشر: الصفحات البطيئة يُغادَر عنها أكثر، وهذا السلوك يدخل في التقييم.
ما Cumulative Layout Shift وكيف يُعالَج؟
هو قيمة قياس للعناصر التي تغيّر موضعها بعد أول بناء للصورة. أكثر الأسباب شيوعاً: صور بلا أبعاد ثابتة، وأوراق أنماط مُحمَّلة لاحقاً، وخطوط بمقاييس شديدة الاختلاف. ويُعالَج بأن يكون المكان محدَّداً مسبقاً — عبر ذكر العرض والارتفاع أو نسبة أبعاد ثابتة.
هل ينبغي إدماج CSS في HTML؟
مع أوراق الأنماط الصغيرة نعم، لكن كاملةً عندئذٍ. الإدراج الجزئي مع تحميل الباقي لاحقاً يوفّر طلباً ويجلب في المقابل قفزات تخطيط بمجرّد أن تغيب قاعدة تلزم في المنطقة الظاهرة. لدينا كانت 7 كيلوبايت مضغوطة — ولأجل ذلك يستحقّ الإدراج الكامل.
كم يفيد التخلّي عن المكتبات؟
في حالتنا كان أكبر بند منفرد: 458 كيلوبايت من مكتبة رسوميات صارت 6 كيلوبايت من كود خاص، إضافةً إلى 114 كيلوبايت من مكتبة حركة إلى صفر. وهل يستحقّ ذلك يتوقّف على كم تستخدم من المكتبة فعلاً — والقياس يُظهِر JavaScript غير المستخدَم.
تسويق يُعِدّ نفسه بنفسه
النسخة التجريبية من Studio Engine متاحة الآن. احجز مكانك وشارك في تشكيلها منذ البداية.
انضمّ إلى النسخة التجريبية ←