Проверка обновлений сервис-воркеров в одностраничном приложении

У нас есть приложение сигнальной страницы, в котором установлен и активен Service worker.

Теперь наш сервер перестраивает приложение, файл Service worker обновляется на стороне сервера.

Наш клиент ничего не знает об этом новом файле Service worker, и он все еще использует старый файл Service worker.

Когда это работает? если я обновляю / перезагружаю приложение, устанавливается новый сервисный работник.

Как мы можем обновить клиент, если файл сервис-воркера обновляется на сервере, а клиент не перезагружается?

Возможное решение: я думаю, мне нужно провести опрос через час или около того.


person Sandeep Sharma    schedule 08.08.2018    source источник
comment
Вы доставляете файл SW.js с заголовками HTTP-Cache? Я думаю, что он должен пытаться обновлять (запрос с сервера) при каждой загрузке страницы, но, возможно, он все еще получает старую версию из кеша браузера. См. stackoverflow.com/a/38854905/7362396   -  person Tobias K.    schedule 09.08.2018
comment
это одностраничное приложение, страница загружается только тогда, когда мы вручную обновляем или открываем новую вкладку.   -  person Sandeep Sharma    schedule 09.08.2018


Ответы (1)


Неявные обновления

"Жизненный цикл сервисного работника" - отличный ресурс для этих типов. вопросов.

В частности, есть раздел, посвященный обновлениям:

Запускается обновление:

  • При переходе на страницу в рамках исследования.
  • О функциональных событиях, таких как нажатие и синхронизация, если в течение предыдущих 24 часов не выполнялась проверка обновлений.
  • При вызове .register (), только если URL-адрес сервис-воркера изменился.

Явные обновления

Поскольку ваш SPA не использует настоящую навигацию, вы не получите автоматические проверки обновлений, упомянутые в первом пункте.

Вместо этого вы можете следовать примеру из далее в этом разделе.:

Как я упоминал ранее, браузер автоматически проверяет наличие обновлений после навигации и функциональных событий, но вы также можете запускать их вручную:

navigator.serviceWorker.register('/sw.js').then(reg => {
  // sometime later…
  reg.update();
});

Что я, вероятно, сделал бы, так это изменить маршрутизатор вашего SPA и автоматически вызывать reg.update() всякий раз, когда ваш маршрутизатор собирается переключиться на новое представление. Это имитирует то же поведение обновления при навигации, которое вы получили бы в не-SPA.

Какое место занимает register ()?

После того, как был сделан хотя бы один вызов navigator.serviceWorker.register(), сервисный работник может установить и активировать. На этом этапе проверки обновлений сервис-воркера будут происходить независимо от того, вызывается ли navigator.serviceWorker.register() снова или нет.

В предыдущих разделах этого ответа описывается, когда будут выполняться эти проверки обновлений, явно или неявно.

Вы можете углубиться в подробности этого, сравнив различия между Register и Обновить задания в спецификации сервис-воркера.

person Jeff Posnick    schedule 09.08.2018
comment
Спасибо, что объяснили это. Этот ответ получил ответ на мои 6 месяцев борьбы. Я добавил history.listener для проверки обновлений сервис-воркеров. Я реализовал поток, чтобы запросить у пользователя разрешение на перезагрузку приложения для получения последних обновлений на нескольких вкладках. Вы можете проверить мой код github.com/rahuls360/testing-sw - person Rahul Makhija; 13.09.2020