Существует два основных момента, которые необходимо уточнить для мгновенного обновления вашего ПО.
Вскоре
- Позвоните своему
sw.js
также из более часто посещаемых страниц, чем индекс страницы вашего приложения.
- Используйте метод
skipWaiting()
, чтобы активировать ваш SW мгновенно.
Подробнее
1) navigator.serviceWorker.register
вызова метода
Следует отметить, что новый verison от SW будет проверяться только на navigator.serviceWorker.register()
вызова.
И обычно метод register()
будет вызываться только на одной из ваших страниц. Если это так, вы должны добавить эту команду ко всем вашим страницам. Потому что, если пользователь просто открывает другое приложение, не закрывая PWA, а затем возвращается в ваше приложение, скажем, через 2 часа, он избежит страницы индекса приложения, где вероятно ваш register()
.
Итак, мое предложение - разместить его на многих страницах, если не каждый. Даунсайд клиентов будет делать гораздо больше звонков на sw.js
. Потенциал роста клиентов будет получать последнюю версию SW без потери времени.
2) Активация службы информацию работнику
activate
событий службы работника не будет вызываться, когда SW больше не имеет никакого активного clients. Таким образом, новая версия будет активирована только после каждого экземпляра приложения, но одна из них закрыта, а оставшаяся вкладка обновляется/одна вкладка снова открывается. См. quote from MDN по вопросу:
.. новая версия установлена в фоновом режиме, но еще не активирована. Он активируется только тогда, когда больше не загружаются страницы, которые все еще используют старого рабочего. Как только больше нет , такие страницы все еще загружаются, активируется новый рабочий.
И решение этой можно было бы использовать метод skipWaiting()
в сочетании с Clients.claim()
Пример использования тех взяты из MDN. Click to see more about it on that page:
self.addEventListener('install', function(event) {
event.waitUntil(self.skipWaiting());
});
self.addEventListener('activate', function(event) {
event.waitUntil(self.clients.claim());
});
Спасибо за сказанное выше, дело в том, что приложение представляет собой единую веб-страницу. Таким образом, у меня есть код, запускающий каждую загрузку, проблема в том, что рабочий сервис не проверяет немедленно при повторном открытии - не уверен, может ли это быть из-за того, что оболочка приложения кэшируется вместе с рабочим? –
Хорошо, тогда раздел * # 1 * не имеет отношения к вашей ситуации. Но вы внедрили решение на * # 2 *? Если так, то может произойти что-то еще. Когда вы обновляете кеш, он снова переустанавливает содержимое кеша. Итак, если у вас много кэшированных файлов, и если у клиента медленное соединение, потребуется некоторое время, чтобы загрузить все активы. И только после того, как все предметы будут загружены и вставлены в кеш, SW будет активирован. Если вы не указали выше, я могу взглянуть на вашу PWA, если она общедоступна. –