Для использования возможностей Workbox в проекте на Vite применяется
плагин vite-plugin-pwa. Он обеспечивает генерацию
сервис-воркера, управление кешированием и автоматическое создание
манифеста Progressive Web App.
npm install vite-plugin-pwa --save-dev
В конфигурационном файле Vite (vite.config.js или
vite.config.ts) необходимо импортировать плагин и настроить
его:
import { defineConfig } from 'vite';
import { VitePWA } from 'vite-plugin-pwa';
export default defineConfig({
plugins: [
VitePWA({
registerType: 'autoUpdate',
manifest: {
name: 'My App',
short_name: 'App',
start_url: '/',
display: 'standalone',
background_color: '#ffffff',
theme_color: '#4DBA87',
icons: [
{
src: 'icon-192x192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: 'icon-512x512.png',
sizes: '512x512',
type: 'image/png'
}
]
},
workbox: {
runtimeCaching: [
{
urlPattern: /^https:\/\/cdn\.example\.com\/.*\.(js|css)$/,
handler: 'CacheFirst',
options: {
cacheName: 'cdn-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 7 * 24 * 60 * 60
}
}
},
{
urlPattern: /\/api\/.*$/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
expiration: {
maxEntries: 30,
maxAgeSeconds: 24 * 60 * 60
}
}
}
],
navigateFallback: '/index.html',
globPatterns: ['**/*.{js,css,html,png,jpg,svg}'],
globIgnores: ['**/node_modules/**']
}
})
]
});
Workbox предоставляет несколько стратегий кеширования:
В vite-plugin-pwa эти стратегии настраиваются через
массив runtimeCaching, где для каждой группы ресурсов
указывается:
urlPattern — регулярное выражение для совпадения
URLhandler — выбранная стратегияoptions — дополнительные параметры:
cacheName, expiration,
cacheableResponse и т.д.Vite использует ES-модули, поэтому сервис-воркер создается с
поддержкой ES. Плагин автоматически генерирует файл сервис-воркера
(sw.js) в папке dist. При необходимости можно
добавить собственный сервис-воркер с кастомными обработчиками
событий:
// src/custom-sw.js
import { clientsClaim } from 'workbox-core';
import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
clientsClaim();
precacheAndRoute(self.__WB_MANIFEST);
registerRoute(
({ request }) => request.destination === 'image',
new StaleWhileRevalidate({
cacheName: 'images-cache',
})
);
В конфигурации плагина подключение кастомного воркера происходит
через опцию srcDir и filename:
VitePWA({
srcDir: 'src',
filename: 'custom-sw.js',
strategies: 'injectManifest',
});
Опция registerType: 'autoUpdate' обеспечивает
автоматическую проверку нового воркера при загрузке страницы. При
изменении ресурсов Workbox обновляет кеш без вмешательства пользователя.
Для тонкой настройки можно использовать события Workbox:
navigator.serviceWorker.addEventListener('controllerchange', () => {
console.log('Сервис-воркер обновлен');
});
Precache — это механизм Workbox, который позволяет заранее загрузить
ресурсы в кеш. Все файлы, соответствующие globPatterns,
будут автоматически добавлены в кеш при установке сервис-воркера. Это
важно для оффлайн-доступа и ускорения загрузки приложения.
maxEntries.maxAgeSeconds.globIgnores.import { setConfig } from 'workbox-core';
setConfig({ debug: true });
project/
│
├─ src/
│ ├─ main.js
│ └─ custom-sw.js
│
├─ public/
│ └─ icons/
│
├─ vite.config.js
└─ package.json
Эта структура обеспечивает корректную работу
vite-plugin-pwa и позволяет полностью использовать
возможности Workbox для кеширования, оффлайн-доступа и оптимизации
загрузки приложения.