Broadcast Channel API представляет собой стандартный браузерный механизм, который позволяет обмениваться сообщениями между различными контекстами одного происхождения: вкладками, фреймами или сервис-воркерами. В связке с Workbox API он используется для синхронизации состояния кэшей и управления стратегиями обновления ресурсов в PWA (Progressive Web App).
Broadcast Channel создаётся с помощью конструктора
BroadcastChannel, которому передаётся уникальное имя
канала:
const channel = new BroadcastChannel('workbox-messages');
postMessage(). Любой слушатель на этом канале сможет их
получить.channel.postMessage({ type: 'CACHE_UPDATED', payload: '/index.html' });
message:channel.onmess age = (event) => {
console.log('Получено сообщение:', event.data);
};
Workbox предоставляет встроенную поддержку Broadcast Channel API
через модуль workbox-broadcast-update. Он позволяет
уведомлять активные вкладки о том, что ресурс в кэше был обновлён, и
инициировать соответствующие действия, например перезагрузку страницы
или подгрузку новых данных.
BroadcastUpdatePluginimport { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
import { BroadcastUpdatePlugin } from 'workbox-broadcast-update';
registerRoute(
({ request }) => request.destination === 'script' || request.destination === 'style',
new StaleWhileRevalidate({
plugins: [
new BroadcastUpdatePlugin({
channelName: 'workbox-messages',
generatePayload: ({ cacheName, request, oldResponse, newResponse }) => ({
cacheName,
updatedUrl: request.url
})
})
]
})
);
Клиентские скрипты могут подписываться на сообщения от сервис-воркера и реагировать на обновления кэша:
const channel = new BroadcastChannel('workbox-messages');
channel.onmess age = async (event) => {
const { updatedUrl } = event.data;
console.log(`Обновлён ресурс: ${updatedUrl}`);
// Опционально инициировать перезагрузку страницы или обновление UI
if (updatedUrl.endsWith('index.html')) {
const shouldReload = confirm('Доступна новая версия приложения. Перезагрузить страницу?');
if (shouldReload) window.location.reload();
}
};
Использование Broadcast Channel API в связке с Workbox обеспечивает эффективную, безопасную и удобную синхронизацию состояния кэшей, повышает отзывчивость приложений и упрощает реализацию стратегий обновления в PWA.