אמ;לק
יש צופה חדש בעיר! ReportingObserver
הוא API חדש שמאפשר לדעת מתי באתר שלכם נעשה שימוש ב-API שהוצא משימוש או כשהוא נתקל בהתערבות בדפדפן:
const observer = new ReportingObserver(
(reports, observer) => {
for (const report of reports) {
console.log(report.type, report.url, report.body);
}
},
{buffered: true}
);
observer.observe();
אפשר להשתמש בקריאה החוזרת (callback) כדי לשלוח דוחות לספק קצה עורפי או לספק ניתוח נתונים לניתוח נוסף.
למה זה שימושי? עד עכשיו, אזהרות על הוצאה משימוש והתערבות היו זמינות ב-DevTools רק כהודעות במסוף.
באופן ספציפי, התערבויות מופעלות רק על ידי מגבלות שונות בעולם האמיתי, כמו תנאי המכשיר והרשת. לכן יכול להיות שלעולם לא תראו את ההודעות האלה
כשמפתחים או בודקים אתר באופן מקומי. בעזרת ReportingObserver
תוכלו למצוא את הפתרון לבעיה הזו. כשמשתמשים נתקלים בבעיות פוטנציאליות באינטרנט, אנחנו יכולים לקבל עליהן התראות.
מבוא
לפני זמן מה, כתבתי פוסט בבלוג ("Obating your web app") כי מעניין אותי לדעת כמה ממשקי API יש לצורך מעקב אחרי ה"דברים" שמתרחשים באפליקציית אינטרנט. לדוגמה, יש ממשקי API שיכולים לקלוט מידע על ה-DOM: ResizeObserver
,
IntersectionObserver
, MutationObserver
. קיימים ממשקי API לתיעוד מדידות של ביצועים: PerformanceObserver
. אפילו ממשקי API אחרים כמו window.onerror
ו-window.onunhandledrejection
מודיעים לנו
כשמשהו משתבש.
עם זאת, יש סוגים אחרים של אזהרות שלא מתועדות על ידי ממשקי ה-API הקיימים. כשהאתר שלכם משתמש ב-API שהוצא משימוש או שהוא פועל בעקבות התערבות של הדפדפן, כלי הפיתוח מיידעים אתכם לגביהם:
באופן טבעי, window.onerror
יתייחס לאזהרות האלה. זה לא נכון.
הסיבה לכך היא שהפונקציה window.onerror
לא מופעלת בעקבות אזהרות שנוצרו ישירות על ידי סוכן המשתמש עצמו. היא מופעלת עקב שגיאות זמן ריצה (חריגים של JS ושגיאות תחביר) שנגרמות כתוצאה מהפעלת הקוד.
ReportingObserver
תופס את המרווח. היא מספקת דרך פרוגרמטית לקבל התראות על אזהרות בדפדפן, כמו הוצאה משימוש ופעולות התערבות. אפשר להשתמש בו ככלי דיווח ומאבדים את איכות השינה, בלי לתהות אם המשתמשים נתקלים בבעיות לא צפויות באתר.
ממשק ה-API
ה-API שונה מממשקי ה-API האחרים מסוג "observer", כמו 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();
דוגמה - קבלת הודעה כאשר ממשקי API יוסרו:
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
יש דרך נוספת לגלות בעיות פוטנציאליות באפליקציית האינטרנט ולעקוב אחריהן. זו אפילו דרך יעילה להבין את תקינות ה-codebase (או אי-תקינותו). שלח דוחות לקצה העורפי,
דע מהן הבעיות בעולם האמיתי שמשתמשים נתקלים בהן באתר שלך, עדכן קוד, רווח!
עבודה עתידית
בעתיד, אני מקווה ש-ReportingObserver
יהפוך ל-API בפועל לטיפול בכל סוגי הבעיות ב-JS. דמיינו ממשק API אחד שיאתר את כל מה שמשתבש באפליקציה:
- התערבות בדפדפן
- הוצאה משימוש
- הפרות של המדיניות בנושא תכונות. מידע נוסף זמין בכתובת crbug.com/867471.
- חריגים ושגיאות של JS (השירות נבדק כרגע על ידי
window.onerror
). - דחיות של להבטיח JS שלא טופלו (מטופל כרגע על ידי
window.onunhandledrejection
)
אני גם נלהב מהכלים שמשלבים את ReportingObserver
בתהליכי העבודה שלהם. הכלי Lighthouse הוא דוגמה לכלי שכבר מסמן את ההוצאה משימוש של הדפדפנים כשמריצים את הביקורת 'הימנעות מממשקי API שהוצאו משימוש':
ב-Lighthouse משתמשים כרגע בפרוטוקול DevTools כדי להעתיק הודעות במסוף ולדווח על הבעיות האלה למפתחים. במקום זאת, ייתכן שתרצו לעבור אל ReportingObserver
כדי לראות את דוחות ההוצאה משימוש המובנים היטב ואת המטא-נתונים הנוספים, כמו תאריך anticipatedRemoval
.
מקורות מידע נוספים: