sw-precache — это инструмент для автоматической
генерации сервис-воркеров, обеспечивающих кэширование ресурсов
веб-приложения. Он позволяет заранее указать файлы, которые должны быть
сохранены в кэше, и оптимизировать работу приложения в оффлайн-режиме.
Основной механизм работы заключается в сканировании проекта, создании
списка файлов для кэширования и генерации файла сервис-воркера с
соответствующей логикой.
Файлы конфигурации sw-precache обычно задаются через
объект с ключевыми параметрами:
{
staticFileGlobs: ['dist/**.*'],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /\/api\/.*\//,
handler: 'networkFirst'
}]
}
staticFileGlobs — массив шаблонов файлов, которые будут
добавлены в кэш.stripPrefix — префикс пути, который нужно убрать при
добавлении файлов в кэш, чтобы пути в кэше совпадали с путями на
сервере.runtimeCaching — массив правил динамического
кэширования с указанием паттернов URL и стратегий кэширования.sw-precache поддерживает несколько стратегий
кэширования:
cacheFirst — сначала проверяется кэш,
если ресурс найден — возвращается он, иначе запрос идет на сеть.networkFirst — сначала делается запрос
к сети, если ресурс недоступен — возвращается кэшированная версия.fastest — параллельно проверяются сеть
и кэш, возвращается первый доступный ресурс.networkOnly / cacheOnly —
ограничение доступа только к сети или только к кэшу.Выбор стратегии критически важен после изменения конфигурации, так как неправильная стратегия может привести к выдаче устаревших данных или постоянным ошибкам загрузки.
После обновления конфигурации sw-precache необходимо
убедиться, что сервис-воркер работает корректно, а кэшированные ресурсы
соответствуют ожиданиям. Основные шаги регрессионного тестирования:
При изменении staticFileGlobs или
stripPrefix нужно проверить, что новый сервис-воркер
содержит корректный список кэшируемых файлов. Это можно сделать, открыв
сгенерированный service-worker.js и убедившись, что:
sw-precache создает уникальный идентификатор кэша на
основе хэшей файлов. При обновлении конфигурации важно убедиться, что
новый сервис-воркер создает новый кэш, а старый — корректно
удаляется.
self.addEventListener('activate', event => {
const expectedCaches = ['my-app-cache-v2'];
event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (!expectedCaches.includes(cacheName)) {
return caches.delete(cacheName);
}
})
);
})
);
});
Проверка должна включать:
caches.keys().Каждое правило из runtimeCaching должно быть
протестировано:
networkFirst для API-запросов: отключение сети
должно возвращать ранее кэшированные данные.cacheFirst для статических ресурсов: изменения
в файле должны обновлять кэш после перегенерации сервис-воркера.fastest: одновременный доступ к сети и кэшу
должен отдавать корректный результат.После обновления конфигурации необходимо:
Регрессионное тестирование должно быть автоматизировано, чтобы при каждом изменении конфигурации сервис-воркера:
service-worker.js.Пример автоматизированного теста с использованием Puppeteer:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://localhost:8080');
await page.setOfflineMode(true);
const content = await page.content();
console.assert(content.includes('main.js'), 'main.js должен быть загружен из кэша');
await browser.close();
})();
После обновления конфигурации стоит включить расширенное логирование при установке и активации сервис-воркера:
self.addEventListener('install', event => {
console.log('Service worker installing...');
event.waitUntil(self.skipWaiting());
});
self.addEventListener('activate', event => {
console.log('Service worker activating...');
});
Логи помогают выявлять проблемы при регрессионном тестировании и отслеживать ошибки кэширования в реальном времени.
runtimeCaching может
потребовать увеличения версий кэша.staticFileGlobs может привести к
пропуску важных файлов, поэтому требуется тщательная проверка.Регрессионное тестирование после обновления конфигурации
sw-precache обеспечивает стабильность работы веб-приложения
и предотвращает проблемы с устаревшими кэшами, неправильной загрузкой
ресурсов и некорректным поведением в оффлайн-режиме.