כששומרים נכסים במטמון בזמן הריצה, אין כלל אחד שמתאים לכולם שקובע אם תגובה נתונה היא 'חוקית', ואפשר לשמור אותה ולהשתמש בה שוב.
המודול workbox-cacheable-response
מספק דרך סטנדרטית לקבוע אם תגובה צריכה להישמר במטמון על סמך קוד הסטטוס המספרי שלה, נוכחות כותרת עם ערך ספציפי או שילוב של שניהם.
שמירה במטמון על סמך קודי סטטוס
אפשר להגדיר אסטרטגיית תיבת עבודה כדי שקבוצה של קודי סטטוס תתאים לשמירה במטמון על ידי הוספת מופע CacheableResponsePlugin
לפרמטר plugins
של האסטרטגיה:
import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {CacheableResponsePlugin} from 'workbox-cacheable-response';
registerRoute(
({url}) =>
url.origin === 'https://third-party.example.com' &&
url.pathname.startsWith('/images/'),
new CacheFirst({
cacheName: 'image-cache',
plugins: [
new CacheableResponsePlugin({
statuses: [0, 200],
}),
],
})
);
ההגדרה הזו מורה ל-Workbox שכשמעבדים תגובות לבקשות מול https://third-party.example.com/images/
, צריך לשמור במטמון את כל הבקשות עם קוד הסטטוס 0
או 200
.
שמירה במטמון לפי כותרות
אפשר להגדיר אסטרטגיית תיבת עבודה כדי לבדוק אם יש ערכי כותרת ספציפיים כקריטריונים להוספה למטמון, על ידי הגדרת האובייקט headers
כשיוצרים את הפלאגין:
import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
import {CacheableResponsePlugin} from 'workbox-cacheable-response';
registerRoute(
({url}) => url.pathname.startsWith('/path/to/api/'),
new StaleWhileRevalidate({
cacheName: 'api-cache',
plugins: [
new CacheableResponsePlugin({
headers: {
'X-Is-Cacheable': 'true',
},
}),
],
})
);
כשמעבדים תגובות לכתובות URL של בקשות שמכילות /path/to/api/
, חשוב לבדוק את הכותרת בשם X-Is-Cacheable
(שתתווסף לתגובה על ידי השרת). אם הכותרת הזו קיימת, ואם היא מוגדרת לערך 'true', אפשר לשמור את התגובה במטמון.
אם צוינו כמה כותרות, רק אחת מהכותרות צריכה להתאים לערכים המשויכים.
שמירה במטמון לפי כותרות וקודי סטטוס
אפשר לשלב גם סטטוס וגם הגדרת כותרת. שני התנאים חייבים להתקיים כדי שהתגובה תיחשב כניתנת לשמירה. במילים אחרות, התגובה צריכה להכיל אחד מקודי הסטטוס שהוגדרו, וגם לפחות אחת מהכותרות שצוינו.
import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
import {CacheableResponsePlugin} from 'workbox-cacheable-response';
registerRoute(
({url}) => url.pathname.startsWith('/path/to/api/'),
new StaleWhileRevalidate({
cacheName: 'api-cache',
plugins: [
new CacheableResponsePlugin({
statuses: [200, 404],
headers: {
'X-Is-Cacheable': 'true',
},
}),
],
})
);
מהן ברירות המחדל?
אם משתמשים באחת מהאסטרטגיות המובנות של Workbox בלי להגדיר cacheableResponse.CacheableResponsePlugin
באופן מפורש, הקריטריונים הבאים של ברירת המחדל משמשים כדי לקבוע אם תגובה שמתקבלת מהרשת תישמר במטמון:
- staleזמןRevalidate ו-NetworkFirst: תשובות עם סטטוס של
0
(כלומר תגובות אטומות) או200
נחשבות כתגובות שניתן לשמור במטמון. - cacheFirst: תגובות עם סטטוס
200
נחשבות כניתנות לשמירה.
כברירת מחדל, כותרות התגובות לא משמשות לקביעת יכולת השמירה במטמון.
למה יש ברירות מחדל שונות?
הגדרות ברירת המחדל משתנות בהתאם לשאלה האם תשובות עם סטטוס של 0
(כלומר תגובות אטומות)
יישמרו במטמון. בגלל אופי "התיבה השחורה" של תגובות אטומות, ל-Service Worker אין אפשרות לדעת אם התגובה חוקית או אם היא משקפת שגיאה שמוחזרת משרת חוצה-מקורות.
באסטרטגיות שכוללות כמה אמצעים לעדכון התגובה שנשמרה במטמון, כמו stalewhileRevalidate ו-networkFirst, יש סיכון נמוך לשמירה של תגובת שגיאה זמנית, כי בפעם הבאה שהמטמון יתעדכן, ייעשה שימוש בתגובה תקינה ומוצלחת.
באסטרטגיות שכוללות שמירה של התגובה הראשונה שהתקבלה במטמון ושימוש חוזר בתגובה ששמורה במטמון ללא הגבלת זמן, ההשלכות של שגיאה זמנית בשמירה במטמון ובשימוש חוזר הן חמורות יותר. על מנת לדאוג לכך כברירת מחדל, התכונה 'cacheFirst' תסרב לשמור תשובה אלא אם קוד הסטטוס שלה הוא 200
.
שימוש מתקדם
אם רוצים להשתמש באותה לוגיקה של שמירה במטמון מחוץ לאסטרטגיית Workbox, אפשר להשתמש ישירות בכיתה CacheableResponse
.
import {CacheableResponse} from 'workbox-cacheable-response';
const cacheable = new CacheableResponse({
statuses: [0, 200],
headers: {
'X-Is-Cacheable': 'true',
},
});
const response = await fetch('/path/to/api');
if (cacheable.isResponseCacheable(response)) {
const cache = await caches.open('api-cache');
cache.put(response.url, response);
} else {
// Do something when the response can't be cached.
}
סוגים
CacheableResponse
המחלקה הזו מאפשרת להגדיר כללים שקובעים אילו קודי סטטוס ו/או כותרות צריכים להיכלל כדי ש-Response
ייחשב כניתן לשמירה במטמון.
תכונות
-
Constructor
void
כדי ליצור מכונה חדשה של CacheableResponse, צריך לספק לפחות אחד מהמאפיינים
config
.אם מציינים גם
statuses
וגםheaders
, שני התנאים חייבים להתקיים כדי ש-Response
ייחשב ניתן לשמירה במטמון.הפונקציה
constructor
נראית כך:(config?: CacheableResponseOptions) => {...}
-
config
CacheableResponseOptions אופציונלי
-
החזרות
-
-
isResponseCacheable
void
בודקת תגובה כדי לראות אם היא ניתנת לשמירה או לא, על סמך ההגדרות של האובייקט.
הפונקציה
isResponseCacheable
נראית כך:(response: Response) => {...}
-
תשובה
תשובה
התגובה שאפשרות השמירה שלה נבדקת במטמון.
-
החזרות
boolean
true
אם ניתן לשמור אתResponse
במטמון וגםfalse
אם לא.
-
CacheableResponseOptions
תכונות
-
headers
אובייקט אופציונלי
-
סטטוסים
number[] אופציונלי
CacheableResponsePlugin
מחלקה שמטמיעה את הקריאה החוזרת של מחזור החיים של cacheWillUpdate
. כך קל יותר להוסיף בדיקות של אפשרות שמירה במטמון לבקשות שנשלחות באמצעות האסטרטגיות המובנות של Workbox.
תכונות
-
Constructor
void
כדי ליצור מכונת CacheableResponsePlugin חדשה, צריך לספק לפחות אחד ממאפייני
config
.אם מציינים גם
statuses
וגםheaders
, שני התנאים חייבים להתקיים כדי ש-Response
ייחשב ניתן לשמירה במטמון.הפונקציה
constructor
נראית כך:(config: CacheableResponseOptions) => {...}
-
config
-
החזרות
-