הסרת עובדי שירות עם באגים

לפעמים נפרס עובד שירות עם באגים, ואז יש בעיות. לדוגמה, ניתן לנתח קובץ שירות (service worker) בזמן ההרשמה ולהשלים את ההתקנה בהצלחה. עם זאת, קוד באגים באירוע fetch עלול לגרום לו לא להגיב לבקשות, ולכן ייפתח דף ריק. אפשרות נוספת היא שתגי העיצוב של הדף נשמרים במטמון באופן אגרסיבי, ו-Service Worker מחזיר תגובות לא עדכניות של תגי עיצוב ממופע Cache בלבד בביקורים הבאים.

Service Worker יכול לפעול בדרכים רבות כדי לפעול ברקע, וזו בעיה מפחידה באתר הפקה. למרות זאת, לא הכול חסר. יש דרכים לפתור את הבעיה ולחזור לעניינים.

פריסת Service Worker ללא תפעול

בדרך כלל כל מה שנדרש כדי להתמודד עם עובד שירות עם באגים הוא לפרוס קובץ שירות (service worker) מסוג no-op שמתקין ומופעל באופן מיידי ללא הגורם המטפל באירועים של fetch:

// sw.js

self.addEventListener('install', () => {
  // Skip over the "waiting" lifecycle state, to ensure that our
  // new service worker is activated immediately, even if there's
  // another tab open controlled by our older service worker code.
  self.skipWaiting();
});

self.addEventListener('activate', () => {
  // Optional: Get a list of all the current open windows/tabs under
  // our service worker's control, and force them to reload.
  // This can "unbreak" any open windows/tabs as soon as the new
  // service worker activates, rather than users having to manually reload.
  self.clients.matchAll({
    type: 'window'
  }).then(windowClients => {
    windowClients.forEach((windowClient) => {
      windowClient.navigate(windowClient.url);
    });
  });
});

Service Worker יותקן ויופעל באופן מיידי באמצעות התקשרות self.skipWaiting() באירוע install. לחלופין, אפשר לפרוס קוד נוסף באירוע activate כדי לאלץ טעינה מחדש של כרטיסיות פתוחות אחרות באמצעות WindowClient בשליטת ה-Service Worker.

חשוב מאוד ש-Service Worker ללא תפעול לא יכיל handler של אירועי fetch. כש-Service Worker לא מטפל בבקשות, הבקשות האלה עוברות לדפדפן כאילו לא נמצא קובץ שירות (service worker). לאחר פריסת קובץ שירות (service worker) ללא תפעול, ניתן לתקן את ה-Service worker עם הבאגים ולפרוס אותו כעדכון מאוחר יותר.

הגישה הזו עובדת בין היתר כי לדפדפנים יש אמצעי הגנה חזקים מפני הצבת עובדי שירות במטמון ה-HTTP, ובגלל שהם מבצעים בדיקות בייט-לבייט בתוכן של קובצי שירות (service worker). הגדרות ברירת המחדל האלה מאפשרות לפרוס ללא תפעול החלפה של קובץ שירות (service worker) מלא באגים, כדי לתקן את הבעיה במהירות.

אמצעים נוספים שצריך לנקוט

פריסת קובץ שירות (service worker) ללא תפעול אמורה להספיק כדי לנטרל באגים באגים, אבל ניתן לנקוט אמצעים נוספים אם יש צורך.

מה אם לא ידועה לך כתובת ה-URL של ה-Service Worker הישן?

לפעמים כתובת ה-URL של קובץ שירות שהותקן קודם לא ידועה. יכול להיות שהסיבה לכך היא שהגרסה שלה (לדוגמה, מכילה גיבוב בשם הקובץ). במקרה כזה, יכול להיות מאתגר לפרוס קובץ שירות (service worker) ללא תפעול שתואם לכתובת ה-URL של כל קובץ שירות (service worker) ישן שעשוי להיות רשום. זה נוגד את השיטות המומלצות, כי סביר להניח שמפתחים לא יזכרו את כל הגיבוב של כל גרסת Service Worker שנפרסה.

למרבה המזל, נשלחת כותרת מועילה של בקשת HTTP יחד עם בקשה לסקריפט של Service Worker: Service-Worker בשרת האינטרנט, מחפשים את הכותרת הזו ומיירטים את הבקשה להצגת קובץ שירות (service worker) ללא תפעול במקום זאת. ביצוע הפעולה הזו תלוי בשרת האינטרנט ובסטאק הקצה העורפי שבו משתמשים, לכן חשוב לעיין בתיעוד של השפה הרלוונטית כדי להבין איך לעשות את זה.

בפריסות עתידיות של Service Worker, השתמשו בשמות נכסים שאינם גרסאות (לדוגמה, sw.js). בהמשך התהליך יהיה הרבה פחות מסובך.

הגדרת כותרת של Clear-Site-Data

בדפדפנים מסוימים מבטלים את הרישום של כל קובצי השירות (service worker) למקור כלשהו, אם הוגדרה כותרת תגובה Clear-Site-Data עם הערך 'storage'. עם זאת, יש כמה נקודות שכדאי לשים לב אליהן בגישה הזו:

  • שימו לב שהפעולה הזו תגרום לניקוי כל האחסון של המקור המשויך. זה כולל את localStorage, IndexedDB, sessionStorage ואחסון אחר (אבל לא את מטמון ה-HTTP של המקור).
  • הכותרת הזו לא נתמכת בכל הדפדפנים.

בגלל שהתמיכה בכותרת הזו היא חלקית, לא ניתן להסתמך עליה בלבד כדי לפתור את הבעיה. לכן מומלץ להשתמש ב-Clear-Site-Data כאמצעי תשלום נוסף בנוסף לפריסה של קובץ שירות (service worker) ללא תפעול.

הנזק אינו קבוע

זה יכול להיות מפחיד כשעובד שירות עם באגים מטריד את חוויית המשתמש – במיוחד באתרים גדולים וידועים – אבל הנזק הוא זמני והפיך!

אם יש צורך לפרוס Service Worker ללא תפעול כדי לתקן את המצב, נדרש זמן לאחר מעשה כדי להבין מה בדיוק השתבש. בעתיד, ודאו ש-Service Worker מטפל רק בבקשות שהוא צפוי לטפל בהן. בדקו לעיתים קרובות ב-Staging ופרסו עדכונים רק כשאתם בטוחים.