Özet
Aramıza yeni bir gözlemci katıldı. ReportingObserver
, sitenizin desteği sonlandırılmış bir API'yi kullandığını veya tarayıcı müdahalesiyle karşılaştığını öğrenmenizi sağlayan 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ı arka uç veya analiz sağlayıcıya göndermek için kullanılabilir.
Bu neden yararlı? Desteği sonlandırılan özellikler ve müdahale uyarıları, bugüne kadar yalnızca DevTools'da konsol mesajları olarak kullanılabiliyordu.
Özellikle müdahaleler yalnızca cihaz ve ağ koşulları gibi çeşitli gerçek dünya kısıtlamaları tarafından tetiklenir. Bu nedenle, bir siteyi yerel olarak geliştirirken/test ederken bu mesajları hiç görmeyebilirsiniz. ReportingObserver
bu soruna çözüm sunar. Kullanıcılar gerçek hayatta olası sorunlarla karşılaştığında bu sorunlar hakkında bilgilendirilebiliriz.
Giriş
Bir süre önce, web uygulamasında gerçekleşen "şeyleri" izlemek için çok sayıda API'nin olması ilginç olduğu için bir blog yayını ("Web uygulamanızı gözlemleme") yazdım. Örneğin, DOM hakkında bilgi gözlemleyebilen API'ler vardır: ResizeObserver
,
IntersectionObserver
, MutationObserver
. Performans ölçümlerini yakalamak için API'ler vardır: PerformanceObserver
. window.onerror
ve window.onunhandledrejection
gibi diğer API'ler, bir sorun olduğunda bizi bilgilendirir.
Ancak, 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 tarayıcı müdahalesiyle karşılaştığında DevTools size bu sorunları ilk olarak bildirir:
Doğal olarak window.onerror
'ün bu uyarıları yakaladığını düşünebilirsiniz. Hayır.
Bunun nedeni, window.onerror
'ün doğrudan kullanıcı aracısı tarafından oluşturulan uyarılar için tetiklenmemesidir. Bu olay, kodunuzun yürütülmesinden kaynaklanan çalışma zamanı hataları (JS istisnaları ve söz dizimi hataları) için tetiklenir.
ReportingObserver
, bu açığı kapatır. Tarayıcı tarafından yayınlanan destek sonlandırmalar ve müdahaleler gibi uyarılar hakkında bilgilendirilmenin programatik bir yolunu sunar. Bu aracı bir raporlama aracı olarak kullanabilir ve kullanıcıların canlı sitenizde beklenmedik sorunlarla karşılaşıp karşılaşmadığını merak ederek daha az endişelenebilirsiniz.
API
API, IntersectionObserver
ve ResizeObserver
gibi diğer "gözlemci" API'lere benzemez. Siz geri arama yaparsınız, o da size bilgi verir. Geri aramada, sayfanın neden olduğu sorunların listesi gönderilir:
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();
Filtrelenmiş raporlar
Raporlar, yalnızca belirli rapor türlerini gözlemleyecek şekilde önceden filtrelenebilir:
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 gerçekten kullanışlıdır:
const observer = new ReportingObserver((reports, observer) => {
...
}, {types: ['intervention'], buffered: true});
ReportingObserver
kullanan bir kitaplığı geç yükleme gibi durumlarda idealdir. Gözlemci geç eklenir ancak sayfa yüklenmesinin daha önceki aşamalarında gerçekleşen hiçbir şeyi kaçırmazsınız.
Gözlemlemeyi durdurma
Evet. disconnect
yöntemi vardır:
observer.disconnect(); // Stop the observer from collecting reports.
Örnekler
Örnek: Tarayıcı müdahalelerini bir analiz sağlayıcıya bildirme:
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ılacağı zaman 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 olası sorunları keşfetmek ve izlemek için ek bir yol sunar. Hatta kod tabanınızın sağlığını (veya eksikliğini) anlamak için faydalı bir araçtır. Arka uçta rapor gönderin, kullanıcıların sitenizde karşılaştığı gerçek sorunları öğrenin, kodu güncelleyin ve kâr edinin.
Gelecekte yapılacak çalışmalar
Gelecekte ReportingObserver
'ün JS'de her türlü sorunu yakalamak için varsayılan API olmasını umuyorum. Uygulamanızdaki tüm hataları yakalayan tek bir API'yi düşünün:
- Tarayıcı müdahaleleri
- Kullanımdan kaldırmalar
- Özellik Politikası ihlalleri. crbug.com/867471 adresine bakın.
- JS istisnaları ve hataları (şu anda
window.onerror
tarafından sağlanmaktadır). - İşlenmemiş JS promise retleri (şu anda
window.onunhandledrejection
tarafından sağlanmaktadır)
ReportingObserver
'ü iş akışlarına entegre eden araçlar da heyecan verici. Lighthouse, "Desteği sonlandırılan API'lerden kaçınma" denetimini çalıştırdığınızda tarayıcı desteğinin sonlandırılmasını işaretleyen bir araç örneğidir:
Lighthouse, konsol mesajlarını taramak ve bu sorunları geliştiricilere bildirmek için şu anda DevTools protokolünü kullanır. Bunun yerine, iyi yapılandırılmış desteği sonlandırılma raporları ve anticipatedRemoval
tarihi gibi ek meta verileri için ReportingObserver
'e geçmek ilginizi çekebilir.
Ek kaynaklar: