Workbox предоставляет мощные инструменты для организации кэширования ресурсов и управления оффлайн-доступом в веб-приложениях. После выбора стратегии кэширования важно убедиться, что она работает корректно и соответствует требованиям производительности и обновляемости. Тестирование стратегий кэширования позволяет выявить ошибки в логике кэширования, определить поведение при обновлении контента и оптимизировать использование сетевых ресурсов.
Прежде чем тестировать стратегии, необходимо создать сервис-воркер с подключением Workbox. Пример минимальной конфигурации:
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate, CacheFirst, NetworkFirst } from 'workbox-strategies';
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
import { ExpirationPlugin } from 'workbox-expiration';
registerRoute(
({ request }) => request.destination === 'image',
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new CacheableResponsePlugin({ statuses: [0, 200] }),
new ExpirationPlugin({ maxEntries: 50, maxAgeSeconds: 30 * 24 * 60 * 60 }),
],
})
);
В этом примере используется стратегия CacheFirst для
изображений с ограничением количества записей и времени хранения.
Инструменты браузера позволяют отслеживать состояние кэша и работу сервис-воркера:
Основные моменты тестирования через DevTools:
ExpirationPlugin.Для автоматизированного тестирования Workbox можно использовать
библиотеки вроде Jest и Service Worker
Mocking. Пример проверки стратегии CacheFirst:
import { CacheFirst } from 'workbox-strategies';
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
import { setupServer } from 'msw/node';
import { rest } from 'msw';
describe('CacheFirst strategy', () => {
it('должна сохранять ресурс в кэше после первого запроса', async () => {
const strategy = new CacheFirst({
cacheName: 'test-cache',
plugins: [new CacheableResponsePlugin({ statuses: [200] })],
});
const response = new Response('Hello World', { status: 200 });
global.fetch = jest.fn().mockResolvedValue(response);
await strategy.handle({ request: new Request('/test') });
const cache = await caches.open('test-cache');
const cachedResponse = await cache.match('/test');
expect(cachedResponse).not.toBeNull();
expect(await cachedResponse.text()).toBe('Hello World');
});
});
Юнит-тестирование позволяет имитировать сетевые ответы и проверять взаимодействие стратегии с кэшем без необходимости реального сервера.
Для стратегий с сетевым приоритетом (NetworkFirst,
StaleWhileRevalidate) важно проверить обновление
ресурсов:
Пример с NetworkFirst:
import { NetworkFirst } from 'workbox-strategies';
const strategy = new NetworkFirst({ cacheName: 'api-cache' });
// Первый запрос (сеть доступна)
await strategy.handle({ request: new Request('/api/data') });
// Второй запрос (офлайн)
await strategy.handle({ request: new Request('/api/data') });
Такой тест подтверждает, что стратегия корректно возвращает данные из кэша при недоступной сети и обновляет кэш при повторном подключении.
Для детального контроля можно добавить логирование работы стратегии:
class LoggingPlugin {
cacheDidUpdate({ request, oldResponse, newResponse, cacheName }) {
console.log(`Кэш обновлён: ${request.url}, кэш: ${cacheName}`);
}
}
registerRoute(
({ request }) => request.destination === 'script',
new StaleWhileRevalidate({
cacheName: 'scripts-cache',
plugins: [new LoggingPlugin()],
})
);
Логирование позволяет отслеживать, какие ресурсы кэшируются, когда и почему происходят обновления.
Для комплексного тестирования сервис-воркеров и стратегий кэширования применяются инструменты вроде Puppeteer или Playwright. Они позволяют:
Пример проверки с Puppeteer:
await page.setOfflineMode(true);
await page.goto('http://localhost:3000');
const content = await page.content();
expect(content).toContain('Cached Content');
Это гарантирует, что стратегиия работает корректно в реальных условиях.
Тщательное тестирование стратегий кэширования позволяет обеспечить высокую производительность и корректное поведение веб-приложения в любых условиях сети.