Sw-precache — это инструмент для автоматической генерации сервис-воркера, который кэширует статические ресурсы веб-приложения, обеспечивая поддержку офлайн-режима. В контексте CI/CD важно, чтобы проверка офлайн-режима выполнялась автоматически на этапе сборки и тестирования, без необходимости ручного взаимодействия.
Для начала необходимо установить библиотеку через npm:
npm install sw-precache --save-dev
Или глобально для использования в командной строке:
npm install -g sw-precache
Создание конфигурационного файла sw-precache-config.js
позволяет централизованно управлять правилами кэширования:
module.exports = {
staticFileGlobs: [
'dist/**/*.html',
'dist/**/*.js',
'dist/**/*.css',
'dist/images/**.*'
],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /^https:\/\/api\.example\.com\//,
handler: 'networkFirst'
}],
verbose: true
};
Для автоматизации в CI достаточно добавить скрипт сборки
сервис-воркера в package.json:
"scripts": {
"generate-sw": "sw-precache --config=sw-precache-config.js"
}
В CI/CD пайплайне (например, Jenkins, GitLab CI, GitHub Actions) команда запускается как часть этапа сборки:
steps:
- name: Install dependencies
run: npm install
- name: Generate service worker
run: npm run generate-sw
Это гарантирует, что сервис-воркер всегда актуален и отражает текущие статические ресурсы проекта.
Для тестирования офлайн-режима в CI используется комбинация инструментов для эмуляции сетевых условий и запуска браузера в headless-режиме. Наиболее распространённый подход — использование Puppeteer:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Включение офлайн-режима
await page.setOfflineMode(true);
// Попытка загрузки страницы
const response = await page.goto('http://localhost:8080');
if (response.status() === 200) {
console.log('Страница успешно загружена из кэша.');
} else {
console.error('Не удалось загрузить страницу офлайн.');
}
await browser.close();
})();
Ключевой момент — использование метода
setOfflineMode(true), который имитирует отсутствие сети, а
успешная загрузка страницы подтверждает корректную работу
сервис-воркера.
Для интеграции с CI рекомендуется создать отдельный скрипт тестирования:
"scripts": {
"test-offline": "node test-offline.js"
}
В пайплайне:
- name: Test offline mode
run: npm run test-offline
Можно добавить проверку нескольких страниц и ресурсов, чтобы убедиться, что все критические элементы приложения кэшируются и доступны без сети.
Sw-precache поддерживает флаг verbose, который выводит
подробный лог всех файлов, добавленных в кэш. Для CI полезно сохранять
этот лог как артефакт сборки, чтобы отслеживать, какие ресурсы
кэшируются:
sw-precache --config=sw-precache-config.js > sw-precache.log
В CI можно настроить уведомления или fail-проверку, если определённые ресурсы не попали в кэш.
runtimeCaching.staticFileGlobs в конфигурации,
чтобы новые файлы автоматически попадали в кэш.Эта практика позволяет гарантировать, что приложение будет корректно работать офлайн, а CI-среда будет своевременно выявлять проблемы с кэшированием и доступностью ресурсов.