BroadcastUpdatePlugin — это мощный инструмент библиотеки Workbox, предназначенный для уведомления приложения о том, что кэшированные ресурсы были обновлены. Этот плагин интегрируется с сервис-воркерами и позволяет реализовать реактивное обновление данных без необходимости полной перезагрузки страницы.
BroadcastChannel, которое
может быть перехвачено на клиентской стороне.StaleWhileRevalidate,
CacheFirst, NetworkFirst и другими стратегиями
Workbox.Для использования BroadcastUpdatePlugin необходимо установить Workbox через npm или подключить его через CDN. При npm:
import { BroadcastUpdatePlugin } from 'workbox-broadcast-update';
import { StaleWhileRevalidate } from 'workbox-strategies';
import { registerRoute } from 'workbox-routing';
Затем создается маршрут для кэширования ресурсов с добавлением плагина:
registerRoute(
({ request }) => request.destination === 'script',
new StaleWhileRevalidate({
cacheName: 'js-cache',
plugins: [
new BroadcastUpdatePlugin({
channelName: 'js-updates',
headersToCheck: ['ETag', 'Last-Modified'],
}),
],
})
);
Пояснение параметров:
channelName — имя канала для отправки сообщений. Оно
должно совпадать с каналом на клиентской стороне для корректного
получения уведомлений.headersToCheck — массив заголовков, которые плагин
будет использовать для определения обновлений. Обычно это
ETag или Last-Modified.На клиентской стороне используется API BroadcastChannel
для получения сообщений о обновленных ресурсах:
const channel = new BroadcastChannel('js-updates');
channel.addEventListener('message', (event) => {
const { cacheName, updatedURL } = event.data;
console.log(`Ресурс обновлен в кэше ${cacheName}: ${updatedURL}`);
// Здесь можно реализовать логику обновления UI или перезагрузки данных
});
Сообщения содержат следующую структуру:
cacheName — имя кэша, где произошло обновление.updatedURL — URL обновленного ресурса.oldResponse и newResponse — объекты ответа
до и после обновления (если необходим доступ к данным).BroadcastUpdatePlugin позволяет фильтровать уведомления через метод
filter. Например, уведомлять только о JS-файлах:
new BroadcastUpdatePlugin({
channelName: 'js-updates',
filter: ({ request, oldResponse, newResponse }) => {
return request.destination === 'script';
},
});
Это удобно для исключения из уведомлений изображений, CSS или других статических файлов, которые не требуют немедленной реакции приложения.
Background Sync.ETag/Last-Modified.BroadcastUpdatePlugin обеспечивает гибкую и мощную систему уведомлений о кэшированных ресурсах, делая взаимодействие приложения с пользователем более динамичным и отзывчивым.