Миграция с Workbox v3 на v4,Миграция с Workbox v3 на v4

Это руководство посвящено критическим изменениям, внесенным в Workbox v4, и содержит примеры того, какие изменения необходимо внести при обновлении с Workbox v3.

Критические изменения

предварительное кэширование рабочего ящика

Соглашение об именах для предварительно кэшированных записей было обновлено. Теперь для записей, URL-адресам которых требуется информация о версии (т. е. тех записей, которые содержат поле revision в манифесте предварительного кэширования ), эта информация о версии будет храниться как часть ключа кэша в специальном параметре URL-запроса __WB_REVISION__ , добавленном к исходному URL-адресу. (Раньше эта информация хранилась отдельно от ключей кэша с помощью IndexedDB .)

Разработчикам, которые используют преимущества предварительного кэширования через workbox.precaching.precacheAndRoute() , что является наиболее распространенным вариантом использования, не нужно вносить какие-либо изменения в конфигурацию своего сервис-воркера; после обновления до Workbox v4 кэшированные ресурсы ваших пользователей будут автоматически перенесены в новый формат ключа кэша, и в дальнейшем предварительно кэшированные ресурсы будут продолжать обслуживаться так же, как и раньше.

Использование ключей кэша напрямую

Некоторым разработчикам может потребоваться прямой доступ к записям precache, вне контекста workbox.precaching.precacheAndRoute() . Например, вы можете предварительно кэшировать изображение, которое в конечном итоге будет использоваться в качестве «резервного» ответа, когда фактическое изображение невозможно получить из сети.

Если вы используете предварительно кэшированные ресурсы таким образом, начиная с Workbox v4, вам потребуется выполнить дополнительный шаг, чтобы преобразовать исходный URL-адрес в соответствующий ключ кэша, который можно использовать для чтения кэшированной записи. Это можно сделать, вызвав workbox.precaching.getCacheKeyForURL(originURL) .

Например, если вы знаете, что 'fallback.png' предварительно кэшируется:

const imageFallbackCacheKey =
  workbox.precaching.getCacheKeyForURL('fallback.png');

workbox.routing.setCatchHandler(({event}) => {
  switch (event.request.destination) {
    case 'image':
      return caches.match(imageFallbackCacheKey);
      break;
    // ...other fallback logic goes here...
  }
});

Очистка старых предварительно кэшированных данных

Изменения, внесенные в предварительное кэширование в Workbox v4, означают, что старые прекеши, созданные в предыдущих версиях Workbox, несовместимы. По умолчанию они остаются как есть, и если вы обновите Workbox v3 до Workbox v4, вы получите две копии всех предварительно кэшированных ресурсов.

Чтобы избежать этого, вы можете добавить вызов workbox.precaching.cleanupOutdatedCaches() напрямую к сервис-воркерам или установить новый параметр cleanupOutdatedCaches: true при использовании инструмента сборки в режиме GenerateSW . Поскольку логика очистки кэша использует соглашения об именовании кэша для поиска старых прекешей, а у разработчиков есть возможность переопределить эти соглашения, мы допустили ошибку в плане безопасности и не включили эту функцию по умолчанию.

Мы призываем разработчиков, которые сталкиваются с какими-либо проблемами при использовании этого метода (например, с ложными срабатываниями при удалении), сообщать нам об этом .

Использование заглавных букв параметра

Два необязательных параметра , которые можно передать в workbox.precaching.precacheAndRoute() и workbox.precaching.addRoute() были переименованы, чтобы стандартизировать наше общее соглашение о использовании заглавных букв. ignoreUrlParametersMatching теперь называется ignoreURLParametersMatching , а cleanUrls теперь называется cleanURLs .

стратегии рабочего ящика

Существует два примерно эквивалентных способа создания экземпляра обработчика в workbox-strategies . Мы отказываемся от фабричного метода в пользу явного вызова конструктора стратегии.

// This factory method syntax has been deprecated:
const networkFirstStrategy = workbox.strategies.networkFirst({...});

// Instead, use the constructor directly:
// (Note that the class name is Uppercase.)
const networkFirstStrategy = new workbox.strategies.NetworkFirst({...});

Хотя синтаксис фабричного метода продолжит работать в версии 4, при его использовании будет регистрироваться предупреждение, и мы рекомендуем разработчикам выполнить миграцию, прежде чем прекращать поддержку в будущем выпуске версии 5.

синхронизация фона рабочей области

Класс workbox.backgroundSync.Queue был переписан, чтобы предоставить разработчикам больше гибкости и контроля над тем, как запросы добавляются в очередь и воспроизводятся.

В версии 3 класс Queue имел единственный способ добавления запросов в очередь (метод addRequest() ), но не имел возможности изменять очередь или удалять запросы.

В версии 4 метод addRequests() был удален и добавлены следующие методы, подобные массивам:

  • pushRequest()
  • popRequest()
  • shiftRequest()
  • unshiftRequest()

В версии 3 класс Queue также принимал несколько обратных вызовов, которые позволяли наблюдать, когда запросы воспроизводятся ( requestWillEnqueue , requestWillReplay , queueDidReplay ), но большинство разработчиков обнаружили, что помимо наблюдения им нужен контроль над тем, как воспроизводится очередь, в том числе возможность динамически изменять, переупорядочивать или даже отменять отдельные запросы.

В версии 4 эти обратные вызовы были удалены в пользу одного обратного вызова onSync , который вызывается каждый раз, когда браузер предпринимает попытку воспроизведения. По умолчанию обратный вызов onSync вызывает replayRequests() , но если вам нужен больший контроль над процессом воспроизведения, вы можете использовать методы, подобные массиву, перечисленные выше, чтобы воспроизвести очередь так, как вам нравится.

Вот пример пользовательской логики воспроизведения:

const queue = new workbox.backgroundSync.Queue('my-queue-name', {
  onSync: async ({queue}) => {
    let entry;
    while ((entry = await this.shiftRequest())) {
      try {
        await fetch(entry.request);
      } catch (error) {
        console.error('Replay failed for request', entry.request, error);
        await this.unshiftRequest(entry);
        return;
      }
    }
    console.log('Replay complete!');
  },
});

Аналогично, класс workbox.backgroundSync.Plugin принимает те же аргументы, что и класс Queue (поскольку он создает экземпляр Queue внутри себя), поэтому он изменился таким же образом.

срок действия рабочего ящика

Пакет npm был переименован в workbox-expiration в соответствии с соглашением об именах, используемым для других модулей. Этот пакет функционально эквивалентен более старому пакету workbox-cache-expiration , который сейчас устарел.

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

Пакет npm был переименован в workbox-broadcast-update в соответствии с соглашением об именах, используемым для других модулей. Этот пакет функционально эквивалентен более старому пакету workbox-broadcast-cache-update , который сейчас устарел.

ядро рабочего ящика

В Workbox v3 степень детализации уровней журнала можно контролировать с помощью метода workbox.core.setLogLevel() , которому нужно передать одно из значений в перечислении workbox.core.LOG_LEVELS . Вы также можете прочитать текущий уровень журнала через workbox.core.logLevel .

В Workbox v4 все это было удалено, поскольку все современные инструменты разработчика теперь поставляются с широкими возможностями фильтрации журналов (см. фильтрацию вывода консоли для Chrome Dev Tools).

рабочий ящик-программное обеспечение

Два метода, которые ранее были доступны непосредственно в пространстве имен workbox (которое соответствует модулю workbox-sw ), вместо этого были перемещены в workbox.core . workbox.skipWaiting() стал workbox.core.skipWaiting() , а workbox.clientsClaim() стал workbox.core.clientsClaim() .

Конфигурация инструмента сборки

Изменилось наименование некоторых параметров, которые можно передать в workbox-cli, workbox-build или workbox-webpack-plugin. Всякий раз, когда в имени параметра использовалось «URL», оно устарело в пользу «URL». Это означает, что предпочтительны следующие имена опций:

  • dontCacheBustURLsMatching
  • ignoreURLParametersMatching
  • modifyURLPrefix
  • templatedURLs

Вариант имен этих параметров «URL» по-прежнему работает в версии 4, но приведет к появлению предупреждающего сообщения. Мы рекомендуем разработчикам выполнить миграцию до выпуска версии 5.

Новая функциональность

окно рабочего ящика

Новый модуль workbox-window упрощает процесс регистрации сервис-воркера и обнаружения обновлений, а также предоставляет стандартные средства связи между кодом, выполняющимся в сервис-воркере, и кодом, выполняющимся в контексте window вашего веб-приложения.

Хотя использование workbox-window не является обязательным, мы надеемся, что разработчики найдут его полезным, и рассмотрят возможность переноса части своей рукописной логики, чтобы использовать его при необходимости. Подробнее об использовании workbox-window вы можете узнать в руководстве по модулю .

Пример миграции

Пример реальной миграции с Workbox v3 на v4 можно найти в этом запросе на включение .

Получение помощи

Мы ожидаем, что большинство миграций будут простыми. Если у вас возникнут проблемы, не описанные в этом руководстве, сообщите нам об этом, открыв проблему на GitHub.