Workbox предоставляет удобные механизмы для работы с сервис-воркерами, включая эффективный обмен сообщениями между основным потоком страницы и сервис-воркером. Одним из ключевых инструментов является использование MessageChannel и метода postMessage для двунаправленной коммуникации.
MessageChannel — это стандартный API JavaScript, который
создаёт канал связи между двумя контекстами (например, между страницей и
сервис-воркером). Канал состоит из двух портов:
const channel = new MessageChannel();
const port1 = channel.port1;
const port2 = channel.port2;
Метод postMessage позволяет передавать данные между
клиентом и сервис-воркером. В Workbox он используется как часть более
сложной архитектуры обмена сообщениями, например, при использовании
Workbox Background Sync, Routing или
Precaching.
Пример отправки сообщения из страницы в сервис-воркер:
if (navigator.serviceWorker.controller) {
const channel = new MessageChannel();
channel.port1.onmess age = (event) => {
console.log('Ответ от сервис-воркера:', event.data);
};
navigator.serviceWorker.controller.postMessage(
{ type: 'PING' },
[channel.port2]
);
}
Здесь важно:
{ type: 'PING' }.port2 передается сервис-воркеру для
двунаправленной связи.port1 слушает события и получает ответ.Сервис-воркер, созданный через Workbox, может принимать сообщения
через событие message. С помощью полученного порта можно
отправить ответ обратно клиенту:
self.addEventListener('message', (event) => {
if (!event.data || !event.ports) return;
const port = event.ports[0];
switch (event.data.type) {
case 'PING':
port.postMessage({ type: 'PONG', timestamp: Date.now() });
break;
case 'CACHE_STATUS':
port.postMessage({ type: 'CACHE_STATUS', status: 'ok' });
break;
default:
port.postMessage({ type: 'ERROR', message: 'Unknown command' });
}
});
Особенности:
event.ports[0].С помощью postMessage и MessageChannel
можно узнать состояние кеша Workbox:
navigator.serviceWorker.controller.postMessage(
{ type: 'CACHE_STATUS' },
[channel.port2]
);
Сервис-воркер возвращает актуальные данные о кешированных ресурсах.
При работе с Background Sync можно использовать канал сообщений для отправки подтверждений о выполнении операций, таких как сохранение данных на сервере.
Каждый клиент может открыть собственный MessageChannel,
что позволяет отправлять ответы строго определённому клиенту, не мешая
другим вкладкам.
event.ports перед
использованием.type, payload) для облегчения расширения
протокола.postMessage для повышения
производительности (например, ArrayBuffer).Workbox версии 6+ поддерживает прямую интеграцию с обменом
сообщениями, позволяя комбинировать Routing,
Precaching и Background Sync с
каналами сообщений. Это создаёт архитектуру, где сервис-воркер
становится полноценным контроллером ресурсов, а
MessageChannel обеспечивает надёжное двунаправленное
взаимодействие с клиентскими скриптами.
Использование MessageChannel и postMessage
повышает гибкость управления сервис-воркером, улучшает масштабируемость
приложений и позволяет реализовывать сложные сценарии синхронизации
данных в PWA.