Sw-precache — это инструмент для автоматической генерации сервис-воркера, который кеширует ресурсы веб-приложения и обеспечивает работу в офлайн-режиме. Основная цель библиотеки — предзагрузка статических ресурсов (HTML, CSS, JS, изображения) в кеш браузера, чтобы при последующих запросах они могли быть извлечены мгновенно, без обращения к серверу.
Генерация сервис-воркера происходит на этапе сборки проекта. Sw-precache сканирует указанные директории, создаёт манифест файлов с контрольными суммами (hash) и генерирует JavaScript-файл, содержащий логику кеширования и стратегию ответа на fetch-запросы.
Файл конфигурации может быть создан вручную или через Node.js скрипт. Основные параметры:
module.exports = {
staticFileGlobs: [
'dist/**/*.html',
'dist/**/*.css',
'dist/**/*.js',
'dist/images/**/*.{png,jpg,gif}'
],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}],
navigateFallback: '/index.html'
};
Непрозрачные (opaque) ответы возникают при кешировании ресурсов с
кросс-доменных запросов без CORS-заголовков
Access-Control-Allow-Origin. В Sw-precache такие ответы
имеют ограничения:
Response.text() или
Response.json().Типичные сценарии возникновения opaque-ответов:
Включение CORS на сервере Сервер должен
отправлять заголовок Access-Control-Allow-Origin: * или
указанный домен. Это позволяет сервис-воркеру получить полноценный
доступ к ответу и применять любые стратегии кеширования.
Использование прокси-сервера Кросс-доменные запросы направляются через собственный сервер, который добавляет необходимые CORS-заголовки. В таком случае ответ становится прозрачным для сервис-воркера.
Кеширование только как статический ресурс Если
контроль содержимого не нужен, можно использовать стратегию
cacheOnly или cacheFirst без попытки анализа
данных. Это полезно для шрифтов, картинок и других бинарных
файлов.
Предварительное скачивание ресурсов на этапе
сборки Инструменты вроде webpack или gulp могут скачать
кросс-доменные файлы и положить их в локальный dist для
кеширования Sw-precache. Тогда opaque-ответы не возникают, так как файлы
уже локальные.
navigateFallback, чтобы
opaque-ответы не ломали маршрутизацию.runtimeCaching.install и fetch сервис-воркера.staticFileGlobs. Здесь важно обработать потенциальные
opaque-ресурсы через правильные стратегии.response.type и использовать стратегии кеширования
без анализа данных.Sw-precache хорошо сочетается с инструментами сборки:
sw-precache-webpack-plugin, чтобы интегрировать генерацию
сервис-воркера в процесс сборки.Sw-precache подходит для проектов с преимущественно статическими ресурсами, где критично обеспечить быстрый офлайн-доступ и минимальный ручной контроль за кешем. Важно учитывать ограничения opaque-ответов и планировать стратегию кеширования для внешних ресурсов заранее.