Workbox предоставляет мощные инструменты для работы с Service Worker, позволяя эффективно уведомлять пользователя об обновлениях контента. Основная задача заключается в том, чтобы обеспечивать актуальность ресурсов веб-приложения, не нарушая пользовательский опыт и минимизируя лишние перезагрузки страницы.
Service Worker в Workbox обновляется автоматически, когда меняется
его скрипт. Ключевым механизмом является событие install,
которое срабатывает при установке нового Service Worker, и событие
activate, которое активируется после установки и позволяет
управлять старой версией.
self.addEventListener('install', (event) => {
self.skipWaiting(); // Позволяет новому Service Worker сразу стать активным
});
self.addEventListener('activate', (event) => {
clients.claim(); // Перехватывает все контролируемые страницы новым SW
});
Выделенные моменты:
skipWaiting() позволяет ускорить обновление без
ожидания закрытия всех вкладок.clients.claim() обеспечивает, что все открытые вкладки
будут работать с новым Service Worker сразу после активации.Для уведомления пользователя о появлении новой версии приложения
необходимо слушать событие waiting у Workbox. Workbox
автоматически помещает новый Service Worker в состояние
waiting до момента активации.
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(registration => {
registration.addEventListener('updatefound', () => {
const newWorker = registration.installing;
newWorker.addEventListener('statechange', () => {
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
showUpdateNotification(newWorker);
}
});
});
});
}
Ключевые моменты:
updatefound срабатывает при обнаружении новой версии
Service Worker.statechange позволяет отслеживать переход Service
Worker в состояние installed.navigator.serviceWorker.controller
гарантирует, что это обновление, а не первоначальная установка.Оповещение пользователя может быть реализовано с помощью диалогового окна или баннера, предлагающего обновить страницу. Важный момент — предоставить пользователю возможность контролировать процесс:
function showUpdateNotification(worker) {
const notification = document.createElement('div');
notification.textContent = 'Доступна новая версия приложения. Обновить сейчас?';
const button = document.createElement('button');
button.textContent = 'Обновить';
button.addEventListener('click', () => {
worker.postMessage({ action: 'skipWaiting' });
});
notification.appendChild(button);
document.body.appendChild(notification);
}
Подробности реализации:
postMessage для передачи команды новому
Service Worker.skipWaiting инициирует немедленную активацию
нового Service Worker.window.location.reload(), чтобы пользователь получил свежий
контент.Workbox предоставляет абстракции для упрощения управления обновлениями:
import { precacheAndRoute, createHandlerBoundToURL } from 'workbox-precaching';
import { registerRoute } from 'workbox-routing';
precacheAndRoute(self.__WB_MANIFEST);
self.addEventListener('message', (event) => {
if (event.data.action === 'skipWaiting') {
self.skipWaiting();
}
});
Особенности использования Workbox:
precacheAndRoute позволяет заранее кэшировать
критические ресурсы и автоматически обслуживать их через Service
Worker.self.addEventListener('message') обеспечивает безопасную
коммуникацию между страницей и Service Worker.installed,
waiting, activating) для корректного
отображения уведомления.visibilitychange позволяет периодически
проверять новые версии без вмешательства пользователя.stale-while-revalidate и
cache-first, что обеспечивает быстрый отклик и
своевременное обновление контента.Эти методы позволяют создать надежную систему уведомления об обновлениях, минимизируя прерывания пользовательского взаимодействия и поддерживая актуальность веб-приложения.