Это руководство посвящено критическим изменениям, внесенным в Workbox v3, и содержит примеры того, какие изменения необходимо внести при обновлении с установки Workbox v2.
Если вы в настоящее время используете устаревшую комбинацию sw-precache
/ sw-toolbox
и хотите впервые перейти на Workbox, вот другое руководство по миграции , которое вам поможет.
v3 фон
Версия Workbox v3 представляет собой значительный рефакторинг существующей кодовой базы. Главными целями являются:
- Уменьшите размер рабочей области. Объем загружаемого и выполняемого кода среды выполнения Service Worker был уменьшен. Вместо того, чтобы включать всех в монолитный пакет, во время выполнения будет импортироваться только код для конкретных функций, которые вы используете.
- Workbox имеет CDN. Мы предоставляем полностью поддерживаемый хостинг CDN на базе Google Cloud Storage в качестве канонического варианта доступа к библиотекам времени выполнения Workbox, что упрощает запуск и работу с Workbox.
- Улучшенная отладка и журналы. Значительно улучшены возможности отладки и ведения журнала. Журналы отладки включены по умолчанию всякий раз, когда Workbox используется из
localhost
источника, а все журналы и утверждения удаляются из производственных сборок. - Улучшен плагин веб-пакета.
workbox-webpack-plugin
более тесно интегрируется с процессом сборки веб-пакета, позволяя использовать вариант без настройки, когда вы хотите предварительно кэшировать все ресурсы в конвейере сборки.
Достижение этих целей и исправление некоторых аспектов предыдущего интерфейса, которые казались неудобными или приводили к антипаттернам, потребовали внесения ряда критических изменений в версию v3.
Критические изменения
Конфигурация сборки
Следующие изменения влияют на поведение всех наших инструментов сборки ( workbox-build
, workbox-cli
, workbox-webpack-plugin
), которые имеют общий набор параметров конфигурации.
- Имя
'fastest'
обработчика ранее было действительным и рассматривалось как псевдоним для'staleWhileRevalidate'
при настройкеruntimeCaching
. Он больше не действителен, и разработчикам следует напрямую перейти на использование'staleWhileRevalidate'
. - Были обновлены имена нескольких свойств
runtimeCaching.options
, а также введена дополнительная проверка параметров, которая приведет к сбою сборки, если используется недопустимая конфигурация. См. документацию поruntimeCaching
для получения списка поддерживаемых в настоящее время опций.
синхронизация фона рабочей области
- Параметр конфигурации
maxRetentionTime
теперь интерпретируется как количество минут, а не как количество миллисекунд. - Теперь существует обязательная строка, представляющая имя очереди, которую необходимо передать в качестве первого параметра при создании плагина или автономного класса. (Ранее оно было передано как свойство параметров.) Обновленную поверхность API см. в документации .
обновление рабочего ящика-вещания-кэша
- Теперь существует обязательная строка, представляющая имя канала, которую необходимо передать в качестве первого параметра при создании плагина или автономного класса.
Например, в версии 2 вы инициализируете класс плагина следующим образом:
new workbox.broadcastCacheUpdate.BroadcastCacheUpdatePlugin({
channelName: 'cache-updates',
headersToCheck: ['etag'],
});
Эквивалентное использование в v3:
new workbox.broadcastUpdate.Plugin('cache-updates', {headersToCheck: ['etag']});
Обратитесь к документации по обновленной поверхности API.
сборка рабочего ящика
- По умолчанию сопоставление с шаблоном
glob
теперь будет выполняться со следующими параметрамиfollow: true
(который будет следовать за символическими ссылками) иstrict: true
(который менее толерантен к «необычным» ошибкам). Вы можете отключить любой из них и вернуться к предыдущему поведению, установивglobFollow: false
и/илиglobStrict: false
в конфигурации сборки. - Все функции в
workbox-build
возвращают дополнительное свойствоwarnings
в возвращаемых ими ответах. Некоторые сценарии, которые в версии 2 рассматривались как фатальные ошибки, теперь разрешены, но о них сообщается черезwarnings
, которые представляют собой массив строк.
В версии 2 вы можете generateSW
следующим образом:
const workboxBuild = require('workbox-build');
workboxBuild.generateSW({...})
.then(({count, size}) => console.log(`Precached ${count} files, totaling ${size} bytes.`))
.catch((error) => console.error(`Something went wrong: ${error}`));
Хотя вы можете использовать тот же код в версии 3, рекомендуется проверять наличие warnings
и регистрировать их:
const workboxBuild = require('workbox-build');
workboxBuild.generateSW({...})
.then(({count, size, warnings}) => {
for (const warning of warnings) {
console.warn(warning);
}
console.log(`Precached ${count} files, totalling ${size} bytes.`);
})
.catch((error) => console.error(`Something went wrong: ${error}`));
- Разработчикам, которые написали свои собственные функции
ManifestTransform
в v2, необходимо вернуть массив манифеста в объекте (т.е. вместоreturn manifestArray;
вы должны использоватьreturn {manifest: manifestArray};
).mЭто позволяет вашему плагину включать необязательное свойствоwarnings
, которое должен быть массивом строк, содержащих нефатальную предупреждающую информацию.
Если вы писали собственный ManifestTransform
в версии 2, используйте такой код:
const cdnTransform = manifestEntries => {
return manifestEntries.map(entry => {
const cdnOrigin = 'https://example.com';
if (entry.url.startsWith('/assets/')) {
entry.url = cdnOrigin + entry.url;
}
return entry;
});
};
имеет эквивалент v3:
const cdnTransform = manifestEntries => {
const manifest = manifestEntries.map(entry => {
const cdnOrigin = 'https://example.com';
if (entry.url.startsWith('/assets/')) {
entry.url = cdnOrigin + entry.url;
}
return entry;
});
return {manifest, warnings: []};
};
- Функция
getFileManifestEntries()
была переименована вgetManifest()
, а возвращаемое обещание теперь включает дополнительную информацию о предварительно кэшированных URL-адресах.
Код, подобный следующему в версии 2:
const manifestEntries = await workboxBuild.getFileManifestEntries({...});
можно переписать в v3 как:
const {manifestEntries, count, size, warnings} = await workboxBuild.getManifest({...});
// Use manifestEntries like before.
// Optionally, log the new info returned in count, size, warnings.
- Функция
generateFileManifest()
была удалена. Разработчикам рекомендуется вместо этого вызыватьgetManifest()
и использовать его ответ для записи данных на диск в соответствующем формате.
срок действия кэша рабочего ящика
- API плагина остался прежним, и именно этот режим в конечном итоге будет использовать большинство разработчиков. Однако есть существенные изменения API, влияющие на разработчиков, использующих его как отдельный класс. Обратитесь к документации по обновленной поверхности API.
рабочий ящик-кли
Разработчики могут запускать CLI с флагом --help
для получения полного набора поддерживаемых параметров.
- Поддержка псевдонима
workbox-cli
для двоичного сценария удалена. Доступ к двоичному файлу теперь возможен только какworkbox
. - Команды v2generate
generate:sw
иinject:manifest
были переименованыgenerateSW
иinjectManifest
в v3. - В версии 2 предполагалось, что файл конфигурации по умолчанию (используемый, если он не был указан явно) —
workbox-cli-config.js
в текущем каталоге. В версии 3 этоworkbox-config.js
.
В совокупности это означает, что в версии 2:
$ workbox inject:manifest
запустит процесс сборки «внедрить манифест», используя конфигурацию, считанную из workbox-cli-config.js
, и в версии 3:
$ workbox injectManifest
сделает то же самое, но прочитает конфигурацию из workbox-config.js
.
предварительное кэширование рабочего ящика
- Метод
precache()
ранее выполнял как модификации кэша, так и настройку маршрутизации для обслуживания кэшированных записей. Теперьprecache()
изменяет только записи кэша, а новый методaddRoute()
предназначен для регистрации маршрута для обслуживания этих кэшированных ответов. Разработчики, которым нужна предыдущая функциональность «два в одном», могут переключиться на вызовprecacheAndRoute()
. - Несколько параметров, которые раньше настраивались через конструктор
WorkboxSW
теперь передаются в качестве параметраoptions
вworkbox.precaching.precacheAndRoute([...], options)
. Значения по умолчанию для этих параметров, если они не настроены, перечислены в справочной документации . - По умолчанию URL-адреса, у которых нет расширения файла, автоматически проверяются на соответствие записи кэша, содержащей расширение
.html
. Например, если делается запрос для/path/to/index
(который не предварительно кэширован) и существует предварительно кэшированная запись для/path/to/index.html
, эта предварительно кэшированная запись будет использоваться. Разработчики могут отключить это новое поведение, установив{cleanUrls: false}
при передаче параметров вworkbox.precaching.precacheAndRoute()
. -
workbox-broadcast-update
больше не будет автоматически настраиваться для объявления обновлений кэша для предварительно кэшированных ресурсов.
Следующий код в v2:
const workboxSW = new self.WorkboxSW({
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
precacheChannelName: 'precache-updates',
});
workboxSW.precache([...]);
имеет эквивалент v3:
workbox.precaching.addPlugins([
new workbox.broadcastUpdate.Plugin('precache-updates')
]);
workbox.precaching.precacheAndRoute([...], {
cleanUrls: false,
directoryIndex: 'index.html',
ignoreUrlParametersMatching: [/^utm_/],
});
маршрутизация рабочего ящика
- Разработчикам, которые ранее использовали
workbox-routing
через пространство именworkbox.router.*
объекта WorkboxSW, необходимо переключиться на новое пространство имен,workbox.routing.*
. - Маршруты теперь оцениваются в порядке первых зарегистрированных побед. Это порядок оценки
Route
, противоположный тому, который использовался в версии 2, где приоритет будет отдаваться последнему зарегистрированномуRoute
. - Класс
ExpressRoute
и поддержка подстановочных знаков в стиле Express были удалены . Это значительно уменьшает размерworkbox-routing
. Строки, используемые в качестве первого параметра дляworkbox.routing.registerRoute()
теперь будут рассматриваться как точные совпадения. Подстановочные знаки или частичные совпадения должны обрабатываться с помощьюRegExp
— использование любогоRegExp
, совпадающего с частью или всем URL-адресом запроса, может инициировать маршрут. - Вспомогательный метод
addFetchListener()
классаRouter
был удален. Разработчики могут либо явно добавить свой собственный обработчикfetch
, либо использовать интерфейс, предоставляемыйworkbox.routing
, который неявно создаст для них обработчикfetch
. - Методы
registerRoutes()
иunregisterRoutes()
были удалены. Версии этих методов, которые работают с однимRoute
не были изменены, и разработчикам, которым необходимо зарегистрировать или отменить регистрацию нескольких маршрутов одновременно, вместо этого следует выполнить серию вызовов методаregisterRoute()
илиunregisterRoute()
.
Следующий код в v2:
const workboxSW = new self.WorkboxSW();
workboxSW.router.registerRoute(
'/path/with/.*/wildcard/',
workboxSW.strategies.staleWhileRevalidate()
);
workboxSW.router.registerRoute(
new RegExp('^https://example.com/'),
workboxSW.strategies.networkFirst()
);
имеет эквивалент v3:
workbox.routing.registerRoute(
new RegExp('^https://example.com/'),
workbox.strategies.networkFirst()
);
workbox.routing.registerRoute(
new RegExp('^/path/with/.*/wildcard'),
workbox.strategies.staleWhileRevalidate()
);
стратегии рабочего ящика (ранее известные как кэширование времени выполнения рабочего ящика)
- Модуль
workbox-runtime-caching
теперь официально известен какworkbox-strategies
и опубликован наnpm
под новым названием. - Использование срока действия кэша в стратегии без указания имени кэша больше недопустимо. В v2 это было возможно:
workboxSW.strategies.staleWhileRevalidate({
cacheExpiration: {maxEntries: 50},
});
Это приведет к истечению срока действия записей в кэше по умолчанию, что является неожиданным. В v3 требуется имя кэша:
workboxSW.strategies.staleWhileRevalidate({
cacheName: 'my-cache',
plugins: [new workbox.expiration.Plugin({maxEntries: 50})],
});
- Метод жизненного цикла
cacheWillMatch
был переименован вcachedResponseWillBeUsed
. Это не должно быть заметным изменением для разработчиков, если только они не написали свои собственные плагины, реагирующиеcacheWillMatch
. - Изменился синтаксис указания плагинов при настройке стратегии. Каждый плагин должен быть явно указан в свойстве
plugins
конфигурации стратегии.
Следующий код в v2:
const workboxSW = new self.WorkboxSW();
const networkFirstStrategy = workboxSW.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
cacheExpiration: {
maxEntries: 50,
},
cacheableResponse: {
statuses: [0, 200],
},
});
имеет эквивалент v3:
const networkFirstStrategy = workbox.strategies.networkFirst({
cacheName: 'my-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.Plugin({maxEntries: 50}),
new workbox.cacheableResponse.Plugin({statuses: [0, 200]}),
],
});
Вы можете узнать больше в руководстве « Использование плагинов ».
рабочий ящик-программное обеспечение
- «Под капотом
workbox-sw
был переписан и стал облегченным интерфейсом «загрузчика», который требует некоторой базовой настройки и отвечает за подключение других модулей, необходимых во время выполнения. Вместо создания нового экземпляра классаWorkboxSW
разработчики будут взаимодействовать с существующим экземпляром, который автоматически отображается в глобальном пространстве имен.
Ранее в версии 2:
importScripts('<path to workbox-sw>/importScripts/workbox-sw.prod.v2.1.3.js');
const workbox = new WorkboxSW({
skipWaiting: true,
clientsClaim: true,
// etc.
});
workbox.router.registerRoute(...);
В v3 вам просто нужно импортировать скрипт workbox-sw.js
, и готовый к использованию экземпляр будет автоматически доступен в глобальном пространстве имен как workbox
:
importScripts('<path to workbox-sw>/3.0.0/workbox-sw.js');
// workbox is implicitly created and ready for use.
workbox.routing.registerRoute(...);
skipWaiting
иclientsClaim
больше не являются параметрами, передаваемыми конструкторуWorkboxSW
. Вместо этого они были заменены методамиworkbox.clientsClaim()
иworkbox.skipWaiting()
.- Параметр
handleFetch
, который ранее поддерживался в конструкторе версии 2, больше не поддерживается в версии 3. Разработчики, которым нужна аналогичная функциональность для тестирования своего сервис-воркера без вызова обработчиков выборки, могут использовать опцию « Обход сети », доступную в инструментах разработчика Chrome.
рабочийбокс-webpack-плагин
Плагин был существенно переписан и во многих случаях может использоваться в режиме «нулевой настройки». Обратитесь к документации по обновленной поверхности API.
- API теперь предоставляет два класса:
GenerateSW
иInjectManifest
. Это делает переключение между режимами явным, по сравнению с поведением версии 2, где поведение менялось в зависимости от присутствияswSrc
. - По умолчанию ресурсы в конвейере компиляции веб-пакета будут предварительно кэшированы, и настраивать
globPatterns
больше не требуется. Единственная причина продолжать использоватьglobPatterns
— это если вам нужно предварительно кэшировать ресурсы, которые не включены в сборку вашего веб-пакета. В общем, при переходе на плагин v3 вам следует начать с удаления всей вашей предыдущей конфигурации на основеglob
и добавлять ее заново только в том случае, если она вам особенно нужна.
Получение помощи
Мы ожидаем, что большинство миграций будут простыми. Если у вас возникнут проблемы, не описанные в этом руководстве, сообщите нам об этом, открыв проблему на GitHub.