Workbox — это набор библиотек и инструментов для упрощения создания сервис-воркеров в приложениях на JavaScript. Главная цель Workbox — автоматизация кэширования ресурсов и управление сетевыми запросами для обеспечения офлайн-доступа и повышения производительности.
Ключевые компоненты Workbox:
install, activate, fetch.NetworkFirst,
CacheFirst, StaleWhileRevalidate,
NetworkOnly, CacheOnly.Workbox предлагает несколько подходов к генерации сервис-воркера:
Workbox CLI позволяет создавать сервис-воркеры через командную строку. Основные возможности:
workbox-config.js.Пример конфигурации:
module.exports = {
globDirectory: 'dist/',
globPatterns: [
'**/*.{html,js,css,png,jpg,svg}'
],
swDest: 'dist/sw.js',
runtimeCaching: [{
urlPattern: /\.(?:png|jpg|jpeg|svg)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images',
expiration: {
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60,
},
},
}],
};
В этом примере все ресурсы из dist/ автоматически
попадают в кэш при установке сервис-воркера. Для изображений применяется
стратегия CacheFirst с ограничением на количество и возраст
кэшированных файлов.
Workbox Webpack Plugin интегрируется с процессом сборки Webpack. Позволяет динамически генерировать сервис-воркер на основе ресурсов проекта:
GenerateSW — полностью генерирует сервис-воркер и
манифест.InjectManifest — позволяет разработчику создать
кастомный сервис-воркер с использованием Workbox, а плагин добавляет
список ресурсов для предварительного кэширования.Пример использования GenerateSW:
const { GenerateSW } = require('workbox-webpack-plugin');
module.exports = {
plugins: [
new GenerateSW({
clientsClaim: true,
skipWaiting: true,
runtimeCaching: [
{
urlPattern: /^https:\/\/example\.com\/api\//,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
expiration: { maxEntries: 30, maxAgeSeconds: 5 * 60 },
},
},
],
}),
],
};
InjectManifest позволяет точно контролировать события
сервис-воркера и его поведение, сохраняя при этом мощь Workbox для
кэширования.
Workbox Build — это Node.js API, предоставляющее гибкость для генерации сервис-воркеров вне сборщиков вроде Webpack. Основные функции:
injectManifest() или
generateSW().Пример использования:
const { generateSW } = require('workbox-build');
generateSW({
globDirectory: 'public/',
globPatterns: ['**/*.{html,js,css,png}'],
swDest: 'public/sw.js',
clientsClaim: true,
skipWaiting: true,
}).then(({ count, size }) => {
console.log(`Сервис-воркер сгенерирован для ${count} файлов, общий размер: ${size} байт`);
});
Этот подход особенно полезен для проектов без Webpack или с нестандартной структурой сборки.
Workbox поддерживает гибкие стратегии кэширования, каждая из которых имеет свои особенности:
Выбор стратегии зависит от типа ресурса: статические файлы лучше
кэшировать с CacheFirst, а динамические API-запросы — через
NetworkFirst или StaleWhileRevalidate.
Workbox позволяет автоматически обновлять и удалять устаревшие ресурсы через модуль workbox-expiration. Основные возможности:
Пример конфигурации:
import { ExpirationPlugin } from 'workbox-expiration';
import { CacheFirst } from 'workbox-strategies';
import { registerRoute } from 'workbox-routing';
registerRoute(
/\.(?:png|jpg|jpeg|svg)$/,
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 60,
maxAgeSeconds: 30 * 24 * 60 * 60,
}),
],
})
);
Таким образом, кэш остаётся актуальным, а устаревшие данные автоматически удаляются без вмешательства разработчика.
Эта структура инструментов Workbox и подходы к генерации сервис-воркеров обеспечивают высокую гибкость, контроль и надёжность офлайн-доступа для современных веб-приложений.