Workbox — это мощная библиотека для управления кэшированием и стратегиями работы сервис-воркеров в приложениях на JavaScript. В сочетании с Nuxt.js, которая предоставляет серверный рендеринг и генерацию статических сайтов, Workbox позволяет оптимизировать загрузку ресурсов, повысить производительность и обеспечить offline-доступ.
В Nuxt.js интеграция Workbox чаще всего выполняется через модуль
@nuxt/pwa, который упрощает настройку сервис-воркеров.
npm install @nuxt/pwa
В nuxt.config.js необходимо подключить модуль и
настроить Workbox:
export default {
modules: [
'@nuxt/pwa',
],
pwa: {
workbox: {
// Автоматическая регистрация сервис-воркера
autoRegister: true,
// Стратегии кэширования
runtimeCaching: [
{
urlPattern: 'https://fonts.googleapis.com/.*',
handler: 'CacheFirst',
method: 'GET',
strategyOptions: {
cacheName: 'google-fonts-cache',
cacheExpiration: { maxEntries: 20, maxAgeSeconds: 60 * 60 * 24 * 30 },
},
},
{
urlPattern: 'https://api.example.com/.*',
handler: 'NetworkFirst',
method: 'GET',
strategyOptions: {
cacheName: 'api-cache',
cacheExpiration: { maxEntries: 50, maxAgeSeconds: 60 * 60 },
},
},
],
// Оптимизация precache
precaching: [
{ url: '/offline.html', revision: '1' },
],
},
},
}
Ключевые моменты настройки:
runtimeCaching управляет кэшированием динамических
ресурсов.handler определяет стратегию кэширования
(CacheFirst, NetworkFirst,
StaleWhileRevalidate и др.).strategyOptions задают параметры хранения кэша:
cacheName, maxEntries,
maxAgeSeconds.precache обеспечивает кэширование критических ресурсов
для offline-доступа.Workbox поддерживает несколько стратегий кэширования, каждая из которых имеет свое назначение:
CacheFirst Сначала проверяет кэш, затем обращается к сети. Оптимально для статических ресурсов: шрифтов, изображений, библиотек.
NetworkFirst Сначала пытается получить ресурс из сети, если неудачно — берет из кэша. Подходит для API и динамического контента.
StaleWhileRevalidate Возвращает устаревший кэш мгновенно, а затем обновляет кэш в фоне. Подходит для UI-ресурсов, которые не требуют полной актуальности при каждом запросе.
NetworkOnly / CacheOnly Чисто сетевой или кэшированный подход. Используется редко, но полезен для специфических случаев.
Пример использования нескольких стратегий одновременно:
workbox.routing.registerRoute(
/.*\.(?:png|jpg|jpeg|svg|gif)/,
new workbox.strategies.CacheFirst({
cacheName: 'images-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 дней
}),
],
})
);
Для API-запросов часто используется стратегия
NetworkFirst, чтобы получать свежие данные, но при
недоступной сети использовать кэш:
workbox.routing.registerRoute(
/\/api\/.*\/*.json/,
new workbox.strategies.NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 60 * 60, // 1 час
}),
],
})
);
networkTimeoutSeconds задает максимальное время
ожидания ответа от сети перед fallback на кэш.ExpirationPlugin ограничивает объем кэша и время
хранения.Workbox позволяет кэшировать заранее определенные ресурсы, которые будут доступны offline. В Nuxt.js это удобно для страниц, шаблонов и статических файлов.
workbox.precaching.precacheAndRoute([
{ url: '/offline.html', revision: '1' },
{ url: '/favicon.ico', revision: '1' },
]);
revision нужен для управления версиями ресурсов. При
изменении ресурса необходимо обновить ревизию, чтобы сервис-воркер
пересохранил новый файл.Workbox поддерживает кастомные плагины, позволяющие управлять кэшированием сложных запросов:
const customPlugin = {
cacheWillUpdate: async ({ response }) => {
if (response.status === 200 && response.type === 'basic') {
return response;
}
return null;
},
};
workbox.routing.registerRoute(
/\/custom-api\/.*/,
new workbox.strategies.NetworkFirst({
cacheName: 'custom-api-cache',
plugins: [customPlugin],
})
);
Плагин проверяет статус ответа и тип ресурса перед сохранением в кэш, предотвращая кэширование ошибок или сторонних доменов.
Для SPA Workbox автоматически регистрирует сервис-воркер, но для SSR
и генерации статических сайтов (nuxt generate) необходимо
удостовериться, что все предзагружаемые страницы добавлены в precache.
Nuxt PWA модуль автоматизирует этот процесс через опцию
workbox.preCaching.
Workbox предоставляет инструменты для отладки:
workbox.setConfig({ debug: true }) — включает подробные
логи.workbox.core.skipWaiting() и
workbox.core.clientsClaim() — помогают управлять
обновлением сервис-воркера.