تحسين بدء تشغيل JavaScript

وعندما ننشئ مواقع إلكترونية تعتمد بشكل أكبر على JavaScript، ندفع أحيانًا مقابل ما نرسله بطرق لا يمكننا أحيانًا الاطّلاع عليها بسهولة. في هذه المقالة، سنشرح سبب أهمية الانضباط إذا كنت تريد تحميل موقعك الإلكتروني وجعله تفاعليًا بسرعة على الأجهزة الجوّالة. يمكن أن يؤدي إرسال قدر أقل من JavaScript إلى تقليل الوقت المستغرَق في نقل البيانات عبر الشبكة، وتقليل الوقت المستغرَق في فك ترميز الرمز البرمجي، وتقليل وقت تحليل JavaScript هذا وتجميعه.

الشبكة

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

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

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

يمكنك تقليل تكلفة نقل JavaScript على الشبكة من خلال:

  • إرسال الرمز الذي يحتاجه المستخدم فقط
  • إزالة البيانات غير الضرورية
  • الضغط
    • استخدِم على الأقل gzip لضغط الموارد المستنِدة إلى النصوص.
    • ننصحك باستخدام Brotli ~q11. يتفوق Brotli على gzip من حيث نسبة الضغط. وقد ساعد ذلك CertSimple في توفير ‎17% من حجم وحدات البايت المضغوطة من JavaScript، وساعد LinkedIn في توفير ‎4% من أوقات التحميل.
  • إزالة الرمز غير المستخدَم
  • تخزين الرمز البرمجي لتقليل عدد عمليات الاتصال بالشبكة
    • استخدِم تخزين طلبات HTTP لضمان تخزين المتصفّحات للطلبات في ذاكرة التخزين المؤقت بفعالية. تحديد المدّة المثلى لصلاحية النصوص البرمجية (max-age) وتوفير الرموز المميّزة للتحقق (ETag) لتجنُّب نقل البايتات التي لم تتغيّر
    • يمكن أن تجعل ميزة التخزين المؤقت لمشغّل الخدمات شبكة تطبيقك مرنة وتمنحك إمكانية الوصول السريع إلى ميزات مثل تخزين رمز V8 البرمجي.
    • استخدِم ميزة التخزين المؤقّت على المدى الطويل لتجنّب إعادة جلب الموارد التي لم يتم تغييرها. في حال استخدام Webpack، اطّلِع على تجزئة اسم الملف.

التحليل/التجميع

بعد تنزيل JavaScript، تكون إحدى أعلى التكاليف هي الوقت الذي يستغرقه محرّك JS لتحليل/تجميع هذا الرمز. في أدوات مطوري البرامج في Chrome، يشكّل التحليل والترجمة جزءًا من وقت "البرمجة النصية" الأصفر في لوحة "الأداء".

ALT_TEXT_HERE

تعرض لك علامتا التبويب "من الأسفل إلى الأعلى" و"شجرة المكالمات" أوقات التحليل/الترجمة البرمجية بالضبط:

ALT_TEXT_HERE
Chrome لوحة الأداء في "أدوات مطوّري البرامج" > من الأسفل إلى الأعلى عند تفعيل ميزة "إحصاءات وقت التشغيل" في الإصدار 8 من V8، يمكننا الاطّلاع على الوقت الذي تمّ إنفاقه في مراحل مثل "التحليل" و"الترجمة".

ما أهمية ذلك؟

ALT_TEXT_HERE

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

تستغرق معالجة JavaScript في المتصفّح وقتًا أطول مقارنةً بالصورة أو خط الويب بالحجم المكافئ.

مقارنةً بـ JavaScript، هناك تكاليف عديدة متعلّقة بمعالجة الصور ذات الحجم المماثل (لا يزال يتعين فك ترميزها)، ولكن في الأجهزة المتوافقة مع الوسائط المتحرّكة المتوسطة، من المرجّح أن تؤثّر JavaScript سلبًا في تفاعل الصفحة.

ALT_TEXT_HERE
تختلف تكاليف البايتات المخصّصة لبرامج JavaScript والصور كثيرًا. لا تحظر الصور عادةً السلسلة الأساسية أو تمنع الواجهات من أن تصبح تفاعلية أثناء فك ترميزها وتحويلها إلى شبكة بكسل. ومع ذلك، يمكن أن تؤخّر JavaScript التفاعل بسبب تكاليف التحليل والتجميع والتنفيذ.

عندما نتحدث عن بطء عملية التحليل والترجمة، يكون السياق مهمًا، لأنّنا نتحدث عن هواتف جوّالة متوسطة الأداء. يمكن أن يكون لدى المستخدمين العاديين هواتف مزوّدة بوحدات معالجة مركزية ووحدات معالجة رسومات بطيئة، ولا تتضمّن ذاكرة التخزين المؤقت L2/L3، وقد تكون ذاكرتها محدودة.

لا تتطابق إمكانات الشبكة وإمكانات الجهاز دائمًا. إذا كان مستخدم لديه اتصال رائع بالإنترنت عبر الألياف البصرية، لا يعني ذلك بالضرورة أنّه يمتلك أفضل وحدة معالجة مركزية لتحليل JavaScript المُرسَل إلى جهازه وتقييمه. وينطبق ذلك أيضًا على العكس، أي اتصال ضعيف بالشبكة ولكن وحدة معالجة مركزية سريعة جدًا. — "كريستوفير باكستر"، LinkedIn

في ما يلي تكلفة تحليل 1 ميغابايت تقريبًا من محتوى JavaScript غير المضغوط (البسيط) على أجهزة منخفضة وعالية المستوى. يختلف وقت تحليل/تجميع الرمز البرمجي بين أسرع الهواتف في السوق والهواتف العادية بمقدار من ضعف إلى 5 أضعاف.

ALT_TEXT_HERE
يُبرز هذا الرسم البياني أوقات تحليل حِزمة JavaScript بحجم 1 ميغابايت (حوالي 250 كيلوبايت مضغوط بتنسيق gzip) على أجهزة الكمبيوتر المكتبي والأجهزة الجوّالة من فئات مختلفة. عند النظر في تكلفة التحليل، يجب مراعاة الأرقام التي تم فك ضغطها، مثل رمز JavaScript الذي تم ضغطه بتنسيق gzip بحجم 250 كيلوبايت تقريبًا والذي يتم فك ضغطه ليصبح رمزًا بحجم 1 ميغابايت تقريبًا.

ماذا عن موقع إلكتروني في العالم الحقيقي، مثل CNN.com؟

على هاتف iPhone 8 المتطوّر، يستغرق تحليل/تجميع JavaScript في CNN ‏(CNN’s JS) 4 ثوانٍ تقريبًا مقارنةً بـ 13 ثانية تقريبًا على هاتف متوسط (Moto G4). ويمكن أن يؤثّر ذلك بشكل كبير في مدى سرعة تفاعل المستخدم مع هذا الموقع الإلكتروني بالكامل.

ALT_TEXT_HERE
في ما يلي أوقات التحليل التي تقارن أداء شريحة A11 Bionic من Apple بأداء Snapdragon 617 في أجهزة Android ذات الأداء المتوسط.

يُبرز ذلك أهمية إجراء الاختبار على الأجهزة المتوسطة (مثل Moto G4) بدلاً من الهاتف الذي قد يكون في جيبك فقط. السياق مهم، ومع ذلك: يجب إجراء التحسين وفقًا لظروف الجهاز والشبكة لدى المستخدمين.

ALT_TEXT_HERE
يمكن أن تقدّم "إحصاءات Google" إحصاءات عن فئات الأجهزة الجوّالة التي يستخدمها المستخدمون الفعليون للوصول إلى موقعك الإلكتروني. ويمكن أن يقدّم ذلك فرصًا لفهم القيود الفعلية لوحدة المعالجة المركزية/وحدة معالجة الرسومات التي يعملون بواسطتها.

هل نرسل الكثير من JavaScript؟ ربما :)

باستخدام أداة HTTP Archive (أهم 500 ألف موقع إلكتروني تقريبًا) لتحليل حالة JavaScript على الأجهزة الجوّالة، يمكننا الاطّلاع على أنّ% 50 من المواقع الإلكترونية تستغرق أكثر من 14 ثانية لتصبح تفاعلية. تستغرق هذه المواقع الإلكترونية ما يصل إلى 4 ثوانٍ في تحليل JavaScript وتجميعه فقط.

ALT_TEXT_HERE

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

يمكن أن تؤدي إزالة JavaScript غير الملحّة من صفحاتك إلى تقليل مدّة البث ووقت التحليل والترجمة المكثّفَين لوحدة المعالجة المركزية والمساحة المتوفّرة المحتملة للذاكرة. ويساعد ذلك أيضًا في جعل صفحاتك تفاعلية بشكل أسرع.

وقت التنفيذ

لا يقتصر الأمر على التحليل والترجمة التي يمكن أن تؤدي إلى تكاليف. إنّ تنفيذ JavaScript (تشغيل الرمز بعد تحليله أو تجميعه) هو إحدى العمليات التي يجب أن تتم في سلسلة التعليمات الرئيسية. يمكن أن تؤدّي أوقات التنفيذ الطويلة أيضًا إلى تأخير تفاعل المستخدِم مع موقعك الإلكتروني.

ALT_TEXT_HERE

إذا استغرق تنفيذ النص البرمجي أكثر من 50 ملي ثانية، يتأخّر وقت التفاعل بمقدار المدّة الكاملة التي يستغرقها تنزيل JavaScript وتجميعه وتنفيذه. أليكس راسل

لحلّ هذه المشكلة، تستفيد JavaScript من تقسيمها إلى أجزاء صغيرة لتجنُّب توقُّف سلسلة التعليمات الرئيسية. استكشِف ما إذا كان بإمكانك تقليل مقدار العمل الذي يتم تنفيذه أثناء التنفيذ.

التكاليف الأخرى

يمكن أن يؤثّر JavaScript في أداء الصفحة بطرق أخرى:

  • الذاكرة قد تبدو الصفحات متقطّعة أو متوقّفة مؤقتًا بشكل متكرّر بسبب عملية جمع القمامة. عندما يستردّ المتصفّح الذاكرة، يتم إيقاف تنفيذ JavaScript مؤقتًا كي يتمكّن المتصفّح الذي يجمع الملفات غير الصالحة بشكل متكرّر من إيقاف التنفيذ مؤقتًا بمعدّل أكبر مما قد نفضّله. تجنَّب تسرُّب الذاكرة وعمليات التوقف المتكرّرة لجمع البيانات للحفاظ على سرعة الصفحات.
  • أثناء وقت التشغيل، يمكن أن تحظر تعليمات JavaScript التي تستغرق وقتًا طويلاً سلسلة المحادثات الرئيسية، ما يؤدي إلى عدم استجابة الصفحات. يمكن أن يؤدي تقسيم العمل إلى أجزاء أصغر (باستخدام requestAnimationFrame() أو requestIdleCallback() للجدولة) إلى الحدّ من مشاكل الاستجابة، ما قد يساعد في تحسين مدى استجابة الصفحة لتفاعلات المستخدم (INP).

أنماط لتقليل تكلفة عرض JavaScript

عند محاولة إبقاء أوقات التحليل/الترجمة ونقل JavaScript عبر الشبكة بطيئة، هناك أنماط يمكن أن تساعدك، مثل التجميع المستنِد إلى المسار أو PRPL.

PRPL

‫PRPL (Push, Render, Pre-cache, Lazy-load) هو نمط يُحسِّن التفاعل من خلال تقسيم الرموز البرمجية ووضعها في ذاكرة التخزين المؤقت بشكل مكثّف:

ALT_TEXT_HERE

لنتصور تأثير ذلك.

نحن نحلّل وقت تحميل المواقع الإلكترونية الشائعة المتوافقة مع الأجهزة الجوّالة وتطبيقات الويب التقدّمية باستخدام ميزة "إحصاءات طلبات التشغيل" في V8. كما نرى، يشكّل وقت التحليل (المعروض باللون البرتقالي) جزءًا كبيرًا من الوقت الذي تقضيه العديد من هذه المواقع الإلكترونية:

ALT_TEXT_HERE

يحافظ موقع Wego الإلكتروني، الذي يستخدم PRPL، على وقت تحليل برمجي منخفض لمساراته، ما يجعله تفاعليًا بسرعة كبيرة. اتّبعت العديد من المواقع الإلكترونية الأخرى ميزة "تقسيم الرموز" وميزانيات الأداء لمحاولة خفض تكاليف استخدام JavaScript.

التشغيل التمهيدي التدريجي

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

يُرجى توخّي الحذر، لأنّ هذا الإجراء قد يترتّب عليه تكاليف. 1) يتم إرسال استجابة HTML أكبر بشكل عام، ما قد يؤدي إلى زيادة التفاعل، 2) يمكن أن يترك المستخدم في حالة غريبة لا يمكن فيها أن يكون نصف التجربة تفاعليًا إلى أن تنتهي معالجة JavaScript.

قد يكون Bootstrapping التدريجي نهجًا أفضل. أرسِل صفحة تتحكّم في الحد الأدنى من الوظائف (تتألف من تنسيقات HTML/JS/CSS المطلوبة فقط للمسار الحالي). وعند توفّر المزيد من الموارد، يمكن للتطبيق تحميلها بشكل بطيء وفتح المزيد من الميزات.

ALT_TEXT_HERE
Progressive Bootstrapping بقلم "بول لويس"

إنّ تحميل الرمز البرمجي بما يتناسب مع المحتوى المعروض هو الهدف الأسمى. إنّ PRPL و التحميل التدريجي هما من الأنماط التي يمكن أن تساعد في تحقيق ذلك.

الاستنتاجات

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

حقّقت الفِرق نجاحًا في اعتماد ميزانيات أداء صارمة للحفاظ على انخفاض مدّة نقل JavaScript وتحليلها/تجميعها. اطّلِع على مقالة "Can You Afford It?: "ميزانيات الأداء الفعلي للويب" للحصول على إرشادات حول الميزانيات للأجهزة الجوّالة

ALT_TEXT_HERE
من المفيد معرفة مقدار "المساحة المتوفّرة" في JavaScript التي يمكن أن تتركها لنا القرارات المعمارية التي نتّخذها لتوفير منطق التطبيق.

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

مزيد من المعلومات