إذا كنت تستخدم واجهة برمجة التطبيقات Cache Storage API، سواءً ضمن عامل خدمة أو مباشرةً من تطبيقات الويب من خلال window.caches
، إليك بعض الأخبار السارّة: اعتبارًا من الإصدار 54 من Chrome، أصبحت المجموعة الكاملة من CacheQueryOptions
متاحة، ما يسهّل العثور على الردود المخزّنة مؤقتًا التي تبحث عنها.
ما هي الخيارات المتاحة؟
يمكن ضبط الخيارات التالية في أي مكالمة إلى CacheStorage.match()
أو Cache.match()
. في حال عدم ضبطها، يتم ضبطها تلقائيًا على false
(أو undefined
لـ cacheName
)، ويمكنك استخدام خيارات متعدّدة في طلب واحد إلى match()
.
ignoreSearch
يوجّه ذلك خوارزمية المطابقة إلى تجاهل جزء search من عنوان URL، المعروف أيضًا باسم مَعلمات طلب البحث لعنوان URL. يمكن أن يكون ذلك مفيدًا عندما يكون لديك عنوان URL مصدر يحتوي على مَعلمات طلب بحث تُستخدَم، على سبيل المثال، لتتبُّع الإحصاءات، ولكنها ليست مهمة من حيث تحديد مصدر بشكل فريد في ذاكرة التخزين المؤقت. على سبيل المثال، وقع العديد من المستخدمين ضحية "خدعة" عامل الخدمة التالية:
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
، يعني ذلك أنّ عمليات البحث في ذاكرة التخزين المؤقت ستتم بدون مراعاة أي عناوين Vary
تم ضبطها في الإجابات المخزّنة مؤقتًا.ignoreVary
إذا كنت تعلم أنّك لا تتعامل مع استجابات محفوظة مؤقتًا تستخدم العنوان Vary، لا داعي للقلق بشأن ضبط هذا الخيار.
دعم المتصفح
لا يكون الخيار CacheQueryOptions
متاحًا إلا في المتصفّحات التي تتيح استخدام واجهة برمجة التطبيقات Cache Storage API. بالإضافة إلى متصفّحات Chrome والمتصفحات المستندة إلى Chromium، يقتصر ذلك حاليًا على Firefox الذي يتيح استخدام CacheQueryOptions
بشكلٍ أصلي.
يمكن للمطوّرين الذين يريدون استخدام CacheQueryOptions
في إصدارات Chrome الأقدم من 54 الاستفادة من مجموعة polyfill، وذلك بفضل آرثر ستولار.