Процесс автоматического обновления работника сервиса

У меня есть сомнения по поводу процесса обновления работника службы. В моем проекте есть 2 файла, связанные с sw:

"sw.js", помещенный в корень сайта, НЕ будет кэшироваться (Cache API и веб-браузером).

Мой сервисный работник управляет кэшем всех статических файлов и всех страниц динамических URL.

Иногда мне нужно обновить его, и клиент должен обнаружить, что есть обновление, и сделать это немедленно.

"sw_main.js" - это скрипт, который устанавливает мой sw. Этот файл кэшируется Cache API, потому что мое приложение должно работать в автономном режиме.

Внутри мы можем найти:

var SW_VERSION = '1.2';
navigator.serviceWorker.register("sw.js?v=" + SW_VERSION, { scope: "/" }).then(....

Проблема заключается в том, что, поскольку sw_main.js кэшируется, если я изменю SW_VERSION, а затем разверну в сети веб-приложение, все клиенты не будут обновляться, поскольку не видят изменений в этом файле.

Каков наилучший способ управления процессом обновления ПО?

Как и сейчас, есть 3 способа запуска обновления SW:

  1. события push и sync (но я их не реализую)
  2. Вызов.register() только если URL-адрес работника службы изменился (но в моем случае это невозможно, поскольку sw_main.js кэшируется, поэтому я не могу изменить URL-адрес SW)
  3. переход на страницу в области видимости (я думаю, что у нас та же проблема с кешем из пункта 2)

Я также прочитал это: "Ваш сервисный работник считается обновленным, если он байтово отличается от того, который уже есть в браузере".

Это означает, что если я изменю содержимое файла sw.js (который не кэшируется), работник службы автоматически обнаружит обновление?

Спасибо

1 ответ

Решение

Я нашел 2 возможных решения.

Прежде всего, я хочу сказать, что лучше кэшировать (используя pwa Cache API) также файл sw.js, потому что когда вы не в сети, он будет запрашиваться sw_main.js.

ПЕРВЫЕ РЕШЕНИЯ:

Используйте кэш сервисного работника как запасной вариант и всегда пытайтесь выйти в сеть сначала через fetch(). Это только для sw.js и, возможно, sw_main.js. Вы теряете некоторые приросты производительности, которые предлагает стратегия с кэшированием, но размер файла js очень мал, поэтому я не думаю, что это большая проблема.

ВТОРОЕ РЕШЕНИЕ:

Если ваш кэшированный файл sw.js изменился? Мы можем подключиться к функции "onupdatefound" на зарегистрированном Service Worker. Несмотря на то, что вы можете кэшировать тонны файлов, Service Worker проверяет только хэш вашего зарегистрированного service-worker.js. Если в этом файле есть только одно небольшое изменение, он будет считаться новой версией. Так что это подтверждает мой предыдущий вопрос! Я попробую!

Если это работает, второе решение является лучшим

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