Существует два способа прямой передачи сообщений от обслуживающего работника на страницы вашего клиента: с помощью postMessage()
и с помощью API широковещательного канала .
.API широковещательного канала немного проще для этой цели, но в настоящее время не поддерживается в Safari или Edge.
В любом случае вам решать, как отформатировать ваше сообщение.и включите соответствующую информацию о состоянии от обслуживающего работника, которая потребуется клиентам для отображения сообщения пользователю.
Вот примерный пример того, как может работать подход postMessage()
:
// In your service worker:
self.addEventListener('install', async event => {
event.waitUntil((async () => {
const allUrls = [
'/url1',
'/url2',
// etc.
];
const alreadyCached = [];
const clients = await self.clients.matchAll({
includeUncontrolled: true,
});
const cache = await caches.open('my-cache-name');
for (const url of allUrls) {
await cache.add(url);
alreadyCached.push(url);
for (const client of clients) {
client.postMessage({
// Put whatever info you want here.
alreadyCached,
allUrls,
});
}
}
})());
});
// In your client pages:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.addEventListener('message', event => {
// event.data will contain {alreadyCached, allUrls}.
});
}