workbox-webpack-plugin представляет собой официальный
плагин Workbox для интеграции в сборочные системы на базе Webpack. Он
позволяет автоматически генерировать сервис-воркеры, настраивать
стратегии кэширования и оптимизировать работу с ресурсами приложения,
используя возможности Workbox, без необходимости ручного написания
сервис-воркера.
Для начала необходимо установить сам плагин через npm:
npm install workbox-webpack-plugin --save-dev
После установки плагин подключается в конфигурационный файл Webpack:
const { GenerateSW } = require('workbox-webpack-plugin');
module.exports = {
// Остальные настройки Webpack, такие как entry, output, loaders
plugins: [
new GenerateSW({
clientsClaim: true,
skipWaiting: true,
})
]
};
Ключевые параметры плагина:
clientsClaim: автоматически захватывает страницы после
обновления сервис-воркера.skipWaiting: позволяет новому сервис-воркеру
активироваться сразу, минуя фазу ожидания.Workbox предоставляет несколько плагинов для разных целей:
GenerateSW Генерирует полностью
готовый сервис-воркер с предустановленными стратегиями кэширования.
Используется для проектов с типичной конфигурацией кэширования, когда
нет необходимости ручного написания сервис-воркера.
InjectManifest Позволяет
использовать кастомный сервис-воркер и при этом интегрировать его с
Workbox. Плагин анализирует статические ресурсы и внедряет их в
сервис-воркер для кэширования.
Пример использования InjectManifest:
const { InjectManifest } = require('workbox-webpack-plugin');
module.exports = {
plugins: [
new InjectManifest({
swSrc: './src/custom-sw.js',
swDest: 'service-worker.js',
})
]
};
swSrc: путь к кастомному сервис-воркеру.swDest: имя итогового файла сервис-воркера в
сборке.Workbox позволяет задать различные стратегии кэширования для разных типов ресурсов. Основные стратегии:
Пример конфигурации для GenerateSW с кастомными
стратегиями:
new GenerateSW({
runtimeCaching: [
{
urlPattern: /\.(?:png|jpg|jpeg|svg)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 дней
},
},
},
{
urlPattern: new RegExp('/api/'),
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
expiration: {
maxEntries: 30,
maxAgeSeconds: 5 * 60, // 5 минут
},
},
},
],
});
runtimeCaching — массив правил для кэширования
динамических ресурсов.urlPattern — регулярное выражение или функция для
определения, какие ресурсы попадут под правило.handler — стратегия кэширования.options — дополнительные настройки, включая имя кэша,
время жизни и максимальное количество элементов.Плагин полностью интегрируется с жизненным циклом сборки Webpack:
emit плагин анализирует все файлы, включённые
в сборку.Пример использования с минификацией и chunk’ами:
new GenerateSW({
clientsClaim: true,
skipWaiting: true,
navigateFallback: '/index.html',
exclude: [/\.map$/, /asset-manifest\.json$/],
});
navigateFallback — позволяет указать fallback для SPA
при навигации.exclude — массив файлов и паттернов, которые не должны
включаться в precache.workbox-webpack-pluginInjectManifest можно полностью контролировать поведение
приложения offline, не теряя преимуществ Workbox.clientsClaim и
skipWaiting для обновления сервис-воркера без необходимости
закрывать вкладки.navigateFallback, чтобы маршруты
приложения корректно работали offline.Эта интеграция позволяет строить прогрессивные веб-приложения с высокой производительностью и стабильной работой offline, полностью используя возможности Workbox и автоматизацию сборки через Webpack.