ReportingMonitorer: تعرّف على حالة الرمز البرمجي

TL;DR

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

const observer = new ReportingObserver(
  (reports, observer) => {
    for (const report of reports) {
      console.log(report.type, report.url, report.body);
    }
  },
  {buffered: true}
);

observer.observe();

يمكن استخدام دالة الاستدعاء لإرسال التقارير إلى الخلفية أو مقدّم خدمة الإحصاءات للقيام بمزيد من التحليل.

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

مراجعة بشأن هذا الإجراء.

مقدمة

منذ فترة، كتبتُ مشاركة مدونة ("مراقبة تطبيقك على الويب") لأنّني وجدتُ أنّه من المدهش عدد واجهات برمجة التطبيقات المتاحة لمراقبة "الإجراءات" التي تحدث في تطبيق الويب. على سبيل المثال، هناك واجهات برمجة تطبيقات يمكنها مراقبة معلومات عن نموذج DOM: ResizeObserver، IntersectionObserver، MutationObserver. تتوفّر واجهات برمجة تطبيقات لتسجيل قياسات الأداء: PerformanceObserver. وتتيح لنا منصّات برمجة التطبيقات الأخرى، مثل window.onerror وwindow.onunhandledrejection، إعلامها عند حدوث خطأ.

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

تحذيرات وحدة تحكّم أدوات مطوّري البرامج بشأن الإيقاف النهائي للميزات والتدخلات
رسائل التحذير التي يبدأها المتصفّح في وحدة تحكّم "أدوات مطوّري البرامج"

قد يعتقد المرء بشكل طبيعي أنّ window.onerror يسجّل هذه التحذيرات. لا، لا يفعل ذلك. ويرجع ذلك إلى أنّ window.onerror لا يتم تشغيله عند ظهور التحذيرات التي ينشئها وكيل المستخدم مباشرةً. يتم تنشيطه بسبب أخطاء وقت التشغيل (استثناءات JavaScript وأخطاء البنية) الناتجة عن تنفيذ التعليمة البرمجية.

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

واجهة برمجة التطبيقات

لا تختلف واجهة برمجة التطبيقات عن واجهات برمجة التطبيقات الأخرى "المراقِبة"، مثل IntersectionObserver وResizeObserver. يمكنك معاودة الاتصال به، ويقدّم لك معلومات. المعلومات التي تتلقّاها المكالمة المُعاد الاتصال بها هي قائمة بالمشاكل التي تسبّبت فيها الصفحة:

const observer = new ReportingObserver((reports, observer) => {
  for (const report of reports) {
    // → report.type === 'deprecation'
    // → report.url === 'https://reporting-observer-api-demo.glitch.me'
    // → report.body.id === 'XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload'
    // → report.body.message === 'Synchronous XMLHttpRequest is deprecated...'
    // → report.body.lineNumber === 11
    // → report.body.columnNumber === 22
    // → report.body.sourceFile === 'https://reporting-observer-api-demo.glitch.me'
    // → report.body.anticipatedRemoval === <JS_DATE_STR> or null
  }
});

observer.observe();

التقارير التي تمت فلترتها

يمكن فلترة التقارير مسبقًا لمراقبة أنواع تقارير معيّنة فقط:

const observer = new ReportingObserver((reports, observer) => {
  ...
}, {types: ['deprecation']});

التقارير المخزَّنة مؤقتًا

يكون الخيار buffered: true مفيدًا جدًا عندما تريد الاطّلاع على التقارير التي تم إنشاؤها قبل إنشاء المراقب:

const observer = new ReportingObserver((reports, observer) => {
  ...
}, {types: ['intervention'], buffered: true});

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

إيقاف الملاحظة

إجابة صحيحة. تحتوي على طريقة disconnect:

observer.disconnect(); // Stop the observer from collecting reports.

أمثلة

مثال: الإبلاغ عن عمليات التدخل في المتصفّح لموفّر خدمة تحليلات:

const observer = new ReportingObserver(
  (reports, observer) => {
    for (const report of reports) {
      sendReportToAnalytics(JSON.stringify(report.body));
    }
  },
  {types: ['intervention'], buffered: true}
);

observer.observe();

مثال: تلقّي إشعار عند إزالة واجهات برمجة التطبيقات:

const observer = new ReportingObserver((reports, observer) => {
  for (const report of reports) {
    if (report.type === 'deprecation') {
      sendToBackend(`Using a deprecated API in ${report.body.sourceFile} which will be
                     removed on ${report.body.anticipatedRemoval}. Info: ${report.body.message}`);
    }
  }
});

observer.observe();

الخاتمة

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

الإجراءات المستقبلية

في المستقبل، آمل أن يصبح ReportingObserver واجهة برمجة التطبيقات الافتراضية لرصد جميع أنواع المشاكل في JavaScript. تخيل واجهة برمجة تطبيقات واحدة لرصد كل الصعوبات التي تواجهها في تطبيقك:

  • التدخلات في المتصفّح
  • عمليات الإيقاف نهائيًا
  • انتهاكات سياسة الميزات يُرجى الاطّلاع على crbug.com/867471.
  • استثناءات JS وأخطاءها (يعالجها حاليًا window.onerror)
  • عمليات رفض وعد JavaScript غير المُعالجة (يتم التعامل معها حاليًا من خلال window.onunhandledrejection)

يسرّني أيضًا الأدوات التي تدمج ReportingObserver في سير العمل. يُعد Lighthouse مثالًا على أداة تُبلغ حاليًا عن عمليات الإيقاف النهائي للمتصفّح عند تشغيل عملية التدقيق "تجنُّب واجهات برمجة التطبيقات المتوقّفة نهائيًا":

يمكن أن يؤدي تدقيق Lighthouse إلى استخدام واجهات برمجة التطبيقات المتوقّفة نهائيًا.
يمكن أن تستخدم تدقيقات Lighthouse لاستخدام واجهات برمجة التطبيقات المتوقّفة نهائيًا ReportingObserver.

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

مراجع إضافية: