Библиотека sw-precache предоставляет инструменты для автоматической генерации service worker с предзагрузкой (precache) статических ресурсов. В контексте сборщика webpack она используется через специализированные плагины, которые встраиваются в процесс сборки и формируют файл service worker на основе текущего состояния бандла.
Интеграция происходит на этапе завершения сборки, когда webpack уже сформировал список всех ассетов (JS, CSS, изображения и др.). Плагин анализирует этот список и генерирует service worker с заранее заданной стратегией кэширования.
Для webpack чаще всего применяются:
Пример подключения:
const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
module.exports = {
plugins: [
new SWPrecacheWebpackPlugin({
cacheId: 'my-app',
filename: 'service-worker.js',
staticFileGlobs: ['dist/**/*.{js,css,html,png,jpg}']
})
]
};
cacheId: 'my-app'
Уникальный идентификатор кэша. Используется для предотвращения конфликтов между различными приложениями на одном домене.
Особенности:
filename: 'service-worker.js'
Имя выходного файла service worker.
Важно:
/dist)staticFileGlobs: [
'dist/**/*.js',
'dist/**/*.css',
'dist/**/*.html'
]
Список файлов для предварительного кэширования.
Особенности:
stripPrefix: 'dist/'
Удаляет указанный префикс из путей файлов при добавлении их в кэш.
Пример:
dist/js/app.js → /js/app.js
Используется для корректной работы путей в браузере.
staticFileGlobsIgnorePatterns: [
/\.map$/,
/asset-manifest\.json$/
]
Исключает файлы из precache.
Часто исключаются:
maximumFileSizeToCacheInBytes: 4194304 // 4MB
Ограничение размера файлов для кэширования.
Причины использования:
dontCacheBustUrlsMatching: /\.\w{8}\./
Отключает добавление cache-busting параметров для файлов с хешами.
Пример:
app.12345678.js
Преимущества:
minify: true
Минификация сгенерированного service worker.
Влияние:
runtimeCaching: [
{
urlPattern: /\/api\//,
handler: 'networkFirst'
},
{
urlPattern: /\.(png|jpg|jpeg|svg)/,
handler: 'cacheFirst'
}
]
Позволяет задавать стратегии кэширования для ресурсов, не включённых в precache.
Основные стратегии:
cacheFirst
networkFirst
fastest
navigateFallback: '/index.html'
Используется для SPA (Single Page Applications).
Поведение:
navigateFallbackWhitelist: [
/^\/(?!api).*$/
]
Ограничивает, для каких URL применяется fallback.
Пример:
/apiimportScripts: [
'/sw-custom.js'
]
Позволяет подключать дополнительные скрипты в service worker.
Используется для:
ignoreUrlParametersMatching: [/^utm_/, /^fbclid$/]
Игнорирует параметры URL при поиске в кэше.
Пример:
/index.html?utm_source=google
Будет сопоставлен с:
/index.html
handleFetch: true
Включает обработку fetch-запросов.
Если отключено:
logger: console
Позволяет кастомизировать логирование.
Используется для:
verbose: true
Включает подробный вывод логов.
Полезно при:
sourcemap: false
Генерация source map для service worker.
Обычно отключается:
new SWPrecacheWebpackPlugin({
cacheId: 'advanced-app',
filename: 'service-worker.js',
staticFileGlobs: ['dist/**/*.{js,css,html,png,jpg}'],
stripPrefix: 'dist/',
staticFileGlobsIgnorePatterns: [/\.map$/, /manifest\.json$/],
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024,
dontCacheBustUrlsMatching: /\.\w{8}\./,
minify: true,
runtimeCaching: [
{
urlPattern: /\/api\//,
handler: 'networkFirst'
},
{
urlPattern: /\.(png|jpg|jpeg|svg)/,
handler: 'cacheFirst'
}
],
navigateFallback: '/index.html',
navigateFallbackWhitelist: [/^(?!\/api)/],
ignoreUrlParametersMatching: [/^utm_/],
handleFetch: true,
verbose: false
})
Порядок плагинов
Хеширование файлов
dontCacheBustUrlsMatchingOutput path
staticFileGlobsdist/ vs /build/)stripPrefixЧерез importScripts можно:
Параметры webpack-плагина напрямую влияют на:
Корректная конфигурация обеспечивает: