Библиотека Sw-precache предназначена для автоматической генерации сервис-воркеров, обеспечивающих кеширование статических ресурсов веб-приложений. При интеграции с Push-уведомлениями её возможности распространяются не только на кеширование файлов, но и на управление жизненным циклом сервис-воркера, необходимым для получения и обработки push-сообщений.
Ключевые моменты взаимодействия:
push и notificationclick.Для работы с Push-уведомлениями требуется корректная регистрация сервис-воркера на клиентской стороне. В большинстве случаев регистрация выглядит следующим образом:
if ('serviceWorker' in navigator && 'PushManager' in window) {
navigator.serviceWorker.register('/service-worker.js')
.then(function(registration) {
console.log('Сервис-воркер зарегистрирован:', registration);
})
.catch(function(error) {
console.error('Ошибка регистрации сервис-воркера:', error);
});
}
Особенности при работе с Sw-precache:
service-worker.js).push и notificationclick.importScripts.После генерации сервис-воркера необходимо подключить скрипт с логикой
push-уведомлений. Например, создается отдельный файл
push-handler.js:
self.addEventListener('push', function(event) {
const data = event.data ? event.data.json() : {};
const title = data.title || 'Новое уведомление';
const options = {
body: data.body || 'Содержимое уведомления',
icon: data.icon || '/images/icon.png',
data: data.url || '/'
};
event.waitUntil(self.registration.showNotification(title, options));
});
self.addEventListener('notificationclick', function(event) {
event.notification.close();
event.waitUntil(
clients.openWindow(event.notification.data)
);
});
В сервис-воркер Sw-precache необходимо подключить этот файл:
importScripts('/push-handler.js');
Sw-precache автоматически кеширует статические ресурсы, но push-уведомления требуют дополнительного внимания к жизненному циклу:
self.addEventListener('install', function(event) {
self.skipWaiting();
});
self.addEventListener('activate', function(event) {
event.waitUntil(self.clients.claim());
});
Sw-precache предоставляет гибкие опции конфигурации для интеграции push-уведомлений:
const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'index.html',
'css/**.css',
'js/**.js',
'images/**.*'
],
stripPrefix: '/',
importScripts: [
'/push-handler.js'
],
runtimeCaching: [
{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}
],
navigateFallback: '/index.html',
verbose: true
});
Разбор ключевых параметров:
staticFileGlobs – список файлов и папок, которые должны
быть закешированы.importScripts – подключение внешних скриптов, включая
push-обработчики.runtimeCaching – правила динамического кеширования
API-запросов.navigateFallback – fallback для SPA-приложений.verbose – подробный лог генерации.push в сервис-воркере должен корректно
проверять формат данных и обрабатывать возможные ошибки.Регистрация подписки обычно осуществляется на клиентской стороне
через PushManager:
navigator.serviceWorker.ready.then(function(registration) {
return registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array('<VAPID_PUBLIC_KEY>')
});
}).then(function(subscription) {
console.log('Подписка на push:', subscription.endpoint);
}).catch(function(error) {
console.error('Ошибка подписки на push:', error);
});
userVisibleOnly гарантирует, что уведомления видимы
пользователю.applicationServerKey – публичный VAPID-ключ для
безопасной отправки сообщений.Поддержка всех современных браузеров, включая Chrome, Firefox, Edge.
Sw-precache подходит для проектов, где важна комбинация оффлайн-кеша и push-уведомлений.
Обновление сервис-воркера должно происходить аккуратно, чтобы не потерять активные подписки на push.
Важно помнить о синхронизации кеша и push-обработчиков: новые версии сервис-воркера должны корректно импортировать все внешние скрипты, иначе push-события не будут обрабатываться.
Эта структура обеспечивает полноценную интеграцию Sw-precache с Push-уведомлениями, гарантируя, что статические ресурсы будут кешированы, а события push будут корректно обработаны на всех открытых страницах приложения.