عند الاستجابة للطلبات باستخدام الإدخالات المخزّنة مؤقتًا، على الرغم من أنّها سريعة، فإنّه ينتج عنها تنازل قد يؤدي إلى ظهور بيانات قديمة للمستخدمين.
توفّر حزمة workbox-broadcast-update
طريقة قياسية لإشعار
عملاء Windows
بأنّه تم تعديل استجابة محفوظة في ذاكرة التخزين المؤقت. ويُستخدم هذا الإجراء غالبًا مع
استراتيجية StaleWhileRevalidate
.
عندما تقوم عبارة "إعادة التحقق" في هذه الاستراتيجية استرداد استجابة من
تختلف عن تلك التي كانت مخزّنة مؤقتًا في السابق، فسترسل هذه الوحدة
رسالة (عبر
postMessage()
)
لجميع عملاء Windows ضمن نطاق مشغّل الخدمة الحالي.
يمكن لعملاء Windows الاستماع إلى التحديثات واتّخاذ الإجراء المناسب، مثل عرض رسالة تلقائيًا للمستخدم لإعلامه بأنّه تتوفّر تحديثات .
كيف يتم تحديد التحديثات؟
تتم مقارنة عناوين معيّنة للكائنات الجديدة والمخزّنة مؤقتًا في Response
، وإذا كانت أي من العناوين لها قيم مختلفة،
يتم اعتبار ذلك تعديلاً.
تكون العناوين 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
كمكوّن إضافي
لاستراتيجية معينة كما هو موضح أعلاه، فمن الممكن استخدام الطريقة الأساسية
المنطق في رمز عامل الخدمات.
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()
لإعلام أي نوافذ أو علامات تبويب مفتوحة عندما يتم تخزينها مؤقتًا.
تم تحديث الرد.
من أجل الكفاءة، لا تتم مقارنة أجسام الاستجابة الأساسية، وإنما يتم التحقّق من رؤوس استجابة محدّدة فقط.
أماكن إقامة
-
طريقة وضع التصميم
غير صالح
أنشئ مثيلًا من BroadcastCacheUpdate باستخدام
channelName
محدّد لبث الرسائل علىتبدو دالة
constructor
كما يلي:(options?: BroadcastCacheUpdateOptions) => {...}
-
الخيارات
BroadcastCacheUpdateOptions اختياري
-
returns
-
-
notifyIfUpdated
فراغ
يقارن بين ردَين. ويرسل رسالة (عبر
postMessage()
) إلى جميع برامج النوافذ إذا كانت تختلف الإجابات. لا يمكن أن يكون أيّ من "الردود" غير شفافة.تحتوي الرسالة المنشورة على التنسيق التالي (حيث يمكن لـ
payload
أن يتم تخصيصها عبر الخيارgeneratePayload
الذي يتم إنشاء المثيل به مع):{ type: 'CACHE_UPDATED', meta: 'workbox-broadcast-update', payload: { cacheName: 'the-cache-name', updatedURL: 'https://example.com/' } }
تبدو الدالة
notifyIfUpdated
على النحو التالي:(options: CacheDidUpdateCallbackParam) => {...}
-
الخيارات
-
returns
وعود <باطلة>
يتم حله بعد إرسال التحديث.
-
BroadcastCacheUpdateOptions
أماكن إقامة
-
headersToCheck
سلسلة اختيارية
-
notifyAllClients
منطقي اختياري
-
generatePayload
void اختياري
تبدو دالة
generatePayload
كما يلي:(options: CacheDidUpdateCallbackParam) => {...}
-
الخيارات
-
returns
سجلّ<stringany>
-
BroadcastUpdatePlugin
سيبث هذا المكون الإضافي رسالة تلقائيًا عند توفر استجابة مخزّنة مؤقتًا تحديث.
أماكن إقامة
-
طريقة وضع التصميم
فراغ
إنشاء مثيل
workbox-broadcast-update.BroadcastUpdate
باستخدام الخيارات التي تم تمريرها وتطلب طريقةnotifyIfUpdated
كلما تم استدعاء استدعاءcacheDidUpdate
للمكون الإضافي.تبدو الدالة
constructor
على النحو التالي:(options?: BroadcastCacheUpdateOptions) => {...}
-
الخيارات
BroadcastCacheUpdateOptions اختياري
-
returns
-
الطُرق
responsesAreSame()
workbox-broadcast-update.responsesAreSame(
firstResponse: Response,
secondResponse: Response,
headersToCheck: string[],
)
تقارن هذه الدالة بين قيمتَي Response's
لتحديد ما إذا كانتا
متطابقتَين أم لا.
المعلمات
-
firstResponse
الرد
-
secondResponse
الرد
-
headersToCheck
string[]
المرتجعات
-
منطقي