Workbox — это мощная библиотека для создания прогрессивных веб-приложений (PWA), которая упрощает управление стратегиями кэширования и оптимизацию загрузки ресурсов. Центральным элементом является Service Worker, который перехватывает сетевые запросы и позволяет эффективно использовать кэш для ускорения загрузки и снижения нагрузки на сервер.
В Workbox существуют несколько стратегий кэширования, каждая из которых подходит для определённых сценариев:
Потоковые ответы (streaming responses) позволяют отдавать клиенту данные постепенно, не дожидаясь полной загрузки ресурса. Это критически важно для больших файлов, мультимедиа и данных API. Workbox поддерживает работу с потоками через расширение стандартного FetchEvent API.
Пример перехвата и передачи потока через Service Worker:
import { registerRoute } from 'workbox-routing';
registerRoute(
({ request }) => request.destination === 'document',
async ({ event }) => {
const networkResponse = await fetch(event.request);
const { readable, writable } = new TransformStream();
networkResponse.body.pipeTo(writable);
return new Response(readable, {
headers: networkResponse.headers
});
}
);
Здесь ключевой момент — использование TransformStream, который позволяет перехватывать поток и изменять его на лету, при этом клиент получает данные постепенно, улучшая восприятие скорости загрузки.
Параллельное кэширование и потоковая передача Поток можно одновременно отдавать клиенту и записывать в кэш, что сокращает время загрузки при повторных обращениях:
import { CacheFirst } from 'workbox-strategies';
import { registerRoute } from 'workbox-routing';
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
const cacheStrategy = new CacheFirst({
cacheName: 'stream-cache',
plugins: [
new CacheableResponsePlugin({ statuses: [0, 200] })
]
});
registerRoute(
({ request }) => request.destination === 'script',
async ({ request }) => {
const response = await fetch(request);
const clonedResponse = response.clone();
cacheStrategy.handle({ request, event: {} });
return clonedResponse;
}
);Инкрементальная обработка данных Для больших JSON или видеофайлов можно читать поток частями, обрабатывать их на лету и отдавать клиенту. Это уменьшает нагрузку на память и ускоряет отображение первых байтов данных.
Использование Range-запросов Для мультимедиа оптимизация достигается через поддержку HTTP Range-запросов. Workbox позволяет комбинировать кэширование с частичной загрузкой файлов, что критично для длинных видео или аудиофайлов.
Workbox предоставляет плагины для контроля кэш-памяти:
Пример ограничения кэша потокового ресурса:
import { ExpirationPlugin } from 'workbox-expiration';
import { CacheFirst } from 'workbox-strategies';
const streamCache = new CacheFirst({
cacheName: 'video-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 20,
maxAgeSeconds: 7 * 24 * 60 * 60 // 7 дней
})
]
});