Вы не получите автоматически ни одно из этих событий при использовании сервисного работника. Кроме того, модель, когда работник службы заполняет и обновляет кэш, является гораздо более «открытой», чем с помощью AppCache, поэтому преобразование кэширования работника службы в эквивалентные события AppCache не всегда возможно.
В целом, однако, Вот две вещи, которые могут помочь:
Читайте о Service Worker Lifecycle . Некоторые события, которые могут вас заинтересовать, могут быть аппроксимированы путем прослушивания эквивалентных изменений в жизненном цикле работника сервиса. Например, если вы предварительно кэшируете некоторые URL-адреса во время установки работника службы , то вновь зарегистрированный работник службы, выходящий из состояния installing
, будет приблизительно эквивалентен тому, когда манифест AppCache завершит кэширование. Аналогичным образом, если вы обнаружите, когда происходит обновление ранее зарегистрированного работника службы (и это обновление связано с изменением в списке URL-адресов для предварительного кэширования), то это примерно соответствует обновлению манифеста AppCache.
Если ваш сервисный работник использует кэширование во время выполнения, когда URL-адреса добавляются в кэш внутри обработчика fetch
, вы можете использовать следующую технику, чтобы сообщать страницам вашего клиента, когда новые элементы были кэшированы, используя postMessage()
для связи.
Часть вашего работника службы JavaScript:
const cacheAddAndNotify = async (cacheName, url) => {
const cache = await caches.open(cacheName);
await cache.add(url);
const clients = await self.clients.matchAll();
for (const client of clients) {
client.postMessage({cacheName, url});
}
};
self.addEventListener('fetch', (event) => {
// Use cacheAddAndNotify() to add to your cache and notify all clients.
});
Часть веб-приложения JavaScript:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.addEventListener('message', (event) => {
const {cacheName, url} = event.data;
// cacheName and url represent the entry that was just cached.
});
}
Опять же, специфика того, что вы слушаете и как вы реагируете на него, действительно будет зависеть от того, какие именно логики c есть у вашего работника службы. Не ожидайте, что между всеми событиями будет отображение 1: 1. Вместо этого используйте эту миграцию как возможность подумать о том, какие изменения, связанные с кэшем, вас действительно волнуют, и сосредоточиться на их прослушивании (через события жизненного цикла работника службы или postMessage()
связь).