המדריך הזה מתמקד בשינויים משמעותיים שהוכנסו ב-Workbox בגרסה 6, עם דוגמאות לשינויים שצריך לבצע כשמשדרגים מ-Workbox בגרסה 5.
שינויי תוכנה שעלולים לגרום לכשלים
ליבה של תיבת עבודה
השיטה skipWaiting()
ב-workbox-core
לא תוסיף יותר טיפול install
, והיא שווה ערך לקריאה ל-self.skipWaiting()
בלבד.
מעכשיו, מומלץ להשתמש ב-self.skipWaiting()
במקום ב-skipWaiting()
, כי סביר להניח ש-skipWaiting()
יוסר בגרסה 7 של Workbox.
workbox-precaching
- אי אפשר יותר להשתמש במסמכי HTML ממקורות שונים עבור כתובות URL שתואמות להפניה אוטומטית מסוג HTTP כדי לענות על בקשת ניווט עם
workbox-precaching
. התרחיש הזה הוא בדרך כלל נדיר. - מעכשיו,
workbox-precaching
מתעלם מפרמטר השאילתה של כתובת ה-URLfbclid
כשמחפש תגובה שנשמרה במטמון מראש לבקשה נתונה. - ה-constructor של
PrecacheController
מקבל עכשיו אובייקט עם מאפיינים ספציפיים כפרמטר שלו, במקום מחרוזת. האובייקט הזה תומך במאפיינים הבאים:cacheName
(שמשמש לאותו מטרה כמו המחרוזת שהועברה למבנה ה-constructor בגרסה 5),plugins
(מחליף את השיטהaddPlugins()
מגרסה 5) ו-fallbackToNetwork
(מחליף את האפשרות הדומה שהועברה אלcreateHandler()
ו-createHandlerBoundToURL() בגרסה 5). - השיטות
install()
ו-activate()
שלPrecacheController
משתמשות עכשיו בפרמטר אחד בלבד, שצריך להגדיר ל-InstallEvent
או ל-ActivateEvent
תואמים, בהתאמה. - השיטה
addRoute()
הוסרה מ-PrecacheController
. במקום זאת, אפשר להשתמש בכיתה החדשהPrecacheRoute
כדי ליצור מסלול שאפשר יהיה לרשום לאחר מכן. - השיטה
precacheAndRoute()
הוסרה מ-PrecacheController
. (היא עדיין קיימת כשיטת עזר סטטית שמיוצאת על ידי המודולworkbox-precaching
). הוא הוסר כי אפשר להשתמש ב-PrecacheRoute
במקום זאת. - השיטה
createMatchCalback()
הוסרה מ-PrecacheController
. במקום זאת, אפשר להשתמש ב-PrecacheRoute
החדש. - השיטה
createHandler()
הוסרה מ-PrecacheController
. במקום זאת, אפשר להשתמש במאפייןstrategy
של האובייקטPrecacheController
לטיפול בבקשות. - הייצוא הסטטי של
createHandler()
כבר הוסר מהמודולworkbox-precaching
. במקום זאת, המפתחים צריכים ליצור מופע שלPrecacheController
ולהשתמש בנכסstrategy
שלו. - המסלול שרשום ב-
precacheAndRoute()
הוא עכשיו מסלול "אמיתי" שמשתמש במחלקהRouter
שלworkbox-routing
. אם תשלבו שיחות אלregisterRoute()
ו-precacheAndRoute()
, יכול להיות שסדר ההערכות של המסלולים יהיה שונה.
workbox-routing
השיטה setDefaultHandler()
מקבלת עכשיו פרמטר שני אופציונלי שתואם לשיטת ה-HTTP שהיא חלה עליה, והערך שמוגדר כברירת מחדל הוא 'GET'
.
- אם אתם משתמשים ב-
setDefaultHandler()
וכל הבקשות שלכם הןGET
, אין צורך לבצע שינויים. - אם יש לך בקשות שאינן
GET
(POST
,PUT
וכו'),setDefaultHandler()
לא יגרום יותר להתאמה של הבקשות האלה.
הגדרת build
האפשרות mode
למצבים getManifest
ו-injectManifest
ב-workbox-build
וב-workbox-cli
לא תוכננה לקבל תמיכה, והיא הוסרה. הכלל הזה לא חל על workbox-webpack-plugin
, שבו יש תמיכה ב-mode
בפלאגין InjectManifest
.
כלי ה-build דורשים את Node.js מגרסה 10 ואילך
גרסאות Node.js שקדמו לגרסה 10 כבר לא נתמכות ב-workbox-webpack-plugin
, ב-workbox-build
או ב-workbox-cli
. אם אתם משתמשים בגרסה של Node.js שקדמה ל-v8, עליכם לעדכן את סביבת זמן הריצה לגרסה נתמכת.
שיפורים חדשים
workbox-strategies
בגרסה 6 של Workbox יש דרך חדשה למפתחים של צד שלישי להגדיר אסטרטגיות משלהם ב-Workbox. כך, מפתחים של צד שלישי יכולים להרחיב את Workbox באופן שמתאים לצרכים שלהם.
הכיתה הבסיסית החדשה של Strategy
בגרסה 6, כל המחלקות של האסטרטגיה של Workbox צריכות להרחיב את המחלקה הבסיסית החדשה Strategy
. כל האסטרטגיות המובנות נכתבו מחדש כדי לתמוך בכך.
הכיתה הבסיסית Strategy
אחראית לשני דברים עיקריים:
- הפעלת קריאות חוזרות (callback) במחזור החיים של יישומי פלאגין, הנפוצות לכל הגורמים המטפלים באסטרטגיות (למשל, מתי הם מתחילים, מגיבים וסיום).
- יצירת מופע 'handler' שיכול לנהל את המצב של כל בקשה ספציפית שהשיטה מטפלת בה.
מחלקה חדשה של 'handler'
בעבר היו לנו מודולים פנימיים בשם fetchWrapper
ו-cacheWrapper
, שמקפלים את ממשקי ה-API השונים לאחזור ולאחסון במטמון באמצעות הוקס במהלך מחזור החיים שלהם (כפי שרומז השם שלהם). זהו המנגנון שמאפשר כרגע לפלאגינים לפעול, אבל הוא לא חשוף למפתחים.
הכיתה החדשה 'handler', StrategyHandler
, תציג את השיטות האלה כדי ששיטות מותאמות אישית יוכלו לקרוא ל-fetch()
או ל-cacheMatch()
, ולכל הפלאגינים שנוספו למכונה של האסטרטגיה יופעל קריאה אוטומטית.
השיעור גם יאפשר למפתחים להוסיף קריאות חוזרות (callback) מותאמות אישית במחזור החיים, שיהיו ספציפיות לאסטרטגיות שלהם, והם "פשוט יעבדו" עם ממשק הפלאגין הקיים.
מצב חדש של מחזור החיים של הפלאגין
ב-Workbox בגרסה 5, יישומי הפלאגין הם ללא מצב. כלומר, אם בקשה ל-/index.html
מפעילה גם את פונקציית ה-callback של requestWillFetch
וגם את זו של cachedResponseWillBeUsed
, אין לשתי פונקציות ה-callback האלה אפשרות לתקשר זו עם זו או אפילו לדעת שהן הופעלו על ידי אותה בקשה.
בגרסה 6, כל קריאות החזרה (callbacks) של הפלאגין יקבלו גם אובייקט state
חדש. אובייקט המצב הזה יהיה ייחודי לאובייקט הפלאגין הספציפי הזה ולקריאה הספציפית הזו של האסטרטגיה (כלומר, הקריאה ל-handle()
). כך המפתחים יכולים לכתוב פלאגינים שבהם פונקציית קריאה חוזרת אחת יכולה לבצע משהו באופן מותנה על סמך מה שפונקציית קריאה חוזרת אחרת באותו פלאגין עשתה (למשל, חישוב הפרש הזמן בין הפעלת requestWillFetch
לבין הפעלת fetchDidSucceed
או fetchDidFail
).
קריאות חוזרות חדשות במחזור החיים של הפלאגין
נוספו קריאות חזרה חדשות למחזור החיים של הפלאגין כדי לאפשר למפתחים לנצל את מצב מחזור החיים של הפלאגין במלואו:
handlerWillStart
: הקריאה מתבצעת לפני שהלוגיקה של הטיפול מתחילה לפעול. אפשר להשתמש בקריאה החוזרת הזו כדי להגדיר את מצב הטיפול הראשוני (למשל, לתעד את שעת ההתחלה).handlerWillRespond
: הקריאה מתבצעת לפני ששיטתhandle()
של האסטרטגיות מחזירה תשובה. אפשר להשתמש בקריאה החוזרת (callback) הזו כדי לשנות את התשובה לפני שהיא מחזירה אותה ל-handler של נתיב או ללוגיקה מותאמת אישית אחרת.handlerDidRespond
: הקריאה מתבצעת אחרי ששיטתhandle()
של האסטרטגיה מחזירה תשובה. אפשר להשתמש בקריאה החוזרת הזו כדי לתעד את פרטי התשובה הסופיים, למשל אחרי שינויים שבוצעו על ידי יישומי פלאגין אחרים.handlerDidComplete
: בוצעה קריאה אחרי שהוסדרו כל ההבטחות לכל משך החיים שנוספו לאירוע בעקבות הפעלת האסטרטגיה הזו. אפשר להשתמש בקריאה חוזרת (callback) הזו כדי לדווח על נתונים שצריך להמתין עד שה-handler יסתיים לצורך החישוב (למשל, סטטוס ההיט של המטמון, זמן האחזור של המטמון, זמן האחזור של הרשת).handlerDidError
: הקריאה הזו מתבצעת אם הטיפול לא הצליח לספק תגובה תקפה מכל מקור. אפשר להשתמש בקריאה החוזרת הזו כדי לספק תוכן 'חלופי' כחלופה לשגיאה בחיבור לרשת.
מפתחים שמטמיעים שיטות מותאמות אישית משלהם לא צריכים לדאוג להפעלת קריאות החזרה האלה בעצמם. כל הטיפול בכך מתבצע על ידי סוג בסיס חדש של Strategy
.
סוגי TypeScript מדויקים יותר למטפלים
הגדרות TypeScript לשיטות קריאה חוזרת שונות עברו נורמליזציה. כך תהיה חוויה טובה יותר למפתחים שמשתמשים ב-TypeScript וכותבים קוד משלהם כדי להטמיע בוררים או לבצע קריאה אליהם.
workbox-window
שיטת new message Waiting()
הוספנו שיטה חדשה, messageSkipWaiting()
, למודול workbox-window
כדי לפשט את התהליך של הפיכת ה-service worker 'הממתין' לפעיל. יש לכך כמה יתרונות:
- היא קוראת ל-
postMessage()
באמצעות גוף ההודעה הסטנדרטי בפועל,{type: 'SKIP_WAITING'}
, ש-Service Worker יצר בדיקות של Workbox כדי להפעיל אתskipWaiting()
. - הוא בוחר את קובץ השירות המתאים "בסטטוס המתנה" כדי לפרסם את ההודעה הזו, גם אם זה לא אותו קובץ שירות שבו
workbox-window
נרשם.
הסרה של אירועים 'חיצוניים' לטובת נכס isExternal
כל האירועים 'החיצוניים' ב-workbox-window
הוסרו, והם הוחלפו באירועים 'רגילים' עם מאפיין isExternal
שמוגדר כ-true
. כך מפתחים שחשוב להם להבחין בין השניים עדיין יכולים לזהות את ההבדל, ומפתחים שלא צריכים לדעת עליו יכולים להתעלם מהנכס.
מתכון לניקוי הדף 'הצעת טעינה מחדש של דף למשתמשים'
בזכות שני השינויים שלמעלה, אפשר לפשט את המתכון 'הצעה למשתמשים לטעון מחדש את הדף':
MULTI_LINE_CODE_PLACEHOLDER_0
workbox-routing
פרמטר בוליאני חדש, sameOrigin
, מועבר לפונקציה matchCallback
שמשמשת ב-workbox-routing
. הערך מוגדר כ-true
אם הבקשה היא לכתובת URL מאותו מקור, וכ-false במקרה אחר.
כך אפשר לפשט תבניות סטנדרטיות נפוצות:
MULTI_LINE_CODE_PLACEHOLDER_1
matchOptions ב-workbox-expiration
עכשיו אפשר להגדיר את matchOptions
בפונקציה workbox-expiration
, ותועבר בתור CacheQueryOptions
לקריאה הבסיסית ל-cache.delete()
. (רוב המפתחים לא יצטרכו לעשות זאת).
שמירה במטמון לתיבת העבודה
שימוש ב-workbox-strategies
workbox-precaching
נכתב מחדש כך שישתמש ב-workbox-strategies
כבסיס. השינוי הזה לא אמור לגרום לשינויים משמעותיים, והוא אמור להוביל לעקביות טובה יותר לטווח ארוך באופן שבו שני המודולים ניגשים לרשת ולמטמון.
עכשיו, תהליך האחסון המקדים מעבד רשומות אחת אחרי השנייה, ולא בכמות גדולה
workbox-precaching
עודכן כך שרק רשומה אחת במניפסט של שמירת המטמון מקודמת מופיעה בבקשה ומאוחסנת במטמון בכל פעם, במקום לנסות לבקש ולשמור במטמון את כולן בבת אחת (הדפדפן יקבע איך לשלוט בקצב השליחה).
כך תפחיתו את הסבירות לשגיאות מסוג net::ERR_INSUFFICIENT_RESOURCES
במהלך האחסון המוקדם, וגם תפחיתו את התחרות על רוחב הפס בין האחסון המוקדם לבין בקשות בו-זמניות שנשלחות על ידי אפליקציית האינטרנט.
ה-PrecacheFallbackPlugin מאפשר חלופה קלה יותר למצב אופליין
workbox-precaching
כולל עכשיו PrecacheFallbackPlugin
, שמטמיע את שיטת מחזור החיים החדשה handlerDidError
שנוספה בגרסה 6.
כך קל לציין כתובת URL שנשמרה במטמון מראש כ'חלופה' לשיטה מסוימת, במקרה שהתגובה לא תהיה זמינה אחרת. הפלאגין יטפל ביצירה הנכונה של מפתח המטמון הנכון לכתובת ה-URL שנשמרה במטמון מראש, כולל כל פרמטר של גרסה שנדרש.
הנה דוגמה לשימוש בו כדי להגיב עם /offline.html
שנשמר מראש במטמון כאשר האסטרטגיה NetworkOnly
לא יכולה ליצור תגובה לבקשת ניווט. במילים אחרות, הצגת דף HTML מותאם אישית במצב אופליין:
MULTI_LINE_CODE_PLACEHOLDER_2
precacheFallback
בשמירה במטמון בזמן ריצה
אם אתם משתמשים ב-generateSW
כדי ליצור בשבילכם service worker במקום לכתוב את ה-service worker בעצמכם, אתם יכולים להשתמש באפשרות ההגדרה החדשה precacheFallback
ב-runtimeCaching
כדי להשיג את אותו הדבר:
{
// ... other generateSW config options...
runtimeCaching: [{
urlPattern: ({request}) => request.mode === 'navigate',
handler: 'NetworkOnly',
options: {
precacheFallback: {
// This URL needs to be included in your precache manifest.
fallbackURL: '/offline.html',
},
},
}],
}
קבלת עזרה
אנחנו מצפים שרוב ההעברות יהיו פשוטות. אם נתקלת בבעיות שלא מפורטות במדריך הזה, אפשר לפתוח פנייה בנושא ב-GitHub.