Workbox — это мощная библиотека для работы с сервис-воркерами в JavaScript, которая упрощает реализацию кэширования, оффлайн-поддержки и стратегий управления сетевыми запросами. Основная цель Workbox — автоматизировать сложные задачи, связанные с производительностью веб-приложений и их устойчивостью при отсутствии сети.
Workbox предоставляет готовые модули и утилиты, позволяющие:
Workbox состоит из нескольких ключевых модулей:
1. workbox-core Базовые функции для работы с сервис-воркерами: управление кэшем, получение текущей версии сервиса, логирование и настройка общих параметров.
2. workbox-routing Обеспечивает маршрутизацию
запросов внутри сервис-воркера. Позволяет определять, какие запросы
будут обрабатываться кэшем, а какие — сетью. Основной объект —
registerRoute, который связывает паттерн URL с выбранной
стратегией кэширования.
3. workbox-strategies Содержит готовые стратегии кэширования:
4. workbox-precaching Модуль для предварительного кэширования статических ресурсов на этапе установки сервис-воркера. Позволяет генерировать манифест ресурсов автоматически, включая хэширование для контроля версий.
5. workbox-expiration и workbox-cacheable-response Эти модули расширяют возможности кэширования:
workbox-expiration позволяет ограничивать количество
элементов в кэше и их срок жизни.workbox-cacheable-response управляет кэшированием
только тех ответов, которые удовлетворяют определённым критериям
(например, статус 200).Предварительное кэширование статических ресурсов
import {precacheAndRoute} from 'workbox-precaching';
precacheAndRoute([
{url: '/index.html', revision: '12345'},
{url: '/styles/main.css', revision: '12345'},
{url: '/scripts/app.js', revision: '12345'},
]);
Этот код автоматически создаёт кэш для указанных файлов и гарантирует их актуальность с помощью ревизий.
Динамическое кэширование API-запросов
import {registerRoute} from 'workbox-routing';
import {NetworkFirst} from 'workbox-strategies';
registerRoute(
({url}) => url.origin === 'https://api.example.com',
new NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 60 * 60 * 24,
}),
],
})
);
Здесь запросы к API будут в первую очередь обрабатываться сетью, а
при её недоступности данные берутся из кэша. Плагин
ExpirationPlugin ограничивает размер кэша и срок
хранения.
Выбор стратегии кэширования напрямую влияет на производительность и оффлайн-поведение приложения:
Использование плагинов Workbox позволяет гибко настраивать поведение кэша, включая фильтрацию ответов, автоматическое удаление устаревших версий и логирование ошибок.
Workbox легко интегрируется с Webpack через
workbox-webpack-plugin, что позволяет:
Пример конфигурации Webpack:
const {GenerateSW} = require('workbox-webpack-plugin');
module.exports = {
plugins: [
new GenerateSW({
clientsClaim: true,
skipWaiting: true,
runtimeCaching: [
{
urlPattern: /\.(?:png|jpg|jpeg|svg|gif)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60,
},
},
},
],
}),
],
};
Это позволяет автоматически создавать сервис-воркер с нужными стратегиями кэширования, минимизируя ручное вмешательство.
Workbox упрощает управление обновлениями кэша:
skipWaiting и clientsClaim позволяют
новым версиям сервис-воркера сразу вступать в силу без ожидания закрытия
вкладок.Правильная конфигурация стратегий кэширования и обновления сервис-воркеров критически важна для поддержания производительности приложения и предотвращения проблем с устаревшими данными.