ReportingObserver: Codezustand ermitteln

Philip Walton
Philip Walton

Kurzfassung

Es gibt einen neuen Beobachter in der Stadt! ReportingObserver ist eine neue API, über die du informiert wirst, wenn auf deiner Website eine eingestellte API verwendet wird oder eine Browserintervention ausgelöst wird:

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

observer.observe();

Mit dem Callback können Berichte zur weiteren Analyse an ein Back-End oder einen Analyseanbieter gesendet werden.

Warum ist das nützlich? Bisher waren Einstellungs- und Eingriffswarnungen in den Entwicklertools nur als Konsolennachrichten verfügbar. Insbesondere werden Eingriffe nur durch verschiedene reale Einschränkungen wie Geräte- und Netzwerkbedingungen ausgelöst. Daher werden diese Meldungen möglicherweise nie angezeigt, wenn Sie eine Website lokal entwickeln oder testen. ReportingObserver bietet die Lösung für dieses Problem. Wenn Nutzer potenzielle Probleme entdecken, können wir darüber benachrichtigt werden.

Einführung

Vor einiger Zeit habe ich einen Blogpost ("Web-App beobachten") geschrieben, weil es mich faszinierend fand, wie viele APIs es für das Monitoring der Vorgänge in einer Webanwendung gibt. Beispielsweise gibt es APIs, die Informationen über das DOM erfassen können: ResizeObserver, IntersectionObserver, MutationObserver. Es gibt APIs zum Erfassen von Leistungsmessungen: PerformanceObserver. Andere APIs wie window.onerror und window.onunhandledrejection informieren uns sogar, wenn etwas schiefgeht.

Es gibt jedoch andere Arten von Warnungen, die von diesen vorhandenen APIs nicht erfasst werden. Wenn Ihre Website eine eingestellte API verwendet oder ein Browserintervention ausgeführt wird, werden Sie von den Entwicklertools zuerst darüber informiert:

Warnungen in der Entwicklertools-Konsole vor Einstellung und Eingriffen.
Vom Browser ausgelöste Warnungen in der Entwicklertools-Konsole.

Man könnte davon ausgehen, dass window.onerror diese Warnungen erfasst. Das ist nicht der Fall. Das liegt daran, dass window.onerror nicht bei Warnungen ausgelöst wird, die direkt vom User-Agent selbst generiert wurden. Sie wird bei Laufzeitfehlern (JS-Ausnahmen und Syntaxfehlern) ausgelöst, die durch die Ausführung Ihres Codes verursacht werden.

ReportingObserver nimmt das Spiel auf. Sie bietet eine programmatische Möglichkeit, um über vom Browser ausgegebene Warnungen wie Einstellung und Eingriffe benachrichtigt zu werden. Sie können es als Berichtstool verwenden und haben weniger Schlaf, weil Sie sich fragen müssen, ob Nutzer auf Ihrer Live-Website unerwartete Probleme haben.

Mit der API

Die API unterscheidet sich nicht von den anderen Beobachter-APIs wie IntersectionObserver und ResizeObserver. Sie rufen sie zurück, um Informationen zu erhalten. Die Informationen, die an den Callback gesendet werden, sind eine Liste von Problemen, die durch die Seite verursacht wurden:

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();

Gefilterte Berichte

Sie können Berichte so filtern, dass nur bestimmte Berichtstypen berücksichtigt werden:

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

Zwischengespeicherte Berichte

Die Option buffered: true ist sehr nützlich, wenn Sie die Berichte sehen möchten, die vor der Erstellung des Beobachters generiert wurden:

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

Diese Methode eignet sich hervorragend für Lazy Loading einer Bibliothek, die ReportingObserver verwendet. Der Beobachter wird erst später hinzugefügt, aber es verpasst nichts, was früher beim Seitenaufbau passiert ist.

Nicht mehr beobachten

Ja. Es gibt eine disconnect-Methode:

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

Beispiele

Beispiel – Browserinterventionen an einen Analyseanbieter melden:

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

observer.observe();

Beispiel: Lassen Sie sich benachrichtigen, wenn APIs entfernt werden:

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();

Fazit

ReportingObserver bietet Ihnen eine zusätzliche Möglichkeit zum Erkennen und Überwachen potenzieller Probleme in Ihrer Webanwendung. Es ist sogar ein nützliches Tool, um den Zustand Ihrer Codebasis (oder das Fehlen dieser) zu verstehen. Senden Sie Berichte an ein Back-End, informieren Sie sich über reale Probleme, mit denen Nutzer auf Ihrer Website stoßen, aktualisieren Sie den Code und erzielen Sie Gewinn!

Zukünftige Arbeiten

Ich hoffe, dass ReportingObserver in Zukunft die De-facto-API zum Erkennen aller Arten von Problemen in JS wird. Stellen Sie sich eine API vor, um alle Fehler in Ihrer Anwendung abzufangen:

  • Browserprogramme
  • Einstellung von Produkten und Funktionen
  • Verstöße gegen die Funktionsrichtlinie. Weitere Informationen finden Sie unter crbug.com/867471.
  • JS-Ausnahmen und -Fehler (derzeit von window.onerror bereitgestellt).
  • Nicht verarbeitete JS-Promise-Ablehnungen (derzeit bereitgestellt von window.onunhandledrejection)

Außerdem freue ich mich über Tools, die ReportingObserver in ihre Workflows integrieren. Lighthouse ist ein Beispiel für ein Tool, das bei der Ausführung der Prüfung Vermeidet verworfene APIs bereits eingestellte Browserfunktionen meldet:

Für die Lighthouse-Prüfung zur Verwendung veralteter APIs könnte ReportingObserver verwendet werden.
Die Lighthouse-Prüfung zur Verwendung eingestellter APIs könnte ReportingObserver verwenden.

In Lighthouse wird derzeit das DevTools-Protokoll verwendet, um Konsolennachrichten zu extrahieren und diese Probleme an die Entwickler zu melden. Stattdessen kann es interessant sein, zu ReportingObserver zu wechseln, um die gut strukturierten Einstellungsberichte und zusätzliche Metadaten wie das anticipatedRemoval-Datum zu erhalten.

Weitere Informationen: