تحسين الأداء 2025

تحسين أداء JavaScript
كيف توقف مشكلة الـ Render-Blocking؟

تُعتبر ملفات الجافاسكريبت العدو الأول لسرعة المواقع. تعلم كيف تعمل هذه الملفات على حظر عرض الصفحة، وكيفية استخدام Defer و Async وتقسيم الأكواد لتقليل وقت التحميل وتحسين مؤشرات Core Web Vitals.

أبريل 2025
20 دقيقة قراءة
فريق Seovix
≤200ms
الهدف لمؤشر INP
< 50ms
الحد الأقصى للمهمة (Task)
Defer
القاعدة الذهبية للتحميل
جدول المحتويات
1
لماذا JavaScript مُدمرة للسرعة؟
2
ما هو الـ Render-Blocking؟
3
الفرق بين Async و Defer
4
الضغط والتصغير (Minification)
5
تقسيم الأكواد (Code Splitting)
6
التعامل مع سكريبتات الطرف الثالث
7
تحسين مؤشر INP والخيط الرئيسي
8
حلول جاهزة لمستخدمي WordPress
المشكلة الأساسية

لماذا JavaScript هي العدو الأول لسرعة موقعك؟

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

رحلة الجافاسكريبت تتضمن: التحميل (Download) ← التحليل (Parse) ← الترجمة (Compile) ← التنفيذ (Execute). كل هذه الخطوات تتم على ما يُسمى بـ "الخيط الرئيسي" (Main Thread) للمتصفح. وطالما أن هذا الخيط مشغول بمعالجة الجافاسكريبت، فإن الصفحة تتجمد ولا يستطيع المستخدم النقر على أي شيء.

98%
من مواقع الويب اليوم تعتمد على JavaScript لتعمل.
1-3 ث
متوسط الوقت الضائع في تنفيذ السكريبتات على الجوال.
500KB+
متوسط حجم الجافاسكريبت المرسل للمتصفح (وهو رقم ضخم).
حظر العرض

ما هو الـ Render-Blocking؟ (عنق الزجاجة)

أشهر تحذير ستراه في أداة PageSpeed Insights هو: "Eliminate render-blocking resources". لكي نفهم هذا، يجب أن نعرف كيف يبني المتصفح الصفحة. يقرأ المتصفح كود HTML من الأعلى إلى الأسفل. إذا صادف وسم <script> في منتصف الـ HTML، فإنه يتوقف تماماً عن بناء الصفحة، يقوم بتحميل السكريبت، ثم ينفذه، وبعدها فقط يكمل قراءة باقي الـ HTML.

بدون تحسين (Render-Blocking)
قراءة HTML تبدأ.
مصادفة <script src="app.js">.
توقف مؤقت: الشاشة بيضاء تماماً.
تحميل وتنفيذ الملف.
استكمال قراءة HTML وظهور الصفحة.

يؤدي إلى ارتفاع كارثي في مؤشر LCP (أكبر رسم محتوى).

مع تحسين (Non-Blocking)
قراءة HTML تبدأ ولن تتوقف.
مصادفة <script defer src="app.js">.
التحميل في الخلفية: الشاشة تظهر للمستخدم.
انتهاء قراءة HTML وبناء واجهة المستخدم.
تنفيذ السكريبت أخيراً.

سرعة ظهور الصفحة خيالية ومؤشر LCP ممتاز.

الحل السحري

الفرق بين Async و Defer (كيف ومتى تستخدمهما؟)

لحل مشكلة إيقاف العرض (Render-Blocking)، وفرت لنا HTML سمتين أساسيتين تضافان إلى وسم السكريبت وهما: async و defer. كلاهما يقوم بتحميل الملف في الخلفية دون إيقاف المتصفح، لكن الاختلاف يكمن في وقت التنفيذ.

سمة (Async) - التحميل والتنفيذ العشوائي
مثال: <script async src="analytics.js">
يتم تحميل الملف في الخلفية. بمجرد انتهاء التحميل، يتوقف عرض الصفحة فوراً ليتم تنفيذ السكريبت. كما أنه لا يحترم ترتيب السكريبتات (السكريبت الخفيف الذي يحمل أولاً يُنفذ أولاً).
متى نستخدمه؟ لسكريبتات التتبع المستقلة (مثل Google Analytics) التي لا تعتمد على سكريبتات أخرى.
سمة (Defer) - التحميل الآمن والمنظم
مثال: <script defer src="main.js">
يتم تحميل الملف في الخلفية، لكن لا يتم تنفيذه أبداً إلا بعد انتهاء بناء الصفحة بالكامل (HTML Parsing). الأهم من ذلك، أنه يحترم الترتيب (ينفذ السكريبت الأول ثم الثاني).
متى نستخدمه؟ هو الخيار الأفضل والآمن لـ 95% من ملفات موقعك (مثل ملفات القالب، سلايدر، قوائم الهاتف).
تقليل الحجم

الضغط والتصغير (Minification & Compression)

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

1
تصغير الكود (Minification)
المبرمج يكتب الكود بمسافات، تعليقات، وأسماء متغيرات طويلة ليكون مقروءاً. التصغير هو إزالة كل هذه المسافات وتغيير أسماء المتغيرات لحرف واحد (مثل let a = 5; بدلاً من let userAge = 5;). هذا يقلل الحجم بنسبة 30% إلى 40%. الملف الناتج ينتهي غالباً بـ .min.js.
2
ضغط الخادم (Brotli / Gzip Compression)
بعد تصغير الملف، يقوم الخادم (Server) بضغطه قبل إرساله للمتصفح باستخدام خوارزمية Gzip أو الخوارزمية الأحدث والأقوى Brotli. المتصفح يقوم بفك الضغط في أجزاء من الثانية. هذا يوفر 70% من الحجم النهائي للشبكة.
تفعيل Brotli عبر Cloudflare
إذا كنت تستخدم شبكة Cloudflare، انتقل إلى قسم (Speed) ثم (Optimization) وتأكد من تفعيل خيار Brotli. إنه يتفوق على Gzip في ضغط ملفات JS بنسبة تصل إلى 20%.
الهندسة المتقدمة

تقسيم الأكواد و إزالة المهمل (Code Splitting & Tree Shaking)

من أكبر الكوارث في تصميم الويب الحديث هو تجميع كل أكواد الجافاسكريبت (للسلايدر، النوافذ المنبثقة، اتصل بنا، المتجر) في ملف واحد ضخم (bundle.js) بحجم 2 ميجابايت، وتحميله في جميع صفحات الموقع!

ما هو Tree Shaking (هز الشجرة)؟

تخيل أن الكود هو شجرة. أنت تقوم بهزها لتسقط الأوراق الميتة. في البرمجة الحديثة (عبر أدوات مثل Webpack أو Vite)، يتم فحص الكود وحذف أي مكتبة أو دالة (Function) موجودة في الملف ولكن لا يتم استخدامها فعلياً في الموقع.

ما هو Code Splitting (تقسيم الكود)؟

بدلاً من تحميل ملف واحد ضخم، نقوم بتقسيمه لملفات صغيرة. مثال: الكود الخاص بشريط الدفع (Checkout) يجب أن يُحمل فقط عندما يدخل المستخدم لصفحة الدفع، ولا داعي لتحميله في الصفحة الرئيسية. تحميل "ما نحتاجه فقط، وقتما نحتاجه" هو جوهر الأداء الحديث.

أطراف خارجية

كيفية ترويض سكريبتات الطرف الثالث (Third-Party)

قد تقوم بتحسين أكوادك بنسبة 100%، ثم يأتي فريق التسويق ويضيف (Facebook Pixel, Google Tag Manager, Hotjar, إعلانات أدسنس، وودجت المحادثة المباشرة). فجأة، ينهار أداء الموقع بالكامل!

استراتيجيات التعامل معها:

التأخير عند التفاعل (Delay on Interaction): هي الاستراتيجية الأقوى. لا تقم بتحميل Facebook Pixel أو أداة الدردشة إلا عندما يقوم المستخدم بأول حركة (تحريك الماوس، التمرير Scroll، أو النقر). هذا يضمن درجة 100 في PageSpeed لأن أداة الفحص لا تتفاعل مع الموقع.
نمط الواجهة (Facade Pattern): لخدمات مثل يوتيوب أو خرائط جوجل. بدلاً من تحميل الـ iframe الثقيل لليوتيوب، اعرض صورة غلاف الفيديو مع زر "تشغيل" مزيف. عندما ينقر المستخدم، قم بتحميل السكريبت الحقيقي.
Preconnect & DNS-Prefetch: إذا كنت مضطراً لتحميل سكريبت خارجي مبكراً، أضف <link rel="preconnect" href="https://example.com"> في الهيدر، ليقوم المتصفح بإنشاء اتصال مبكر بالخادم الخارجي وتوفير بضع مئات من الأجزاء من الثانية.
مؤشر التفاعل

تحسين مؤشر INP والخيط الرئيسي (Main Thread)

في مارس 2024، أصبح مؤشر INP (Interaction to Next Paint) معياراً رسمياً في Core Web Vitals. يقيس هذا المؤشر استجابة الموقع عند النقر أو الكتابة. العدو الوحيد للـ INP هو المهام الطويلة (Long Tasks) في الجافاسكريبت.

ما هي المهمة الطويلة (Long Task)؟
أي كود جافاسكريبت يستغرق أكثر من 50 مللي ثانية (50ms) لتنفيذه يُعتبر مهمة طويلة. خلال هذا الوقت، المتصفح يكون "مشلولاً" ولا يمكنه الاستجابة لضغطة زر المستخدم. يجب كسر هذه المهام الطويلة إلى مهام صغيرة.

كيف تحسن INP برمجياً؟

1
استخدام setTimeout (التنازل للمتصفح)
إذا كان لديك عملية حسابية معقدة، قسمها باستخدام setTimeout(..., 0). هذا يخبر المتصفح: "أوقف الكود هنا، عالج أي نقرات للمستخدم، ثم أكمل الحساب". هذا يُبقي الواجهة مستجيبة.
2
نقل العمل الثقيل لـ Web Workers
الـ Web Worker هو تقنية تسمح بتشغيل الجافاسكريبت في "خيط خلفي" (Background Thread) منفصل تماماً عن الخيط الرئيسي للمتصفح. استخدمه لمعالجة البيانات الضخمة أو الفلاتر المعقدة دون التأثير على استجابة الأزرار.
مستخدمي וורדפרس

حلول الجافاسكريبت لمستخدمي WordPress

إذا لم تكن مبرمجاً وتستخدم منصة ووردبريس، فهناك إضافات سحرية تقوم بمعظم العمل الذي ذكرناه أعلاه بنقرات بسيطة:

WP Rocket
يحتوي على خيارين سحريين: "Load JavaScript deferred" و "Delay JavaScript execution" (يؤخر السكريبتات حتى يتحرك الماوس).
Perfmatters
إضافة خفيفة تتيح لك إيقاف تحميل ملفات جافاسكريبت معينة في صفحات لا تحتاجها (Script Manager). مثالية لحل مشكلة إضافات النماذج (Forms).
FlyingPress
تتعامل بذكاء مع الـ Render-blocking ولديها نظام ممتاز لتحميل السكريبتات الخارجية وقت الحاجة فقط، مما يحسن INP بشكل ملحوظ.

هل الجافاسكريبت تُدمر سرعة موقعك؟

اكتشف الملفات التي تسبب الـ Render-Blocking وتعرّف على وقت تنفيذ الجافاسكريبت (Script Execution Time) من خلال تقرير الأداء المجاني من Seovix.

افحص سرعة موقعك الآن