تحسين مهلة الإدخال

ويمكنك التعرُّف على معنى تأخير الإدخال، والتعرّف على الأساليب لتقليله للحصول على تفاعل أسرع.

جيريمي واغنر
جيريمي واغنر

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

ما معنى تأخير الإدخال؟

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

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

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

كيفية التفكير في تأخير الإدخال

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

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

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

كيفية تقليل تأخير الإدخال

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

تجنُّب الموقتات المتكرّرة التي تبدأ عملاً مفرطًا في سلسلة التعليمات الرئيسية

هناك دالتان للموقّتات شائعة الاستخدام في JavaScript يمكن أن تساهم في تأخير الإدخال: setTimeout وsetInterval. والفرق بين الاثنين هو أن setTimeout يجدول معاودة الاتصال لتنفيذها بعد وقت محدّد. من ناحية أخرى، يحدِّد تطبيق setInterval موعدًا لمعاودة الاتصال كل n مللي ثانية إلى أن يتم إيقاف الموقّت باستخدام clearInterval.

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

بالإضافة إلى ذلك، يمكن تشغيل setTimeout في تكرار حلقي أو متكرر، حيث تعمل الدالة setInterval تقريبًا، على الرغم من أنّه يُفضَّل عدم جدولة التكرار التالي حتى يكتمل التكرار السابق. ويعني ذلك أنّ التكرار الحلقي سيرجع إلى سلسلة التعليمات الرئيسية في كل مرة يتم فيها استدعاء setTimeout، ولكن عليك توخي الحذر لضمان أنّ معاودة الاتصال لن تؤدي في النهاية إلى القيام بعمل زائد.

يجري setInterval معاودة الاتصال خلال فترة زمنية، وبالتالي من المرجح أن يقف عائقًا أمام التفاعلات. ويرجع ذلك إلى أنّ طبيعة "setInterval" المتكرّرة تزيد من احتمالية أن تعرقل التفاعل، على عكس الحدث الفردي الذي يتم تسجيله من خلال طلب استرداد بيانات setTimeout والذي يُعد معاودة اتصال لمرة واحدة قد تُعيق التفاعل مع المستخدم، ما يؤدي إلى زيادة تأخير الإدخال.

لقطة شاشة لمحلّل الأداء في "أدوات مطوري البرامج في Chrome" توضّح تأخير الإدخال. تحدث المهمة التي يتم تنشيطها بواسطة وظيفة المؤقت قبل أن يبدأ المستخدم مباشرة تفاعل النقر. ومع ذلك، يعمل الموقت على تمديد تأخير الإدخال، مما يتسبب في تشغيل استدعاءات حدث التفاعل في وقت لاحق مما قد يحدث إذا لم تكن كذلك.
موقّت تم تسجيله من خلال مكالمة setInterval سابقة ساهمت في تأخير عملية الإدخال كما هو موضّح في لوحة الأداء في "أدوات مطوري البرامج في Chrome". يؤدي تأخير الإدخال المُضاف إلى تشغيل استدعاءات الحدث للتفاعل في وقت لاحق مما يمكن أن يحدث.

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

تجنُّب المهام الطويلة

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

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

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

انتبه إلى تداخل التفاعل

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

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

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

  • يمكنك إلغاء مرتدات الإدخالات للحدّ من عدد مرات تنفيذ استدعاء حدث خلال فترة زمنية معيّنة.
  • يمكنك استخدام AbortController لإلغاء طلبات fetch الصادرة حتى لا تصبح سلسلة المحادثات الرئيسية مزدحمة عند التعامل مع عمليات معاودة الاتصال fetch. ملاحظة: يمكن أيضًا استخدام السمة signal لمثيل AbortController من أجل إلغاء الأحداث.

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

الخاتمة

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

صورة رئيسية من Unsplash، من إعداد إريك ماكلين