Подтвердить что ты не робот

Как обновить страницу после обновления ServiceWorker?

Я проконсультировался с большим количеством ресурсов для Рабочих Служб:

Однако я не могу на всю жизнь выяснить, как обновить страницу после установки нового 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), но в моей текущей реализации пользователь постоянно застрял на старой версии страницы, если они не жестко обновляют или не вручную очистить все их данные.:/

4b9b3361

Ответ 3

В Chrome Canary вы можете выполнять профилирование и управление профилей Service Worker как незарегистрированный, на вкладке "Приложения":

введите описание изображения здесь

Сопоставьте это с помощью chrome://devices/для отладки с вашим физическим устройством.