Я проконсультировался с большим количеством ресурсов для Рабочих Служб:
- Обновление вашего ServiceWorker
- ServiceWorker: Революция веб-платформы
- Джейк Арчибальд милый SVGOMG.
Однако я не могу на всю жизнь выяснить, как обновить страницу после установки нового ServiceWorker. Независимо от того, что я делаю, моя страница застряла в старой версии, и только жесткое обновление (Cmd-Shift-R) исправит его. Нет комбинации 1) закрытия вкладки, 2) закрытия Chrome, или 3) location.reload(true)
будет служить новому контенту.
У меня есть супер простой пример приложения, основанный на SVGOMG. При установке я кэширую кучу ресурсов с помощью cache.addAll()
, а также skipWaiting()
, если номер текущей версии текущей версии не совпадает с номером активной версии (на основе поиска IndexedDB):
self.addEventListener('install', function install(event) {
event.waitUntil((async () => {
var activeVersionPromise = localForage.getItem('active-version');
var cache = await caches.open('cache-' + version);
await cache.addAll(staticContent);
var activeVersion = await activeVersionPromise;
if (!activeVersion ||
semver.parse(activeVersion).major === semver.parse(version).major) {
if (self.skipWaiting) { // wrapping in an if while Chrome 40 is still around
self.skipWaiting();
}
}
})());
});
Я использую систему, основанную на семестре, где основной номер версии указывает, что новый ServiceWorker не может быть "с горячей заменой" для старого. Это работает на стороне ServiceWorker - bump от v1.0.0 до v1.0.1 заставляет работника быть немедленно установленным на обновление, тогда как с v1.0.0 до v2.0.0 он ожидает закрытия вкладки и ее повторного открытия установлен.
Вернуться в основной поток, я вручную обновляю ServiceWorker после регистрации – в противном случае на странице никогда не появляется заметка о наличии новой версии ServiceWorker (как ни странно, я так мало упоминал об этом в литературе ServiceWorker):
navigator.serviceWorker.register('/sw-bundle.js', {
scope: './'
}).then(registration => {
if (typeof registration.update == 'function') {
registration.update();
}
});
Однако содержимое, которое подается в основной поток, всегда застряло на старой версии страницы ( "Моя версия 1.0.0" ), независимо от того, увеличиваю ли я версию 1.0.1 или 2.0.0.
Я здесь как-то взволнован. Я надеялся найти элегантное решение semver-y для управления версиями ServiceWorker (отсюда и мое использование require('./package.json').version
), но в моей текущей реализации пользователь постоянно застрял на старой версии страницы, если они не жестко обновляют или не вручную очистить все их данные.:/