service worker не может кэшировать начальный URL-адрес

#progressive-web-apps #service-worker #lighthouse

#progressive-web-apps #service-worker #маяк

Вопрос:

Я поместил версию своего приложения PWA в https://www.example.com/app папка. Я попытался кэшировать начальную страницу, используя следующие форматы URL-адресов (один за другим в FILES_TO_CACHE), но ни один из них не работает

 "/"
"/app"
"/app/"
"/app/index.php"
"app"
"app/index.php"
"./"
"./app"
 

sw.js:

 const CACHE_NAME = 'static-cache-v1.2';
const DATA_CACHE_NAME = 'data-cache';

//Those tries and errors go here one by one
const FILES_TO_CACHE = [
    "/" 
];

self.addEventListener('install', (evt) => {
    console.log('[ServiceWorker] Install');
    evt.waitUntil(
        caches.open(CACHE_NAME).then((cache) => {
            console.log('[ServiceWorker] Pre-caching offline page');
            return cache.addAll(FILES_TO_CACHE);
        }).then(self.skipWaiting())
    );


});

self.addEventListener('activate', (evt) => {
    console.log('[ServiceWorker] Activate');

    evt.waitUntil(
        caches.keys().then((keyList) => {
            return Promise.all(keyList.map((key) => {
                if (key !== CACHE_NAME) {
                    console.log('[ServiceWorker] Removing old cache', key);
                    return caches.delete(key);
                }
            }));
        })
    );

    self.clients.claim();
});

self.addEventListener('fetch', (evt) => {
console.log('[ServiceWorker] Fetch', evt.request.url);
    evt.respondWith(

        caches.open(CACHE_NAME).then(cache => {
            return cache.match(evt.request).then(cacheResponse => cacheResponse || fetch(evt.request).then(networkResponse => {
                cache.put(evt.request, networkResponse.clone());
                return networkResponse;
            }));

        }))
});
 

Маяк Google Chrome сообщает:

start_url не отвечает 200 в автономном режиме

Кроме того, я должен сказать, что service worker успешно регистрируется, поскольку я получаю сообщение консоли, а также приложение имеет базовый URL, установленный в заголовке следующим образом:

 <base href="https://www.example.com/app/">
 

и это код, который я использую для регистрации service worker, размещенного в https://www.example.com/app/index.php и получения сообщения об успешном завершении в консоли:

 <script>
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('sw.js', {scope: '/app/'})
  .then((reg) => {
    console.log("Web workers work");
  }).catch((error) => {
    // registration failed
    console.log('Registration failed with '   error);
  });
}  else{
  console.log("No sw available");
  }

</script>
 

Комментарии:

1. когда вы пробуете свои разные версии, не забываете ли вы также обновлять свои CACHE_NAME , поскольку в противном случае вы не «очищаете кеш», поэтому все предыдущие ошибки будут перенесены.

2. Спасибо. Я пытался изменить имя кэша для каждого теста, но безуспешно. @GrahamRitchie

3. Можете ли вы поделиться своим кодом при регистрации service worker? и было бы хорошо, если бы вы могли разместить свое приложение, чтобы мы могли устранить проблему.

4. Я добавил регистрационный код в вопрос. Спасибо @VimalPatel

5. Используете ли вы manifest. файл webmanifest?