Оффлайн Готов, используя Сервисный работник

Я недавно создал автономное первое приложение, используя appcache, и хотел преобразовать его в сервис-работника (все мои клиенты используют последнюю версию Chrome, поэтому у меня нет проблем с совместимостью браузера).

Я использую sw-precache для генерации сервисного работника, который кэширует мои локальные ресурсы (в частности, мои html / css / fonts, а также некоторые js), и похоже, что когда сервисный работник устанавливает, он успешно добавляет все активы кэшировать хранилище, и оно успешно запускается (установить и активировать как fire, так и успешно завершить. И у меня есть self.skipWaiting() в конце события install, чтобы запустить сервис-работника (что он также успешно делает)).

Проблема в том, что событие "fetch", похоже, никогда не срабатывает. Таким образом, если я перехожу в автономный режим или открываю браузер (пока он не в сети) и перехожу на сайт, я получаю офлайн-динозавра Chrome. Когда я смотрю на вкладку сети, кажется, что браузер пытается получить доступ к серверу, чтобы получить страницы. Я не уверен, что я делаю неправильно, и я не касался метода fetch, сгенерированного утилитой sw-precache... поэтому я не уверен, что мне не хватает. Любая помощь будет принята с благодарностью. Мое событие извлечения ниже:

self.addEventListener('fetch', function(event) {
  if (event.request.method === 'GET') {
     var urlWithoutIgnoredParameters = stripIgnoredUrlParameters(event.request.url,
  IgnoreUrlParametersMatching);

var cacheName = AbsoluteUrlToCacheName[urlWithoutIgnoredParameters];
var directoryIndex = 'index.html';
if (!cacheName && directoryIndex) {
  urlWithoutIgnoredParameters = addDirectoryIndex(urlWithoutIgnoredParameters, directoryIndex);
  cacheName = AbsoluteUrlToCacheName[urlWithoutIgnoredParameters];
}

var navigateFallback = '';
// Ideally, this would check for event.request.mode === 'navigate', but that is not widely
// supported yet:
// https://code.google.com/p/chromium/issues/detail?id=540967
// https://bugzilla.mozilla.org/show_bug.cgi?id=1209081
if (!cacheName && navigateFallback && event.request.headers.has('accept') &&
    event.request.headers.get('accept').includes('text/html') &&
    /* eslint-disable quotes, comma-spacing */
    isPathWhitelisted([], event.request.url)) {
    /* eslint-enable quotes, comma-spacing */
  var navigateFallbackUrl = new URL(navigateFallback, self.location);
  cacheName = AbsoluteUrlToCacheName[navigateFallbackUrl.toString()];
}

if (cacheName) {
  event.respondWith(
    // Rely on the fact that each cache we manage should only have one entry, and return that.
    caches.open(cacheName).then(function(cache) {
      return cache.keys().then(function(keys) {
        return cache.match(keys[0]).then(function(response) {
          if (response) {
            return response;
          }
          // If for some reason the response was deleted from the cache,
          // raise and exception and fall back to the fetch() triggered in the catch().
          throw Error('The cache ' + cacheName + ' is empty.');
        });
      });
    }).catch(function(e) {
      console.warn('Couldn\'t serve response for "%s" from cache: %O', event.request.url, e);
      return fetch(event.request);
    })
  );
}

}});

0 ответов

Другие вопросы по тегам