٧ اختناقات خفية في JavaScript وكيفية إصلاحها
نادراً ما تفشل تطبيقات الويب البطيئة بسبب خوارزميات سيئة. بل تفشل بسبب الطريقة التي يتواصل بها الكود الخاص بك مع المتصفح.
لقد قمت بتحليل أداء ٣٠٠ تطبيق في بيئة الإنتاج. ٧٣٪ من مشكلات الأداء تنبع من هذه المصادر السبعة.
١. Layout thrashing يحدث هذا عندما تقرأ خاصية ما، ثم تكتب في الـ DOM، ثم تقرأ مرة أخرى. هذا يجبر المتصفح على إعادة حساب التخطيط (layout) بشكل متكرر.
- الحل: قم بتجميع كل عمليات القراءة أولاً. ثم قم بتجميع كل عمليات الكتابة باستخدام
requestAnimationFrame.
٢. Unbounded event listeners إضافة مستمع حدث (event listener) دون إزالته يؤدي إلى تسريبات في الذاكرة (memory leaks). هذه مشكلة رئيسية في تطبيقات الصفحة الواحدة (single-page apps).
- الحل: استخدم
AbortControllerلتنظيف المستمعين عند إلغاء تحميل المكونات (unmount).
٣. Synchronous DOM reads in loops
قراءة offsetWidth أو getBoundingClientRect داخل حلقة تكرارية (loop) تؤدي إلى حدوث reflows مستمرة.
- الحل: قم بتخزين قيم التخطيط في متغير قبل بدء الحلقة التكرارية.
٤. Missing requestAnimationFrame batching التغييرات المباشرة على الـ DOM عند أحداث التمرير (scroll) أو تغيير الحجم (resize) تحدث بشكل متكرر جداً، مما يسبب تقطعاً في الحركة (jank).
- الحل: استخدم متغير ticking و
requestAnimationFrameلمزامنة التحديثات مع دورة الـ paint.
٥. Large JSON.parse payloads تحليل الملفات الكبيرة يعطل الخيط الرئيسي (main thread)، مما يسبب تأخراً في الاستجابة (input lag).
- الحل: استخدم
Web Workersلتحليل البيانات بعيداً عن الخيط الرئيسي.
٦. Complex CSS selector matching المحددات (selectors) المتداخلة بعمق أو المعقدة تبطئ عمليات إعادة حساب الأنماط (style recalculations).
- الحل: استخدم
Lighthouseللعثور على إزاحات التخطيط (layout shifts) وتبسيط المحددات الخاصة بك.
٧. Duplicate bundle chunks الحزم (bundles) الكبيرة وغير المحسنة تهدر وقت النقل.
- الحل: استخدم
webpack-bundle-analyzerللعثور على الكود المكرر وإزالته.
كيف تقيس تقدمك:
- افتح
Chrome DevTools. - انتقل إلى علامة التبويب
Performance. - قم بتسجيل جلسة لمدة ٥ ثوانٍ.
- ابحث عن المهام التي تزيد مدتها عن ٥٠ مللي ثانية في مخطط
Main flame chart. - طبق حلاً واحداً وقارن بين أوقات الـ
RenderingوالـPainting.
إصلاح هذه المجالات يحسن من مقاييس Core Web Vitals الخاصة بك، وتحديداً Largest Contentful Paint و Interaction to Next Paint.