sw-precache — это инструмент для автоматической генерации Service Worker, который кэширует ресурсы веб-приложения, обеспечивая оффлайн-доступ и ускорение загрузки страниц. При работе с ним критически важно корректно настраивать конфигурацию, так как ошибки в списке кэшируемых файлов или стратегиях кэширования могут приводить к недоступности ресурсов или некорректному обновлению приложения. Модульное тестирование конфигурации позволяет выявлять такие ошибки на раннем этапе.
Конфигурация sw-precache обычно представляет собой объект JavaScript со следующими ключевыми параметрами:
staticFileGlobs — массив шаблонов
файлов для кэширования. Поддерживаются glob-паттерны, например
['dist/**/*.js', 'dist/**/*.css'].stripPrefix — строка, которая
удаляется из пути к файлу при добавлении его в кэш. Часто используется
для сокращения путей в production.runtimeCaching — массив правил для
динамического кэширования. Каждое правило содержит
urlPattern и handler, где handler
может быть networkFirst, cacheFirst,
fastest, networkOnly.ignoreUrlParametersMatching — массив
регулярных выражений для игнорирования GET-параметров, не влияющих на
кэш.verbose — логирование процесса
генерации Service Worker.handleFetch — булевое значение,
определяющее, будет ли Service Worker перехватывать fetch-запросы.Эта структура является основой для модульного тестирования. Любое отклонение в формате или содержании этих параметров может приводить к некорректной генерации Service Worker.
Модульное тестирование конфигурации sw-precache направлено на проверку корректности данных до генерации Service Worker. Основные аспекты тестирования:
Валидация синтаксиса конфигурации Проверка наличия всех обязательных ключей и их типов:
const assert = require('assert');
const config = require('./sw-precache-config');
assert(Array.isArray(config.staticFileGlobs), 'staticFileGlobs должен быть массивом');
assert(typeof config.stripPrefix === 'string', 'stripPrefix должен быть строкой');
assert(Array.isArray(config.runtimeCaching), 'runtimeCaching должен быть массивом');
assert(typeof config.handleFetch === 'boolean', 'handleFetch должен быть булевым значением');Проверка существования файлов для кэширования
Гарантирует, что указанные в staticFileGlobs файлы реально
существуют:
const fs = require('fs');
const glob = require('glob');
config.staticFileGlobs.forEach(pattern => {
const files = glob.sync(pattern);
assert(files.length > 0, `Файлы по шаблону ${pattern} не найдены`);
});Тестирование правил runtimeCaching
Необходимо убедиться, что каждый объект правила имеет правильный
формат:
config.runtimeCaching.forEach(rule => {
assert(rule.urlPattern instanceof RegExp, 'urlPattern должен быть RegExp');
const validHandlers = ['networkFirst', 'cacheFirst', 'fastest', 'networkOnly'];
assert(validHandlers.includes(rule.handler), `Неверный handler: ${rule.handler}`);
});Проверка игнорируемых параметров URL Проверка,
что все элементы массива ignoreUrlParametersMatching
являются корректными регулярными выражениями:
config.ignoreUrlParametersMatching.forEach(regex => {
assert(regex instanceof RegExp, 'ignoreUrlParametersMatching должен содержать RegExp');
});Тестирование генерации Service Worker в изоляции
Использование mock-файлов и виртуальной файловой системы для проверки,
что sw-precache.write() корректно обрабатывает конфигурацию
без записи реальных файлов.
validateConfig, fileExistence,
runtimeCaching, urlParameters.staticFileGlobs без зависимости от реальных файлов.Пример структуры тестов с Mocha:
describe('sw-precache configuration', function() {
describe('validateConfig', function() {
it('should have required keys', function() { /* проверки типов */ });
});
describe('fileExistence', function() {
it('should find files for all staticFileGlobs', function() { /* проверки файлов */ });
});
describe('runtimeCaching', function() {
it('should have valid urlPattern and handler', function() { /* проверки правил */ });
});
describe('ignoreUrlParametersMatching', function() {
it('should contain valid RegExp', function() { /* проверки regex */ });
});
});
staticFiles.js, runtimeCaching.js,
ignoreParams.js.staticFileGlobs остаются актуальными после сборки
проекта.Модульное тестирование конфигурации sw-precache обеспечивает предсказуемость поведения Service Worker и позволяет избежать критических проблем с кэшированием и оффлайн-доступом.