Прогрессивное веб-приложение не работает в автономном режиме ошибка

Я написал прогрессивное веб-приложение, следуя всем доступным руководствам и примерам, но по какой-то причине, когда я нажимаю кнопку Add to homescreen, я продолжаю получать эту загадочную ошибку:

Site cannot be installed: does not work offline

Основное различие между моим PWA и примерами заключается в том, что мой работает исключительно на некорневом пути домена, поэтому мне пришлось добавить дополнительные пути к конфигурациям в разных местах, чтобы приложение было ограничено некорневым папка.

Сайт Google Lighthouse тоже не очень помогает, он дает очень похожее сообщение.

Может ли кто-нибудь подсказать, чем может быть вызвана эта ошибка?


person StampyCode    schedule 03.10.2017    source источник


Ответы (2)


Так что у меня ушло несколько часов, но в конце концов я понял, что есть обязательный параметр scope, который вам нужно указать в клиентском JavaScript при подключении к серверу, если он не работает по корневому (/) пути.

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('sw.js?v2', {
        scope: '.' // <--- THIS BIT IS REQUIRED
    }).then(function(registration) {
        // Registration was successful
        console.log('ServiceWorker registration successful with scope: ', registration.scope);
    }, function(err) {
        // registration failed :(
        console.log('ServiceWorker registration failed: ', err);
    });
}

Посмотреть рабочий продукт можно здесь:

Надеюсь, моя боль поможет кому-нибудь еще немного сэкономить.

person StampyCode    schedule 03.10.2017
comment
Этого не требуется. Но похоже, что вы «переносите» свой PWA в эту папку. Итак, вам нужно было его охватить. Причина, по которой вы получили эту ошибку, заключается в том, что для этой области не существовало обработчика событий извлечения работника службы. В этом сообщении говорится об этом требовании: love2dev.com/blog/ - person Chris Love; 06.10.2017
comment
Это просто не задокументированное требование (даже на вашем сайте), что при определении области действия приложения вам необходимо указать область действия в вызывающем скрипте, добавление области в манифест не работает, вызов serviceWorker в коде веб-сайта по умолчанию в корневую область и игнорирует манифест. Откровенно говоря, это может быть ошибка в реализации ServiceWorker. Если все файлы моего веб-сайта хранятся в относительном каталоге, не должно быть никаких требований для абсолютного определения области действия приложения, это просто препятствует развертыванию во вторичном расположении. - person StampyCode; 07.10.2017
comment
@ChrisLove на самом деле, я только что обнаружил, что вы можете установить область действия на ., и это работает. Таким образом, хотя этот параметр по-прежнему требуется в моем клиентском скрипте, теперь он, по крайней мере, может игнорировать абсолютный путь. - person StampyCode; 07.10.2017
comment
Service Worker и веб-манифест не зависят друг от друга. Вы можете иметь одно без другого. Область в манифесте предназначена для навигационных целей. Определяет область навигации в контексте приложения этого веб-приложения. Это в основном ограничивает, какие веб-страницы можно просматривать во время применения манифеста. Если пользователь перемещается по приложению за пределы области видимости, оно возвращается к нормальной веб-странице. developer.mozilla.org/en-US/docs/Web/Manifest - person Chris Love; 07.10.2017
comment
По какой-то причине (stampy.me/pwgen) сейчас он не работает в автономном режиме. Выдает ошибку, что сайт недоступен. Я использую macOS и Chrome 67. - person Hassan; 08.07.2018
comment
stampy.me/pwgen не работает в автономном режиме в Windows10 + Chrome 73. Это показывает, что типичный веб-сайт с ошибкой не может быть достигнут. Есть подсказка? - person LuBre; 20.03.2019
comment
Также проверял автономный статус сейчас и получил автономную ошибку, так как мой PWA также не хочет работать в автономном режиме - person deanwilliammills; 25.06.2019
comment
Я слепо скопировал ваш ответ в свой проект, и он сломал мой кеш. Когда вы устанавливаете область видимости в manifest.json, не устанавливайте ее при регистрации сервис-воркера. - person Konrad Linkowski; 20.08.2019

Обновлять:

Похоже, что Google тоже воспользовался быстрым взломом, и предупреждение вернулось.

Итак, начиная с Chrome93 (AUG-2021) быстрый взлом больше не будет работать:

self.addEventListener('fetch', function(event) {})

Решение работает на данный момент (поскольку мы никогда не знаем, какие требования Google добавит позже)

Я нашел хорошую статью, в которой есть несколько решений, первое, что предлагает автор, - это стратегия Network-Falling-Back-To-Cache:

Ваш сервисный работник сначала попытается получить ресурс с вашего сервера. Затем, когда он не может этого сделать - например, потому что вы не в сети - извлеките его из кеша (если он там существует).

   self.addEventListener('fetch', function(event) {
   event.respondWith(async function() {
      try{
        var res = await fetch(event.request);
        var cache = await caches.open('cache');
        cache.put(event.request.url, res.clone());
        return res;
      }
      catch(error){
        return caches.match(event.request);
       }
     }());
 });

Вы можете найти всю информацию и альтернативные решения в статье:

https://javascript.plainenglish.io/your-pwa-is-going-to-break-in-august-2021-34982f329f40

Надеюсь, это поможет будущим посетителям.

Оригинальный ответ:

Также вам нужно определить fetch слушателя в файле сервис-воркера:

this.addEventListener('fetch', function (event) {
    // it can be empty if you just want to get rid of that error
});
person mixel    schedule 23.04.2018
comment
Это исправило все, что было во мне - person Gino; 10.11.2020
comment
@mixel Похоже, Google подцепил этот взлом, и он больше не будет работать, публикуя обновление об этом - person Bart Mommens; 26.03.2021