BroadcastUpdatePlugin — это специализированный плагин библиотеки Workbox, предназначенный для интеграции Service Worker с клиентской частью приложения через механизм широковещательных сообщений. Он решает задачу информирования открытых вкладок или окон браузера о том, что кэшированные ресурсы были обновлены, позволяя синхронизировать данные и улучшать пользовательский опыт при работе с Progressive Web App (PWA).
Главная задача BroadcastUpdatePlugin заключается в уведомлении приложений о том, что контент, закэшированный Service Worker, изменился. Это особенно важно для SPA (Single Page Applications), где пользователи могут долгое время работать с устаревшими ресурсами. Плагин обеспечивает:
Плагин подключается через Workbox при создании стратегии кэширования:
import { CacheFirst } from 'workbox-strategies';
import { BroadcastUpdatePlugin } from 'workbox-broadcast-update';
const cacheFirstStrategy = new CacheFirst({
cacheName: 'my-cache-v1',
plugins: [
new BroadcastUpdatePlugin({
channelName: 'update-notification'
})
]
});
Ключевые параметры:
channelName — имя канала, по которому будут
отправляться уведомления. Клиенты могут подписываться на этот канал для
получения сообщений о обновлении.generatePayload (опционально) — функция, которая
позволяет кастомизировать данные, отправляемые вместе с уведомлением.
Например, можно передавать URL ресурса и тип обновления.Обновление кэша: когда стратегия кэширования загружает новую версию ресурса, BroadcastUpdatePlugin проверяет, отличается ли новый ресурс от старого.
Создание сообщения: при обнаружении изменений плагин формирует сообщение с ключевыми данными, например:
Отправка события: сообщение транслируется через
BroadcastChannel, что позволяет всем открытым вкладкам
приложения получить уведомление и выполнить необходимые действия,
например, обновить отображаемый контент или показать пользователю
уведомление о новой версии.
На клиентской части подписка на уведомления выглядит следующим образом:
const channel = new BroadcastChannel('update-notification');
channel.addEventListener('message', (event) => {
const { meta, cacheName, updatedURL } = event.data;
console.log(`Ресурс обновлён: ${updatedURL}`);
// Можно инициировать автоматическое обновление интерфейса или уведомление пользователя
});
Особенности:
generatePayload позволяет добавлять
контекстные данные, например, номер версии или хеш содержимого.StaleWhileRevalidate или
CacheFirst BroadcastUpdatePlugin повышает консистентность
данных без заметной потери производительности.BroadcastUpdatePlugin обеспечивает мост между Service Worker и клиентом, позволяя эффективно управлять обновлением кэшированных ресурсов и улучшать пользовательский опыт без необходимости полной перезагрузки страниц.