Каковы недостатки использования skipWaiting и clientsClaim с Workbox?
По умолчанию skipWaiting
имеет значение false в Workbox. Предполагая, что вы используете только созданный Workbox сервисный работник для кэширования, есть ли недостатки для установки этого значения в true? Без этого следующая сборка вашего приложения будет содержать обновленные URL-адреса ресурсов (из веб-пакета). Эти URL будут обновлены в манифесте предварительного кэширования работника службы, но без skipWaiting
обновленный сервисный работник не будет активирован, чтобы воспользоваться ими, пока пользователь не закроет свой браузер и не откроет снова.
Эти обновленные ресурсы будут загружены правильно (webpack загрузит ресурсы с новыми значениями хеша в них), но они никогда не будут кэшироваться до тех пор, пока пользователь снова не закроет все открытые браузеры, на которых работает сервисный работник, и не откроет заново. В этих условиях есть ли причина не просто установить skipWaiting
к правде?
Как связанный вопрос, что именно делает clientsClaim
контроль? Вышеуказанная проблема решается простым включением skipWaiting; так что делает клиенты Claim?
1 ответ
В качестве фона я бы порекомендовал прочитать " Жизненный цикл работника сервиса ". Это написано с точки зрения общего сервисного работника, но эти пункты относятся и к сервисным работникам на основе Workbox.
Workbox использует install
обработчик событий, чтобы добавить новые ресурсы во временный кеш, и он использует activate
обработчик событий для перемещения этих новых ресурсов в "активный" кэш, а также удаления всех URL, которые больше не перечислены в манифесте предварительного кэша.
Если skipWaiting
верно, то activate
Обработчик, отвечающий за очистку старых URL-адресов из кэша, будет выполнен сразу после установки обновленного сервисного работника.
В этих условиях есть ли причина не просто установить
skipWaiting
к правде?
Есть несколько рисков для использования skipWaiting
и, чтобы ошибиться, мы отключаем его по умолчанию в Workbox. (Это было включено по умолчанию в старых, sw-precache
работники сферы обслуживания.)
Давайте предположим сценарий, в котором ваш HTML загружается сначала в кэш (как правило, рекомендуется), а затем через некоторое время после этой загрузки обнаруживается обновление работника сервиса.
Риск 1: Ленивая загрузка отпечатков пальцев
Современные веб-приложения часто сочетают два метода: асинхронная отложенная загрузка ресурсов только при необходимости (например, переключение на новое представление в одностраничном приложении) и добавление отпечатков пальцев (хэшей) для уникальной идентификации URL-адресов на основе содержимого, которое они содержат.
Традиционно это либо сам HTML (либо некоторый JavaScript, содержащий информацию о маршруте, которая также загружается в начале жизненного цикла страницы), которая содержит ссылку на текущий список URL-адресов, которые необходимо загружать с отложенной загрузкой.
Предположим, что версия вашего веб-приложения, которая была изначально загружена (до обновления службы), считает, что URL /view-one.abcd1234.js
должен быть загружен, чтобы сделать /view-one
, Но в то же время вы развернули обновление для своего кода, и /view-one.abcd1234.js
был заменен на вашем сервере и в вашем предварительном кеше /view-one.7890abcd.js
,
Если skipWaiting
верно, то /view-one.abcd1234.js
будет очищен от кешей как часть activate
событие. Скорее всего, вы уже удалили его со своего сервера как часть своего развертывания. Так что этот запрос не удастся.
Если skipWaiting
ложь, то /view-one.abcd1234.js
будет по-прежнему доступен в ваших кешах, пока все открытые клиенты сервисного работника не будут закрыты. Обычно это то, что вы хотите.
Примечание. Хотя использование сервисного работника может повысить вероятность возникновения этого класса проблем, это проблема для всех веб-приложений, которые загружают версионные URL-адреса. У вас всегда должна быть обработка ошибок для обнаружения сбоев при отложенной загрузке и попыток восстановления путем, например, принудительной перезагрузки вашей страницы. Если у вас есть эта логика восстановления, и вы в порядке с этим UX, вы можете включить skipWaiting
тем не мение.
Риск 2: Ленивая загрузка несовместимой логики
Это похоже на первый риск, но применяется, когда у вас нет хеш-отпечатков в ваших URL. Если вы развернете обновление для своего HTML и соответствующее обновление для одного из ваших представлений, существующие клиенты могут прекратить отложенную загрузку версии /view-one.js
это не соответствует структуре HTML, который был извлечен из кэша.
Если skipWaiting
ложно, то это вряд ли произойдет, так как /view-one.js
загруженный из кеша должен соответствовать структуре HTML, загруженной из того же кеша. Вот почему это безопаснее по умолчанию.
Примечание. Как и раньше, этот риск не является уникальным для сервисных работников - любое веб-приложение, которое динамически загружает неверсионные URL-адреса, может в конечном итоге загрузить несовместимую логику после недавнего развертывания.
так что делает клиенты Claim?
clientsClaim
гарантирует, что все неконтролируемые клиенты (т. е. страницы), находящиеся в области действия, будут контролироваться работником сервиса сразу после его активации. Если вы не включите его, то они не будут контролироваться до следующей навигации.
Обычно безопаснее включить, чем skipWaiting
и может быть полезным, если вы хотите, чтобы работник службы начал заполнять кэши времени выполнения раньше, чем позже.
Я отошлю вас к разделу в документации Service Worker Lifecycle для получения дополнительной информации.