Workbox предоставляет мощную и гибкую систему для построения сервис-воркеров и управления кэшированием ресурсов в веб-приложениях. Ключевой элемент этой системы — плагины, которые расширяют стандартное поведение стратегий кэширования и сетевых запросов.
Плагин в Workbox — это объект, содержащий один или несколько хуков (hooks), которые вызываются в определённые моменты жизненного цикла запроса. Плагины позволяют:
Каждый плагин может быть использован в любой стратегии Workbox,
включая CacheFirst, NetworkFirst,
StaleWhileRevalidate и другие.
Хуки плагина привязаны к конкретным событиям:
requestWillFetch Вызывается перед
отправкой сетевого запроса. Позволяет изменить объект
Request или добавить дополнительные заголовки.
const plugin = {
requestWillFetch: async ({request}) => {
const modifiedHeaders = new Headers(request.headers);
modifiedHeaders.set('X-Custom-Header', 'Workbox');
return new Request(request, { headers: modifiedHeaders });
}
};fetchDidSucceed Срабатывает после
успешного получения ответа от сети. Часто используется для логирования
или проверки состояния ответа перед сохранением в кэш.
const plugin = {
fetchDidSucceed: async ({request, response}) => {
console.log(`Успешный запрос: ${request.url}`);
return response;
}
};fetchDidFail Вызывается при
неудачной попытке получения ресурса из сети. Позволяет реализовать
альтернативные стратегии, например, fallback к кэшу.
const plugin = {
fetchDidFail: async ({request}) => {
console.warn(`Сбой сети для запроса: ${request.url}`);
}
};cacheWillUpdate Определяет, можно
ли кэшировать полученный ответ. Используется для фильтрации ответов по
статусу или типу содержимого.
const plugin = {
cacheWillUpdate: async ({request, response}) => {
if (response.status === 200 && response.type === 'basic') {
return response;
}
return null;
}
};cacheDidUpdate Вызывается после
обновления кэша. Полезен для ведения статистики или триггера событий о
новых версиях ресурсов.
const plugin = {
cacheDidUpdate: async ({cacheName, request, oldResponse, newResponse}) => {
console.log(`Обновлён кэш ${cacheName} для ${request.url}`);
}
};cachedResponseWillBeUsed
Определяет, какой ответ из кэша будет использован при запросе. Позволяет
игнорировать устаревшие ресурсы или применять собственные правила
приоритетов.
const plugin = {
cachedResponseWillBeUsed: async ({cacheName, cachedResponse}) => {
if (!cachedResponse) return null;
return cachedResponse;
}
};Workbox позволяет использовать несколько плагинов одновременно. Плагины обрабатываются последовательно, и каждый может изменять результат предыдущего.
const strategy = new workbox.strategies.NetworkFirst({
cacheName: 'dynamic-cache',
plugins: [pluginA, pluginB]
});
Важным аспектом является порядок подключения
плагинов, так как он определяет последовательность вызова
хуков. Например, если один плагин модифицирует запрос, все последующие
плагины получат уже изменённый объект Request.
Процесс создания собственного плагина сводится к реализации одного или нескольких хуков. Структура плагина проста:
class CustomPlugin {
async requestWillFetch({request}) {
// Модификация запроса
return request;
}
async fetchDidSucceed({response}) {
// Логика после успешного запроса
return response;
}
async cacheWillUpdate({response}) {
// Определение, можно ли кэшировать
return response.status === 200 ? response : null;
}
}
Такой плагин можно подключить к любой стратегии Workbox через массив
plugins.
Workbox поставляется с рядом встроенных плагинов, обеспечивающих распространённые задачи:
Эти плагины можно комбинировать с кастомными для гибкой настройки поведения сервис-воркера.
Плагины в Workbox обеспечивают мощный инструмент для управления сложными сценариями кэширования и сетевых запросов, позволяя создавать высокопроизводительные и надёжные PWA.