Библиотека Workbox предоставляет удобный интерфейс для построения сервис-воркеров в приложениях на JavaScript. Она позволяет легко реализовывать стратегии кэширования, управление ресурсами и оффлайн-поддержку. Основные возможности Workbox включают:
precache) для
гарантированного доступа к критически важным файлам.runtime caching)
для динамических запросов.CacheFirst,
NetworkFirst, StaleWhileRevalidate,
NetworkOnly и CacheOnly.Пример базового сервис-воркера с предзагрузкой статических файлов:
import { precacheAndRoute } from 'workbox-precaching';
precacheAndRoute([
{ url: '/index.html', revision: '1234' },
{ url: '/styles.css', revision: '1234' },
{ url: '/app.js', revision: '1234' },
]);
Для динамического кэширования запросов Workbox предоставляет удобный
метод registerRoute. Важно понимать различия стратегий:
Пример:
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'image',
new StaleWhileRevalidate({
cacheName: 'images-cache',
plugins: [
// Ограничение по количеству и сроку хранения
],
})
);
Web Push API в сочетании с Workbox позволяет получать уведомления даже при закрытой вкладке браузера. Основные шаги:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('SW зарегистрирован', reg))
.catch(err => console.error('Ошибка регистрации SW', err));
}
const swReg = await navigator.serviceWorker.ready;
const subscription = await swReg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array('<PUBLIC_VAPID_KEY>')
});
self.addEventListener('push', event => {
const data = event.data.json();
const options = {
body: data.body,
icon: '/icon.png',
badge: '/badge.png',
data: { url: data.url }
};
event.waitUntil(
self.registration.showNotification(data.title, options)
);
});
self.addEventListener('notificationclick', event => {
event.notification.close();
event.waitUntil(
clients.matchAll({ type: 'window' }).then(windowClients => {
for (let client of windowClients) {
if (client.url === event.notification.data.url && 'focus' in client) {
return client.focus();
}
}
if (clients.openWindow) {
return clients.openWindow(event.notification.data.url);
}
})
);
});
Workbox не предоставляет прямого API для push, но сервис-воркер, созданный через Workbox, полностью совместим с Web Push. Важно учитывать следующие моменты:
push и notificationclick.precacheAndRoute для
критичных ресурсов уведомлений (иконки, шрифты, изображения).Пример совместной настройки:
import { precacheAndRoute } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
import { NetworkFirst } from 'workbox-strategies';
precacheAndRoute(self.__WB_MANIFEST);
registerRoute(
({ url }) => url.pathname.startsWith('/api/notifications'),
new NetworkFirst({ cacheName: 'notifications-cache' })
);
self.addEventListener('push', event => {
const data = event.data.json();
event.waitUntil(
self.registration.showNotification(data.title, {
body: data.body,
icon: '/icon.png',
badge: '/badge.png',
})
);
});
StaleWhileRevalidate и CacheFirst для часто
используемых ресурсов.Эти подходы обеспечивают быстрый отклик приложения, надежное кэширование и корректную работу push-уведомлений при любых условиях сети.