По умолчанию - как сейчас - в целом безопаснее и не заставляет всех придумывать всевозможные решения.
- Пользователь загружает страницу с main1.js, SWv1 регистрируется через 1 секунду, сайт теперь полностью кэширован
- Пользователь снова загружает страницу - на этот раз из кеша SWv1, очень быстро. Новый SWv2 регистрируется через 1 секунду, кэширует новые активы (main1.js теперь main2.js), получает управление через skipWaiting и clientsClaim
Теперь могут произойти две вещи:
Страница загрузилась с main1.js, и браузер выполнил все, что сказал этот скрипт. Пользователь взаимодействовал со страницей и т. Д. На странице запущен файл main1.js, который ожидает общения с SWv1, но на самом деле SW в контроле - SWv2. Сценарий main1.js может отправлять сообщения и пытаться взаимодействовать с программным обеспечением так, чтобы это понимал только SWv1, но v2 не имеет никакого представления об этом. Теперь страница разрывается из-за несоответствия.
SWv1 кэшировал все ресурсы, которые нужны сайту v1. Таким образом, если main1.js должен что-то лениво загружать и т. Д., Когда пользователь взаимодействует со страницей, браузер получит это из кэша. Поскольку SWv2 взял на себя управление и кэшировал свое представление об активах (теперь это более новые активы), когда main1.js пытается выполнить отложенную загрузку чего-то, что первоначально кэшировалось SWv1, это не найдено. Кроме того, поскольку теперь это новое развертывание, актив больше не находится на HTTP-сервере. Это было бы в кэш-памяти, обработанной SWv1, но SWv2 не знает об этом. SWv2 знает о более новой версии этого файла. Разрывы страниц.
Важно понимать, что это может быть не так для каждой комбинации сайт / ПО. Если у вас очень мало логики в скрипте SW и main.js не слишком связывается с sw.js, можно создать комбинацию, в которой skipWaiting и clientsClaim не вызывают никаких проблем. Вы также можете кодировать таким образом, чтобы в случае возникновения ошибки вы показывали пользователю уведомление для обновления.