Процесс автоматического обновления работника сервиса
У меня есть сомнения по поводу процесса обновления работника службы. В моем проекте есть 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:
- события push и sync (но я их не реализую)
- Вызов.register() только если URL-адрес работника службы изменился (но в моем случае это невозможно, поскольку sw_main.js кэшируется, поэтому я не могу изменить URL-адрес SW)
- переход на страницу в области видимости (я думаю, что у нас та же проблема с кешем из пункта 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. Если в этом файле есть только одно небольшое изменение, он будет считаться новой версией. Так что это подтверждает мой предыдущий вопрос! Я попробую!
Если это работает, второе решение является лучшим