ReportingObserver: Kodunuzun durumunu öğrenme

Philip Walton
Philip Walton

Özet

Şehirde yeni bir gözlemci var. ReportingObserver, sitenizin kullanımdan kaldırılmış bir API'yi kullandığını veya bir tarayıcı müdahalesiyle karşılaştığını size bildiren yeni bir API'dir:

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

observer.observe();

Geri çağırma, daha ayrıntılı analiz için raporları bir arka uca veya analiz sağlayıcısına göndermek amacıyla kullanılabilir.

Neden faydalı oldu? Şimdiye kadar, kullanımdan kaldırma ve müdahale uyarıları yalnızca Geliştirici Araçları'nda konsol mesajları olarak sunuluyordu. Özellikle müdahaleler, yalnızca cihaz ve ağ koşulları gibi gerçek dünyadan çeşitli kısıtlamalar tarafından tetiklenir. Bu nedenle, bir siteyi yerel olarak geliştirirken/test ederken bu mesajları hiçbir zaman görmeyebilirsiniz. ReportingObserver bu sorunun çözümünü sunar. Kullanıcılar vahşi yaşamda potansiyel sorunlarla karşılaştığında onlar hakkında bilgilendirilebiliriz.

Giriş

Bir süre önce, bir blog yayını yazdım ("Web uygulamanızı gözlemleme"), çünkü web uygulamasında olan "öğeleri" izlemek için ne kadar API bulunduğunu çok ilginç buldum. Örneğin, DOM ile ilgili bilgileri gözlemleyebilen API'ler vardır: ResizeObserver, IntersectionObserver, MutationObserver. Performans ölçümlerini yakalamak için kullanılan API'ler vardır: PerformanceObserver. Hatta window.onerror ve window.onunhandledrejection gibi diğer API'ler bir şeyler ters gittiğinde bize haber verir.

Ancak bu mevcut API'ler tarafından yakalanmayan başka uyarı türleri de vardır. Siteniz kullanımdan kaldırılmış bir API kullandığında veya bir tarayıcı müdahalesiyle karşılaştığında, bu durumlarla ilgili olarak ilk olarak Geliştirici Araçları size bilgi verir:

Desteği sonlandırmalar ve müdahaleler için Geliştirici Araçları konsolu uyarıları.
Geliştirici Araçları konsolunda tarayıcı tarafından başlatılan uyarılar.

Doğal olarak window.onerror ürününün bu uyarıları yakaladığı düşünülebilir. Hayır! Bunun nedeni, window.onerror ürününün doğrudan kullanıcı aracısı tarafından oluşturulan uyarılar için etkinleşmemesidir. Kodunuzun yürütülmesinden kaynaklanan çalışma zamanı hataları (JS istisnaları ve söz dizimi hataları) için tetiklenir.

ReportingObserver slack'i deniyor. Kullanımdan kaldırma ve müdahaleler gibi tarayıcılar tarafından verilen uyarılar hakkında bildirim almak için programatik bir yol sağlar. Bu aracı bir bildirim aracı olarak kullanabilir ve kullanıcıların yayındaki sitenizde beklenmedik sorunlarla karşılaşıp karşılaşmadığını düşünerek uykunuzu yitirebilirsiniz.

API

API, IntersectionObserver ve ResizeObserver gibi diğer "gözlemci" API'lerden farklı değildir. Telefonu geri arar ve size bilgi verir. Geri çağırmanın aldığı bilgi, sayfanın neden olduğu sorunların bir listesidir:

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

Filtrelenen raporlar

Raporlara yalnızca belirli rapor türlerini gözlemlemek için önceden filtre uygulanabilir:

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

Arabelleğe alınmış raporlar

buffered: true seçeneği, gözlemci oluşturulmadan önce oluşturulan raporları görmek istediğinizde oldukça kullanışlıdır:

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

ReportingObserver kullanan bir kitaplığı geç yükleme gibi durumlar için idealdir. Gözlemci geç eklenir, ancak sayfanın daha önceki bölümlerinde gerçekleşen hiçbir şeyi kaçırmazsınız.

Gözlemlemeyi durdur

Evet. disconnect yöntemi var:

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

Örnekler

Örnek: Tarayıcı müdahalelerini bir analiz sağlayıcısına bildirin:

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

observer.observe();

Örnek - API'ler kaldırıldığında bildirim alın:

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

Sonuç

ReportingObserver, web uygulamanızdaki potansiyel sorunları keşfedip izlemeniz için ek bir yöntem sunar. Hatta kod tabanınızın durumunu (veya eksikliğini) anlamak için de faydalı bir araçtır. Raporları bir arka uca gönderin, kullanıcıların sitenizde karşılaştığı gerçek sorunları öğrenin, kodu güncelleyin ve kâr edin.

Gelecekteki çalışmalar

Gelecekte ReportingObserver, JS'deki her türlü sorunu yakalamak için kullanılan yerleşik API haline gelir. Uygulamanızda ters giden her şeyi yakalayacak bir API düşünün:

  • Tarayıcı müdahaleleri
  • Kullanımdan kaldırmalar
  • Özellik Politikası ihlalleri. crbug.com/867471 adresini ziyaret edin.
  • JS istisnaları ve hataları (şu anda window.onerror tarafından hizmet veriliyor).
  • İşlenmemiş JS vaat retleri (şu anda window.onunhandledrejection tarafından hizmet veriliyor)

Ayrıca ReportingObserver iş akışlarına entegre eden araçlar beni heyecanlandırıyor. Lighthouse, "Kullanımdan kaldırılan API'leri önler" denetimini çalıştırdığınızda tarayıcının kullanımdan kaldırılmasını zaten işaretleyen bir araç örneğidir:

Kullanımdan kaldırılan API&#39;lerin kullanımıyla ilgili Lighthouse denetimi, ReportingObserver&#39;ı kullanabilir.
Desteği sonlandırılmış API'lerin kullanımıyla ilgili Lighthouse denetimi ReportingObserver'ı kullanabilir.

Lighthouse, şu anda konsol mesajlarını kazımak ve bu sorunları geliştiricilere bildirmek için DevTools protokolünü kullanmaktadır. Bunun yerine, iyi yapılandırılmış kullanımdan kaldırma raporları ve anticipatedRemoval tarihi gibi ek meta veriler için ReportingObserver ürününe geçmek ilginç olabilir.

Ek kaynaklar: