אם אתם משתמשים ב-Cache Storage API, בתוך service worker או ישירות מאפליקציות אינטרנט דרך window.caches
, יש לנו חדשות טובות: החל מ-Chrome 54, יש תמיכה בקבוצה המלאה של CacheQueryOptions
, כך שיהיה קל יותר למצוא את התשובות ששמורות במטמון שאתם מחפשים.
אילו אפשרויות זמינות?
אפשר להגדיר את האפשרויות הבאות בכל קריאה ל-CacheStorage.match()
או ל-Cache.match()
. אם המדיניות לא מוגדרת, ברירת המחדל של כולן היא false
(או undefined
למשך cacheName
), ואפשר להשתמש במספר אפשרויות בקריאה אחת ל-match()
.
ignoreSearch
הפרמטר הזה מורה לאלגוריתם ההתאמה להתעלם מהחלק של החיפוש בכתובת URL, שנקרא גם פרמטרים של שאילתה בכתובת ה-URL. האפשרות הזו יכולה להיות שימושית כשיש לכם כתובת URL של מקור שמכילה פרמטרים של שאילתות שמשמשים, למשל, למעקב ב-Analytics, אבל לא משמעותיים מבחינת זיהוי ייחודי של משאב במטמון. לדוגמה, הרבה אנשים נופלים בפח של "המלכודת" הבאה של שירות העבודה:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('my-cache')
.then(cache => cache.add('index.html'))
);
});
self.addEventListener('fetch', event => {
// Make sure this is a navigation request before responding.
if (event.request.mode === 'navigation') {
event.respondWith(
caches.match(event.request) || fetch(event.request)
);
}
});
קוד כזה פועל כצפוי כשמשתמש מנווט ישירות אל index.html
, אבל מה קורה אם באפליקציית האינטרנט שלכם נעשה שימוש בספק ניתוח נתונים כדי לעקוב אחרי קישורים נכנסים, והמשתמש מנווט אל index.html?utm_source=some-referral
? כברירת מחדל, העברה של index.html?utm_source=some-referral
אל caches.match()
לא תחזיר את הערך של index.html
. אבל אם הערך של ignoreSearch
מוגדר כ-true
, אפשר לאחזר את התשובה שצפויה להיות שמורה במטמון, ללא קשר לפרמטרים של השאילתה שהוגדרו:
caches.match(event.request, {ignoreSearch: true})
cacheName
cacheName
שימושי כשיש כמה מטמון, וברצונך לקבל תגובה ששמורה במטמון ספציפי אחד. השימוש בו יכול לשפר את היעילות של השאילתות (כי הדפדפן צריך לבדוק רק במטמון אחד, במקום בכל המטמונים), ומאפשר לאחזר תשובה ספציפית לכתובת URL נתונה כשייתכן שכתובת ה-URL הזו שמורה כמפתח במספר מטמונים. הפקודה cacheName
משפיעה רק כשמשתמשים בה עם CacheStorage.match()
, ולא עם Cache.match()
, כי הפקודה Cache.match()
כבר פועלת על מטמון יחיד בעל שם.
// The following are functionally equivalent:
caches.open('my-cache')
.then(cache => cache.match('index.html'));
// or...
caches.match('index.html', {cacheName: 'my-cache'});
ignoreMethod
וגם ignoreVary
ignoreMethod
ו-ignoreVary
הם קצת יותר ספציפיים מ-ignoreSearch
ו-cacheName
, אבל הם משמשים למטרות ספציפיות.
ignoreMethod
מאפשר להעביר באובייקט Request
כל method
(POST
, PUT
וכו') כפרמטר הראשון אל match()
. בדרך כלל מותר לשלוח רק בקשות GET
או HEAD
.
// In a more realistic scenario, postRequest might come from
// the request property of a FetchEvent.
const postRequest = new Request('index.html', {method: 'post'});
// This will never match anything.
caches.match(postRequest);
// This will match index.html in any cache.
caches.match(postRequest, {ignoreMethod: true});
אם הערך מוגדר כ-true
, הערך ignoreVary
מציין שהחיפושים במטמון יתבצעו ללא קשר לכותרות Vary
שמוגדרות בתשובות שנשמרו במטמון. אם אתם יודעים שאתם לא מטפלים בתשובות שנשמרו במטמון שמשתמשות בכותרת Vary, אתם לא צריכים להגדיר את האפשרות הזו.
תמיכה בדפדפנים
השדה CacheQueryOptions
רלוונטי רק בדפדפנים שתומכים ב-Cache Storage API. מלבד Chrome ודפדפנים המבוססים על Chromium, התמיכה מוגבלת כרגע ל-Firefox, שכבר תומך באופן מובנה ב-CacheQueryOptions
.
מפתחים שרוצים להשתמש ב-CacheQueryOptions
בגרסאות של Chrome שקודמות לגרסה 54 יכולים להשתמש בפולימילוי, באדיבות ארתור סטוליאר.