Библиотека sw-precache используется для автоматической генерации Service Worker, который кэширует статические ресурсы веб-приложения. Основной принцип работы заключается в анализе файловой структуры проекта и создании манифеста кэшируемых файлов с указанием хэшей, что позволяет реализовать стратегию “cache-first” для улучшения производительности и оффлайн-доступа.
Ключевые элементы конфигурации sw-precache:
staticFileGlobs — массив путей к файлам, которые должны
быть кэшированы.stripPrefix — удаляет указанный префикс из пути при
добавлении в кэш.runtimeCaching — позволяет задать правила динамического
кэширования для сетевых запросов, например, API или изображений.navigateFallback — указывает HTML-файл, который будет
возвращён при навигации, когда ресурс не найден в кэше.Пример конфигурации:
const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'dist/**/*.html',
'dist/**/*.css',
'dist/**/*.js',
'dist/images/**/*.{png,jpg,gif}'
],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}],
navigateFallback: '/index.html'
});
Workbox представляет собой набор модулей для генерации и управления Service Worker, предоставляющий более гибкий и расширяемый подход:
workbox-webpack-plugin.Sw-precache создаёт манифест для предзагрузки файлов. Workbox заменяет его через workbox-build или workbox-webpack-plugin, где можно настроить аналогичный precache:
const { generateSW } = require('workbox-build');
generateSW({
globDirectory: 'dist',
globPatterns: [
'**/*.{html,js,css,png,jpg,gif}'
],
swDest: 'dist/service-worker.js',
runtimeCaching: [{
urlPattern: /\/api\/.*$/,
handler: 'NetworkFirst'
}],
navigateFallback: '/index.html',
});
Ключевые отличия:
globDirectory заменяет stripPrefix и
staticFileGlobs.handler) имеют более читаемые
имена и расширенные возможности.Sw-precache не поддерживает динамическую маршрутизацию. Workbox предлагает модуль Routing, который позволяет:
Пример маршрутизации:
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'image',
new StaleWhileRevalidate({
cacheName: 'images-cache',
})
);
Workbox автоматически обновляет Service Worker при изменении файлов в precache. Для интеграции с пользователем можно использовать события:
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
Это позволяет мгновенно активировать новый Service Worker и обновить кэш без вмешательства пользователя.
Sw-precache поддерживает только базовые runtimeCaching правила. Workbox расширяет это:
Пример:
import { registerRoute } from 'workbox-routing';
import { NetworkFirst, CacheFirst } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/'),
new NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 3,
})
);
registerRoute(
({ request }) => request.destination === 'script',
new CacheFirst({
cacheName: 'js-cache',
})
);
Переход с sw-precache на Workbox подразумевает:
service-worker.js через
sw-precache.workbox-build или
workbox-webpack-plugin.globDirectory и
globPatterns.Такой подход обеспечивает более современную и масштабируемую архитектуру кэширования, упрощает поддержку и расширение функциональности веб-приложения.