Hasan Mahmud
Müh. Hasan MahmudMekatronik & Gömülü Sistemler
← العودة إلى المقالات

Hasan TechLab / دراسة حالة تقنية

تحسين الأداء وتجربة المستخدم: كيف وصلت بموقعي إلى سرعة استثنائية وأرشفة كاملة

دراسة حالة تقنية متقدمة حول تحسين سرعة الموقع، وCore Web Vitals، وتقليل زمن LCP، وضغط الصور، وتحسين SEO التقني، وضبط خريطة الموقع التلقائية باستخدام Astro.

فلسفة الأداء في المنصات الهندسية

عند بناء منصة شخصية لعرض مشاريع الميكاترونكس والأنظمة المدمجة، يجب أن تعكس بنية الموقع نفسه معايير الهندسة الدقيقة: الكفاءة العالية، واستهلاك الموارد المنخفض، والاستجابة الفورية.

خلال التحديث الأخير لـ Hasan TechLab، ركزت على معالجة الاختناقات البرمجية وتحسين درجات الأداء في تقارير Google PageSpeed Insights وGoogle Lighthouse للوصول إلى أعلى تقييم ممكن على الحواسيب والهواتف. لم يكن الهدف الحصول على رقم مرتفع في اختبار واحد فقط، بل بناء تجربة سريعة ومستقرة وقابلة للقياس في ظروف استخدام حقيقية.

كيف قست الأداء قبل التعديل؟

بدأت بتسجيل خط أساس واضح قبل تغيير أي ملف. شملت المراجعة نسخة سطح المكتب ونسخة الجوال، لأن شبكة الهاتف ووحدة المعالجة والذاكرة تغيّر النتيجة بشكل كبير. راقبت المؤشرات التالية:

  • LCP - Largest Contentful Paint: الزمن اللازم لظهور أكبر عنصر مرئي في الشاشة.
  • INP - Interaction to Next Paint: سرعة استجابة الواجهة لتفاعل المستخدم.
  • CLS - Cumulative Layout Shift: مقدار تحرك العناصر أثناء تحميل الصفحة.
  • TTFB - Time to First Byte: الزمن بين طلب الصفحة ووصول أول بايت من الخادم.
  • حجم JavaScript وCSS والصور، وعدد الطلبات، والموارد التي تمنع العرض.

التمييز بين بيانات المختبر (Lab Data) وبيانات المستخدمين الفعلية (Field Data) مهم هنا. Lighthouse يساعد على اكتشاف الاختناقات بسرعة، بينما تقارير المستخدمين الحقيقيين تكشف أثر الأجهزة القديمة والشبكات البطيئة وأحجام الشاشات المختلفة.

أبرز التحسينات المنفذة

1. معالجة أبعاد الصور وتحميلها

  • المشكلة: كانت صورة الملف الشخصي تُحمّل بأبعاد أصلية كبيرة (1440×1440 بكسل وبحجم يقارب 101 كيلوبايت)، بينما تُعرض في الواجهة بمقاس 38×38 بكسل. أدى ذلك إلى زيادة استهلاك البيانات وتأخير مقياس LCP (Largest Contentful Paint) على شبكات الهاتف.
  • الحل: أُعيد تحجيم الصورة وضغطها بصيغة ويب خفيفة ومناسبة لأبعاد العرض الفعلية، مما وفّر أكثر من 95% من حجم النقل الخاص بهذا العنصر وسرّع الاستجابة الأولية.

لا يكفي اختيار صيغة WebP أو AVIF ثم إرسال الصورة الأصلية نفسها. يجب أن تتطابق أبعاد المورد مع أبعاد العرض المتوقعة، مع تحديد width وheight لمنع القفزات البصرية، واستخدام srcset عندما توجد أحجام متعددة. أما الصورة الموجودة في الجزء الأول من الصفحة فتحتاج إلى أولوية تحميل مناسبة، بينما الصور أسفل الشاشة يمكن تحميلها عند الحاجة.

2. تقليل تكلفة JavaScript والموارد

كل ملف JavaScript يُحمّل إلى المتصفح يحتاج إلى تنزيل وتحليل وتنفيذ. لذلك راجعت الأكواد التفاعلية، وأبقيت السلوك الضروري فقط في الصفحة الأولى، وتجنبت تحميل مكتبات كبيرة من أجل وظيفة صغيرة. كما أن استخدام مكونات Astro الثابتة يقلل JavaScript المرسل إلى المتصفح مقارنة بصفحة تعتمد على إعادة رسم كاملة من جهة العميل.

القاعدة العملية هي أن JavaScript يجب أن يخدم تفاعلًا واضحًا: فتح نافذة، تغيير لغة، نسخ بريد إلكتروني أو التفاعل مع مشروع. أما النصوص الثابتة والهيكل الأساسي فيُفضّل أن يصل إلى المتصفح كـ HTML جاهز وسريع.

3. تثبيت التخطيط وتحسين الوصول

تحسين الأداء لا ينفصل عن إمكانية الوصول. ضبط أبعاد الصور، والحفاظ على تسلسل عناوين صحيح، واستخدام تسميات واضحة للأزرار، ودعم لوحة المفاتيح، كلها تقلل الارتباك البصري وتحسن تجربة جميع المستخدمين. كما أن تجنب تغيّر التخطيط أثناء التحميل يساعد مباشرة في خفض CLS.

4. توليد خريطة الموقع الديناميكية (XML Sitemap)

  • المشكلة: لم تكن خريطة الموقع تُولّد بطريقة منظمة يمكن لمحركات البحث قراءتها مباشرة.
  • الحل: دُمجت حزمة @astrojs/sitemap الرسمية ضمن إعدادات astro.config.mjs مع ضبط عنوان الموقع الأساسي:
import sitemap from '@astrojs/sitemap';

export default defineConfig({
  site: 'https://hasantechlab.com',
  integrations: [sitemap()]
});

يضمن هذا الإجراء تحديث خريطة الموقع تلقائيًا عند إضافة صفحات أو مقالات جديدة إلى المنصة.

لكن sitemap وحدها لا تضمن الفهرسة. يجب أن تكون الصفحات قابلة للوصول من خلال روابط داخلية، وأن تحتوي على عنوان ووصف وcanonical URL واضح، وألا تمنعها تعليمات robots.txt. بعد النشر، أتحقق من الملف في Google Search Console وأراقب أخطاء الفهرسة والصفحات المستبعدة.

5. تحسين SEO التقني وبنية المحتوى

اعتمدت في المقال على بنية عناوين هرمية تبدأ بعنوان رئيسي واحد، ثم عناوين فرعية تصف مشكلة وحلًا ونتيجة. هذا يسهل القراءة على المستخدم وعلى محركات البحث معًا. كما أن دمج الكلمات المفتاحية يجب أن يكون طبيعيًا داخل العنوان والوصف والعناوين الفرعية والنص البديل للصور، لا عبر تكرار العبارة نفسها بشكل مصطنع.

من الكلمات التي تصف نطاق هذه الدراسة: تحسين سرعة الموقع، تحسين أداء الويب، Core Web Vitals، تحسين LCP، تقليل CLS، تحسين INP، SEO التقني، Astro Performance، Astro Sitemap، ضغط الصور، Google Lighthouse، وPageSpeed Insights.

6. خطة التحقق بعد النشر

بعد كل تعديل كبير، أكرر دورة قصيرة قابلة للمقارنة:

  1. تشغيل بناء الإنتاج بدل قياس نسخة التطوير.
  2. فحص حجم الملفات والموارد التي تمنع العرض.
  3. تشغيل Lighthouse على سطح المكتب والجوال.
  4. اختبار الصفحة في شبكة بطيئة وعلى شاشة صغيرة.
  5. التحقق من sitemap-index.xml وrobots.txt والروابط الأساسية.
  6. مراقبة Search Console وبيانات المستخدمين الحقيقيين بعد وصول زيارات كافية.

هذه الدورة تمنع تحسين مؤشر واحد على حساب تجربة أخرى؛ فقد يؤدي تأجيل صورة مهمة إلى تحسين حجم الصفحة لكنه يضر LCP، وقد يؤدي تقليل JavaScript بشكل مبالغ فيه إلى كسر التفاعل أو إمكانية الوصول.

7. تشريح رحلة تحميل الصفحة

رحلة الصفحة تبدأ قبل أن يرى المستخدم أول حرف. يترجم المتصفح اسم النطاق، وينشئ اتصالًا، ويرسل الطلب، وينتظر أول بايت، ثم يحلل HTML ويكتشف CSS والصور والخطوط والبرامج النصية.

أي مورد في هذه السلسلة قد يصبح عنق زجاجة. لذلك لا أتعامل مع LCP على أنه مشكلة صورة فقط، بل أتبعه إلى السبب السابق له: DNS، أو TTFB، أو CSS يمنع العرض، أو JavaScript يؤخر اكتشاف المورد.

التشخيص الصحيح يسأل: ما أول لحظة كان يمكن فيها للمتصفح أن يعرف المورد؟ وما الذي منعه من استخدامه؟

8. استراتيجية الخطوط

الخطوط المخصصة تحسن الهوية البصرية، لكنها قد تسبب FOIT أو FOUT إذا أُديرت بطريقة غير صحيحة.

أستخدم أوزانًا محدودة، وأتجنب تحميل وزن لا يظهر في الصفحة، وأضبط font-display: swap عندما يكون ظهور النص أهم من التطابق الفوري.

عند استخدام Google Fonts يجب مراجعة أثر الطلبات الخارجية على DNS وTLS. في الصفحات الحرجة يمكن استضافة الملفات محليًا، مع اختيار subset للغة المطلوبة بدل تحميل مجموعة Unicode كاملة.

9. CSS الذي يمنع العرض

CSS الكبير أو غير الضروري قد يؤخر أول رسم. لذلك يجب فصل الأنماط الحرجة عن الأنماط التي لا يحتاجها الجزء الأول من الصفحة.

لا يعني ذلك تقسيم الملفات عشوائيًا. يجب قياس حجم CSS وتحديد القواعد التي تكرر نفسها أو تأتي من مكتبة لا تحتاجها الصفحة.

تساعد Astro في إبقاء HTML ثابتًا، لكن طريقة استيراد CSS وعدد المكونات ما زالا يؤثران على الناتج النهائي.

10. JavaScript في الصفحة الأولى

كل سكربت يضيف تكلفة تنزيل وتحليل وتنفيذ. بعض الأكواد التفاعلية ضرورية، مثل تغيير اللغة أو فتح تفاصيل مشروع، لكن لا داعي لتحويل الموقع التعريفي كله إلى تطبيق عميل.

يفضل جعل المحتوى المهم موجودًا في HTML، ثم إضافة التفاعل تدريجيًا. هذا يحسن SEO ويجعل الصفحة مفيدة حتى قبل اكتمال JavaScript.

يجب كذلك تجنب listeners كثيرة على عناصر متشابهة عندما يمكن استخدام event delegation، مع الحفاظ على قابلية القراءة وعدم التضحية بسلوك لوحة المفاتيح.

11. تحسين الصور بطريقة قابلة للقياس

أبدأ بتحديد أبعاد العرض الفعلية لكل صورة. صورة avatar بحجم 38×38 لا تحتاج إلى ملف 1440×1440.

بعد ذلك أختار الصيغة وفق طبيعة المحتوى:

  • WebP مناسب لمعظم الصور ذات الضغط الجيد.
  • AVIF قد يعطي حجمًا أقل، لكن يجب اختبار الدعم وسرعة فك الترميز.
  • PNG مناسب للرسومات التي تحتاج شفافية أو حواف دقيقة.
  • SVG مناسب للأيقونات البسيطة، مع الانتباه إلى المصدر والثقة.

لا أستخدم loading="lazy" للصورة التي تمثل LCP. أما الصور البعيدة عن viewport فتستفيد غالبًا من التحميل الكسول.

12. منع Cumulative Layout Shift

يحدث CLS عندما يتحرك عنصر بعد أن يراه المستخدم. السبب الشائع هو صورة بلا أبعاد، أو إعلان بلا مساحة محجوزة، أو خط يغير حجم النص.

تحديد width وheight أو aspect-ratio يعطي المتصفح مساحة قبل وصول المورد.

كما يجب ألا يضاف شريط تنبيه أعلى الصفحة بعد التحميل دون حجز مساحة له، وألا يتغير ارتفاع الأزرار بسبب وصول خط متأخر.

13. تحسين INP والتفاعل

INP يقيس سرعة استجابة الصفحة لتفاعل المستخدم. لا يكفي أن تظهر الصفحة بسرعة إذا بقي زر اللغة أو نافذة المقال بلا استجابة.

المهام الطويلة في JavaScript تمنع المتصفح من تحديث الشاشة. يمكن تقسيم العمل، وتأجيل غير الضروري، وتقليل عمليات DOM الكبيرة.

في واجهة المقالات، يجب أن يكون فتح النافذة سريعًا، وأن لا يحاول الكود إعادة بناء أجزاء لا علاقة لها بالتفاعل.

14. تقليل TTFB والتخزين المؤقت

TTFB يتأثر بمكان الخادم، التخزين المؤقت، وقت توليد الصفحة، وطلبات الطرف الثالث. الصفحات الثابتة في Astro تقلل وقت التوليد عند الطلب، لكن لا يزال من المهم ضبط CDN وCache-Control واختيار منطقة نشر مناسبة.

الأصول ذات الأسماء الموقعة أو المولدة مع hash يمكن تخزينها لفترة طويلة:

Cache-Control: public, max-age=31536000, immutable

أما HTML وخريطة الموقع فيحتاجان سياسة أقصر حتى تصل التحديثات الجديدة. يجب التأكد من أن cache لا يعرض نسخة قديمة من robots.txt أو sitemap.

15. ميزانية الأداء

أضع ميزانية قابلة للمراجعة بدل عبارة عامة مثل “الموقع سريع”:

المورد الحد المقترح
JavaScript المضغوط أقل من 150 KB
CSS المضغوط أقل من 80 KB
الصورة الرئيسية أقل من 120 KB
عدد الطلبات الأولية أقل من 30
LCP على شبكة 4G أقل من 2.5 ثانية
CLS أقل من 0.1

هذه الأرقام ليست قانونًا عالميًا، لكنها تجعل regression قابلًا للاكتشاف في Pull Request.

16. Lighthouse مقابل PageSpeed Insights

Lighthouse يعمل بظروف مختبرية قابلة للتكرار، ولذلك هو ممتاز للمقارنة قبل وبعد التعديل.

PageSpeed Insights يعرض بيانات CrUX عندما تتوفر، وهي أقرب إلى تجربة مستخدمين حقيقيين بأجهزة وشبكات مختلفة.

لا أفسر نتيجة واحدة بمعزل عن السياق. أكرر القياس، وأقارن الوسيط، وأراجع التوزيع بين الجوال وسطح المكتب.

17. اختبار الجوال الحقيقي

المحاكي لا يمثل دائمًا هاتفًا قديمًا بذاكرة محدودة. لذلك أختبر على جهاز حقيقي، وأستخدم شبكة بطيئة أو throttling، وأراقب وقت ظهور النص واستجابة الأزرار.

الاختبار اليدوي يكشف مشاكل لا تظهر في الرقم، مثل التفاف العنوان، خروج الجدول من الشاشة، أو تداخل زر الإغلاق مع حافة النافذة.

18. SEO التقني وبنية المحتوى

لكل صفحة عنوان واضح ووصف يشرح فائدتها، وليس قائمة كلمات مفتاحية. العنوان يذكر الموضوع الأساسي، والوصف يلخص النتيجة، والعناوين الفرعية تجيب عن أسئلة حقيقية.

استخدام العبارة نفسها عشرات المرات قد يضر جودة النص. الأفضل تغطية المصطلحات القريبة مثل تحسين سرعة الموقع، أداء الويب، Web Performance، Core Web Vitals، وSEO التقني ضمن سياق مفيد.

خريطة الموقع تساعد محرك البحث على اكتشاف العناوين، لكن الروابط الداخلية تساعده على فهم العلاقة بينها. لذلك ترتبط مقالات الأداء وOTA وRing Buffer بسياق واضح بدل روابط عامة.

19. إمكانية الوصول كجزء من الأداء

الصفحة السريعة التي لا يمكن استخدامها بلوحة المفاتيح ليست منتجًا مكتملًا.

أتحقق من ترتيب Tab، ووضوح focus، ونصوص الأزرار، والتباين، ووجود lang وdir المناسبين للمقال العربي.

تثبيت أبعاد الصور يقلل CLS، بينما العناوين الهرمية والتسميات الواضحة تساعد قارئات الشاشة على التنقل، لذلك تتقاطع إمكانية الوصول مع مؤشرات الأداء أكثر مما يبدو.

20. المراقبة ومنع الانحدار

بعد نشر نسخة جيدة، يمكن أن يتدهور الأداء بسبب صورة جديدة أو مكتبة جديدة. لذلك أراجع تقرير البناء، وأفحص حجم الملفات، وأعيد Lighthouse عند تغيير المكونات الأساسية.

أحتفظ بنتائج القياس بتاريخها حتى أعرف هل التحسن مستمر أم كان نتيجة مؤقتة. كما أراقب sitemap-index.xml وrobots.txt وحالة الفهرسة في Search Console.

21. أخطاء تحسين شائعة

  • ضغط كل الصور دون الانتباه إلى النص داخلها.
  • تأجيل صورة LCP باستخدام lazy loading.
  • إزالة JavaScript ضروري ثم إعادته بطريقة أكبر.
  • الاعتماد على Lighthouse مرة واحدة.
  • إضافة كلمات مفتاحية لا علاقة لها بالنص.
  • إنشاء sitemap دون ضبط site الأساسي.
  • نسيان اختبار الصفحة من اليمين إلى اليسار.

22. قائمة فحص قبل النشر

  1. هل يعمل build الإنتاجي دون أخطاء؟
  2. هل يظهر عنوان ووصف فريدان؟
  3. هل لكل صورة أبعاد ونص بديل مناسب؟
  4. هل LCP أقل من الهدف على الجوال؟
  5. هل CLS مستقر أثناء تحميل الخطوط والصور؟
  6. هل أزرار اللغة والنافذة تعمل بلوحة المفاتيح؟
  7. هل روابط المقالات الداخلية صحيحة؟
  8. هل sitemap وrobots.txt متاحان؟
  9. هل لا توجد موارد خارجية غير ضرورية؟
  10. هل تم اختبار صفحة المقال على شاشة صغيرة؟

النتائج والأرقام المحققة

بعد نشر التحديثات في بيئة الإنتاج، أظهرت تقارير Lighthouse النتائج التالية:

المقياس سطح المكتب الجوال
الأداء (Performance) 100 / 100 90+ / 100
أفضل الممارسات (Best Practices) 100 / 100 100 / 100
تحسين محركات البحث (SEO) 100 / 100 100 / 100
إمكانية الوصول (Accessibility) 96 / 100 96 / 100
زمن استجابة الخادم 0.8 ثانية سريع ومستقر

ما الذي يمكن تحسينه لاحقًا؟

النتائج الحالية تمثل نقطة قوية، لكنها ليست نهاية العمل. الخطوة التالية هي جمع بيانات حقيقية من الزوار، وتحسين الصور المتبقية، ومراجعة حجم الخطوط، وإضافة اختبارات آلية تمنع عودة الصور الكبيرة أو الروابط المكسورة. كما يمكن إضافة سياسة تخزين مؤقت أكثر دقة للأصول الثابتة ومراقبة أداء صفحات المقالات عند زيادة عددها.

الخلاصة

تحسين الأداء ليس خطوة تجميلية، بل جزء من جودة المنتج نفسه. تقليل حجم الأصول، وضبط JavaScript، وتحسين Core Web Vitals، وكتابة HTML قابل للوصول، وتوفير خريطة موقع صحيحة، كلها قرارات مترابطة ترفع سرعة التجربة وقابليتها للاكتشاف في الوقت نفسه. أفضل نتيجة لا تأتي من حيلة واحدة، بل من قياس مستمر وقرارات صغيرة يمكن إثبات أثرها بالأرقام.