У меня есть это одностраничное приложение с динамическим URL-адресом, созданным с помощью токена, например example.com/XV252GTH
, и различных ресурсов, таких как css, favicon и т. Д.
Вот как я регистрирую сервисного работника:
navigator.serviceWorker.register('sw.js');
И в указанном sw.js
я предварительно кеширую ресурсы при установке:
var cacheName = 'v1';
var cacheAssets = [
'index.html',
'app.js',
'style.css',
'favicon.ico'
];
function precache() {
return caches.open(cacheName).then(function (cache) {
return cache.addAll(cacheAssets);
});
}
self.addEventListener('install', function(event) {
event.waitUntil(precache());
});
Обратите внимание, что страница index.html
(которая регистрирует Service Worker) является просто шаблоном, который заполняется на сервере перед отправкой клиенту; поэтому на этом этапе предварительного кэширования я кеширую только шаблон, а не страницу.
Теперь в событии выборки любой запрошенный ресурс, которого нет в кэше, копируется в него:
addEventListener('fetch', event => {
event.respondWith(async function() {
const cachedResponse = await caches.match(event.request);
if (cachedResponse) return cachedResponse;
return fetch(event.request).then(updateCache(event.request));
}());
});
Использование этой функции обновления
function updateCache(request) {
return caches.open(cacheName).then(cache => {
return fetch(request).then(response => {
const resClone = response.clone();
if (response.status < 400)
return cache.put(request, resClone);
return response;
});
});
}
На этом этапе все ресурсы находятся в кэше, но не динамически генерируемая страница. Только после перезагрузки я могу увидеть другую запись в кеше: /XV252GTH
. Теперь , приложение готово к работе в автономном режиме; Но такая перезагрузка страницы как бы наносит ущерб всей цели Service Worker.
Вопрос: Как я могу отправить запрос (/XV252GTH
) с клиента (страницы, на которой регистрируется работник) на ПО? Я думаю, я могу настроить слушателя в sw.js
self.addEventListener('message', function(event){
updateCache(event.request)
});
Но как я могу быть уверен, что оно будет выполнено вовремя, то есть отправлено клиентом после завершения установки ПО? Что такое хорошая практика в этом случае?