Trova le API deprecate nelle tue app di produzione.
ReportingObserver
ti consente di sapere quando il tuo sito utilizza un'API deprecata o esegue un intervento nel browser. La funzionalità di base era disponibile
in origine in Chrome 69. A partire da Chrome 84, può essere utilizzato nei worker.
const observer = new ReportingObserver((reports, observer) => {
for (const report of reports) {
console.log(report.type, report.url, report.body);
}
}, {buffered: true});
observer.observe();
Utilizza il callback per inviare report per l'analisi a un provider di backend o di analisi.
Perché è utile? Fino a quando questa API, gli avvisi di ritiro e intervento erano disponibili solo in DevTools come messaggi della console. Gli interventi, in particolare, sono attivati solo da vari vincoli del mondo reale, come le condizioni del dispositivo e della rete. Di conseguenza, potresti non vedere mai questi messaggi durante lo sviluppo/il test di un sito a livello locale. ReportingObserver
fornisce una soluzione a questo problema. Quando gli utenti riscontrano potenziali problemi in natura, gli sviluppatori web possono ricevere notifiche al riguardo.
Contesto
Qualche tempo fa ho scritto un post del blog (Observing your web app) perché ho trovato affascinante quante API ci siano per monitorare le "contenuti" che si verificano in un'app web. Ad esempio, esistono API in grado di osservare le informazioni sul DOM:
ResizeObserver
,
IntersectionObserver
,
MutationObserver
.
PerformanceObserver
acquisisce le misurazioni del rendimento. Metodi come
window.onerror
e
window.onunhandledrejection
ci fanno perfino sapere se qualcosa va storto.
Tuttavia, esistono altri tipi di avvisi che non vengono acquisiti dalle API esistenti. Quando il tuo sito utilizza un'API deprecata o viene eseguito con un intervento nel browser, DevTools è la prima cosa che te ne indica:
Si potrebbe pensare che window.onerror
catturi questi avvisi. Non lo fa.
Questo perché window.onerror
non si attiva per gli avvisi generati direttamente dallo user agent stesso. Si attiva per errori di runtime (eccezioni JavaScript ed errori di sintassi) causati dall'esecuzione del codice.
ReportingObserver
si libera. Offre un modo programmatico per ricevere notifiche relative ad avvisi emessi dal browser, come ritiri e interventi. Puoi utilizzarlo come strumento di segnalazione e perdere meno sonno chiedendoti se gli utenti riscontrano problemi imprevisti sul sito pubblicato.
L'API
ReportingObserver
è diverso dalle altre API Observer
, come IntersectionObserver
e ResizeObserver
. Gli chiedi di richiamarti
per ottenere informazioni. Le informazioni ricevute dal callback sono un elenco dei problemi causati dalla pagina:
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();
Report filtrati
I report possono essere prefiltrati in modo da osservare solo determinati tipi di report. Al momento,
sono disponibili due tipi di report: 'deprecation'
e 'intervention'
.
const observer = new ReportingObserver((reports, observer) => {
…
}, {types: ['deprecation']});
Report su cui è stato eseguito il buffering
Utilizza l'opzione buffered: true
se vuoi visualizzare i report generati prima della creazione dell'istanza dell'osservatore:
const observer = new ReportingObserver((reports, observer) => {
…
}, {types: ['intervention'], buffered: true});
Questa opzione è ottima in situazioni come il caricamento lento di una libreria che utilizza un
ReportingObserver
. L'osservatore viene aggiunto in ritardo, ma non perdi nulla di ciò che è successo prima del caricamento pagina.
Interrompi osservazione
Interrompi l'osservazione con il metodo disconnect()
:
observer.disconnect();
Esempi
Segnalare gli interventi del browser a un provider di analisi
const observer = new ReportingObserver((reports, observer) => {
for (const report of reports) {
sendReportToAnalytics(JSON.stringify(report.body));
}
}, {types: ['intervention'], buffered: true});
observer.observe();
Ricevi una notifica quando le API verranno rimosse
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();
Conclusione
ReportingObserver
offre un ulteriore modo per scoprire e monitorare
potenziali problemi nella tua app web. È anche uno strumento utile per comprendere
lo stato della tua codebase (o la sua mancanza). Invia report al backend, ricevi informazioni
sui problemi reali, aggiorna il codice e usa i profitti.
Lavoro futuro
In futuro, spero che ReportingObserver
diventi l'API di fatto per rilevare tutti i tipi di problemi in JavaScript. Immagina un'API per individuare
tutto ciò che va storto nell'app:
- Interventi relativi al browser
- Deprecazioni
- Violazioni delle norme sulle funzionalità. Consulta il problema di Chromium n. 867471.
- Eccezioni ed errori JS (attualmente gestiti da
window.onerror
). - Rifiuti di promesse JS non gestite (attualmente gestito da
window.onunhandledrejection
)
Risorse aggiuntive: