התגובה לבקשות עם רשומות ששמורות במטמון מהירה, אבל יש לה מחיר: יכול להיות שהמשתמשים יראו נתונים לא עדכניים.
החבילה workbox-broadcast-update
מספקת דרך סטנדרטית לשליחת הודעות
לקוחות חלון
שתגובה שנשמרה במטמון עודכנה. בדרך כלל משתמשים במדיניות הזו יחד עם
השיטה StaleWhileRevalidate
.
בכל פעם "אימות מחדש" בשיטה הזו מאחזר תגובה
רשת ששונה מזו שנשמרה במטמון קודם, המודול הזה ישלח
הודעה (דרך
postMessage()
)
לכל לקוחות החלונות שנמצאים בהיקף של קובץ השירות הנוכחי.
לקוחות Window יכולים להאזין לעדכונים ולבצע פעולה מתאימה, כמו להציג באופן אוטומטי הודעה למשתמש על כך שיש עדכונים זמינים.
איך נקבעים העדכונים?
מתבצעת השוואה בין כותרות מסוימות של האובייקטים החדשים והישנים ששמורים במטמון, ואם לכותרות כלשהן יש ערכים שונים, המערכת מתייחסת לכך כאל עדכון.
כברירת מחדל, הכותרות Content-Length
, ETag
ו-Last-Modified
הן
בהשוואה.
כדי לשפר את היעילות, ב-Workbox נעשה שימוש בערכי כותרות במקום בהשוואה של בייטים בבייט לגוף התשובה, במיוחד בתשובות שעשויות להיות גדולות.
שימוש בעדכון שידור
הספרייה מיועדת לשימוש יחד עם StaleWhileRevalidate
של שמירה במטמון, כי האסטרטגיה הזו כוללת החזרת
באופן מיידי, אבל הוא גם מספק מנגנון לעדכון
לשמור במטמון באופן אסינכרוני.
כדי לשדר עדכונים, פשוט מוסיפים broadcastUpdate.BroadcastUpdatePlugin
לאפשרויות האסטרטגיה.
import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
import {BroadcastUpdatePlugin} from 'workbox-broadcast-update';
registerRoute(
({url}) => url.pathname.startsWith('/api/'),
new StaleWhileRevalidate({
plugins: [new BroadcastUpdatePlugin()],
})
);
באפליקציית האינטרנט, לפני שהאירוע DOMContentLoaded
מתרחש, אפשר להאזין לאירועים האלה באופן הבא:
navigator.serviceWorker.addEventListener('message', async event => {
// Optional: ensure the message came from workbox-broadcast-update
if (event.data.meta === 'workbox-broadcast-update') {
const {cacheName, updatedURL} = event.data.payload;
// Do something with cacheName and updatedURL.
// For example, get the cached content and update
// the content on the page.
const cache = await caches.open(cacheName);
const updatedResponse = await cache.match(updatedURL);
const updatedText = await updatedResponse.text();
}
});
פורמט הודעה
כשמתבצעת הפעלה של מאזין לאירועים מסוג message
באפליקציית האינטרנט, לנכס event.data
יהיה הפורמט הבא:
{
type: 'CACHE_UPDATED',
meta: 'workbox-broadcast-update',
// The two payload values vary depending on the actual update:
payload: {
cacheName: 'the-cache-name',
updatedURL: 'https://example.com/'
}
}
התאמה אישית של הכותרות לבדיקה
אפשר להתאים אישית את הכותרות לבדיקה באמצעות הגדרת headersToCheck
לנכס.
import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
import {BroadcastUpdatePlugin} from 'workbox-broadcast-update';
registerRoute(
({url}) => url.pathname.startsWith('/api/'),
new StaleWhileRevalidate({
plugins: [
new BroadcastUpdatePlugin({
headersToCheck: ['X-My-Custom-Header'],
}),
],
})
);
שימוש מתקדם
רוב המפתחים ישתמשו ב-workbox-broadcast-update
כפלאגין של אסטרטגיה מסוימת, כפי שמוצג למעלה, אבל אפשר להשתמש בלוגיקה הבסיסית בקוד של ה-service worker.
import {BroadcastCacheUpdate} from 'workbox-broadcast-update';
const broadcastUpdate = new BroadcastCacheUpdate({
headersToCheck: ['X-My-Custom-Header'],
});
const cacheName = 'api-cache';
const request = new Request('https://example.com/api');
const cache = await caches.open(cacheName);
const oldResponse = await cache.match(request);
const newResponse = await fetch(request);
broadcastUpdate.notifyIfUpdated({
cacheName,
oldResponse,
newResponse,
request,
);
סוגים
BroadcastCacheUpdate
המערכת משתמשת ב-postMessage()
API כדי להודיע לכל החלונות או הכרטיסיות הפתוחים כשמתבצע עדכון של תגובה שנשמרה במטמון.
מטעמי יעילות, לא מתבצעת השוואה בין גופי התגובה הבסיסיים; רק כותרות תגובה ספציפיות נבדקות.
מאפיינים
-
constructor
ריק
יצירה של מופע של BroadcastCacheUpdate עם
channelName
ספציפי כדי לשדר הודעותהפונקציה
constructor
נראית כך:(options?: BroadcastCacheUpdateOptions) => {...}
-
אפשרויות
BroadcastCacheUpdateOptions optional
-
החזרות
-
-
notifyIfUpdated
void
הפונקציה משווה בין שתי תשובות ושולחת הודעה (דרך
postMessage()
) לכל לקוחות החלון אם התשובות שונות. אף אחת מהתשובות לא יכולה להיות אטום.ההודעה שפורסמה היא בפורמט הבא (כאשר
payload
יכול אפשרות להתאמה אישיתgeneratePayload
שהמכונה נוצרת עם):{ type: 'CACHE_UPDATED', meta: 'workbox-broadcast-update', payload: { cacheName: 'the-cache-name', updatedURL: 'https://example.com/' } }
הפונקציה
notifyIfUpdated
נראית כך:(options: CacheDidUpdateCallbackParam) => {...}
-
אפשרויות
-
החזרות
Promise<void>
הבעיה נפתרת אחרי שליחת העדכון.
-
BroadcastCacheUpdateOptions
מאפיינים
-
headersToCheck
string[] אופציונלי
-
notifyAllClients
בוליאני אופציונלי
-
generatePayload
void optional
הפונקציה
generatePayload
נראית כך:(options: CacheDidUpdateCallbackParam) => {...}
-
אפשרויות
-
החזרות
הקלטה<stringany>
-
BroadcastUpdatePlugin
הפלאגין הזה יפיץ הודעה באופן אוטומטי בכל פעם שתתבצע עדכון של תגובה שנשמרה במטמון.
מאפיינים
-
constructor
ריק
יוצרים מופע
workbox-broadcast-update.BroadcastUpdate
עם האפשרויות שהועברו, ומפעילים את השיטהnotifyIfUpdated
שלו בכל פעם שמפעילים את הפונקציה הלא חוזרתcacheDidUpdate
של הפלאגין.הפונקציה
constructor
נראית כך:(options?: BroadcastCacheUpdateOptions) => {...}
-
אפשרויות
BroadcastCacheUpdateOptions אופציונלי
-
החזרות
-
שיטות
responsesAreSame()
workbox-broadcast-update.responsesAreSame(
firstResponse: Response,
secondResponse: Response,
headersToCheck: string[],
)
נתונים שני Response's
, הפונקציה משווה בין כמה ערכים של כותרות כדי לבדוק אם הם זהים או לא.
פרמטרים
-
firstResponse
תשובה
-
secondResponse
תשובה
-
headersToCheck
string[]
החזרות
-
בוליאני