BroadcastChannel и postMessage

↑ 7.4 Browser API · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Коммуникация между вкладками, iframe и окнами: синхронизация выхода, тема, авторизация.

BroadcastChannel

Сообщения между контекстами одного origin (вкладки, iframe, воркеры).

const bc = new BroadcastChannel('auth')
bc.postMessage({ type: 'logout' })
bc.onmessage = e => { if (e.data.type === 'logout') router.push('/login') }
// bc.close() при размонтировании

Применение: единый выход из всех вкладок, синхронизация темы, уведомление об обновлении токена, общий SharedWorker.

window.postMessage

Связь между разными origin: окно, iframe, popup.

// родитель
iframe.contentWindow!.postMessage({ type: 'init', payload }, 'https://widget.example.com')
 
// iframe
window.addEventListener('message', e => {
  if (e.origin !== 'https://app.example.com') return   // ОБЯЗАТЕЛЬНО проверять origin
  handle(e.data)
})

Безопасность: указывайте точный targetOrigin (не *) и проверяйте event.origin при получении.

Другие способы

СпособОсобенности
storage eventсрабатывает в других вкладках при изменении localStorage
SharedWorkerобщий воркер для вкладок
Service Worker + clients.postMessageрассылка от SW
Web Locks APIвыбор лидера среди вкладок
MessageChannelпара портов для прямой связи

Вопросы с ответами