sw-precache-webpack-plugin представляет собой связующее
звено между сборщиком Webpack и механизмом Service Worker. Плагин
анализирует результат сборки (bundle), извлекает список статических
ресурсов и генерирует Service Worker-файл с преднастроенным списком
кешируемых активов (precache manifest).
Основная задача — автоматизация:
В отличие от ручного написания Service Worker, подход с плагином устраняет необходимость поддерживать список файлов вручную и снижает риск ошибок при деплое.
npm install sw-precache-webpack-plugin --save-dev
Подключение в конфигурации Webpack:
const path = require('path');
const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js',
},
plugins: [
new SWPrecacheWebpackPlugin({
cacheId: 'my-app',
filename: 'service-worker.js',
staticFileGlobs: [
'dist/**/*.html',
'dist/**/*.css',
'dist/**/*.js',
'dist/images/**/*'
],
minify: true,
stripPrefix: 'dist/'
})
]
};
cacheIdУникальный идентификатор кеша. Используется для изоляции данных между различными приложениями или версиями.
cacheId: 'my-app'
filenameИмя генерируемого Service Worker файла:
filename: 'service-worker.js'
Файл будет помещён в директорию output.path.
staticFileGlobsМассив путей (glob-шаблонов), определяющих, какие файлы попадут в precache:
staticFileGlobs: [
'dist/**/*.js',
'dist/**/*.css',
'dist/**/*.html'
]
Поддерживаются шаблоны:
**/* — рекурсивный поиск*.js — по расширениюstripPrefixУдаляет указанный префикс из путей ресурсов перед записью в кеш:
stripPrefix: 'dist/'
Без этого параметра пути могли бы выглядеть как
/dist/js/app.js, что не соответствует реальному URL.
minifyМинификация итогового Service Worker:
minify: true
Уменьшает размер файла и ускоряет загрузку.
Во время сборки плагин:
[
{
"url": "/bundle.js",
"revision": "a1b2c3d4"
},
{
"url": "/styles.css",
"revision": "e5f6g7h8"
}
]
Этот список встраивается в Service Worker и используется для:
Механизм обновления основан на ревизиях:
Это решает проблему “залипания” старых версий ресурсов.
Помимо precache, плагин позволяет управлять кешированием динамических запросов:
runtimeCaching: [
{
urlPattern: /\/api\//,
handler: 'networkFirst'
},
{
urlPattern: /\.(png|jpg|jpeg|svg)$/,
handler: 'cacheFirst'
}
]
cacheFirst
Подходит для:
networkFirst
Используется для:
fastest
Настройка fallback для offline:
navigateFallback: '/index.html'
Используется в SPA (Single Page Application), где:
Можно исключить определённые ресурсы:
staticFileGlobsIgnorePatterns: [
/\.map$/,
/asset-manifest\.json$/
]
Это уменьшает размер кеша и ускоряет установку Service Worker.
maximumFileSizeToCacheInBytes: 4194304
По умолчанию:
Увеличение лимита полезно для:
Плагин позволяет добавлять пользовательскую логику:
importScripts: ['custom-sw.js']
Файл custom-sw.js может содержать:
self.addEventListener('push', function(event) {
// обработка push-уведомлений
});
Версионирование осуществляется автоматически через hash, но можно дополнительно контролировать:
dontCacheBustUrlsMatching: /\.\w{8}\./
Используется при:
app.a1b2c3d4.js)templateFilePath: 'src/sw-template.js'
Позволяет:
Сгенерированный Service Worker проходит стандартные стадии:
install
activate
fetch
Плагин автоматически внедряет соответствующую логику.
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js');
});
}
output.publicPathЕсли используется:
output: {
publicPath: '/static/'
}
URL ресурсов в кеше будут формироваться с учётом этого префикса.
Webpack генерирует динамические чанки:
0.bundle.js1.bundle.jsПлагин автоматически включает их в precache, если они попадают под
staticFileGlobs.
При использовании:
filename: '[name].[contenthash].js'
new SWPrecacheWebpackPlugin({
cacheId: 'advanced-app',
filename: 'sw.js',
staticFileGlobs: [
'dist/**/*.{js,css,html,png,jpg}'
],
stripPrefix: 'dist/',
minify: true,
runtimeCaching: [
{
urlPattern: /^https:\/\/api\.example\.com/,
handler: 'networkFirst'
},
{
urlPattern: /\.(png|jpg|jpeg|svg|gif)$/,
handler: 'cacheFirst'
}
],
navigateFallback: '/index.html',
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024
})
Используются инструменты браузера:
Проверяется:
Пользователь открывает приложение
Service Worker кеширует ресурсы
Выходит новая версия
При следующей загрузке:
Для немедленного обновления можно использовать:
self.skipWaiting();
self.clients.claim();
(через кастомный шаблон)
sw-precache-webpack-plugin исторически предшествует
более современной экосистеме Workbox. Основные различия:
Тем не менее, понимание работы
sw-precache-webpack-plugin важно для: