調べたこと、作ったことをメモしています。
こちらに移行中: https://blog.shimazu.me/

MessageChannelを使わずにService WorkerとpostMessageをしよう

Service Workerのテストを書こうとしてメッセージのやりとりにMessageChannelを使おうとしていたところ、同僚氏からこんなことを教えてもらったので備忘録代わりにメモ。

まさにコレだった・・・・

page.html

<script>
self.onload = async () => {
  const controller = navigator.serviceWorker.controller;
  if (!controller) {
    console.log('no controller.');
    console.log('registering...');
    await navigator.serviceWorker.register('sw.js');
    console.log('registered. waiting for activation.');
    await navigator.serviceWorker.ready;
    console.log('ready. please reload the page.');
    return;
  }

  navigator.serviceWorker.addEventListener('message', e => {
    console.log(`received: ${e.data}`);
  });
  navigator.serviceWorker.controller.postMessage('hoge!');
  console.log('sent: hoge!');
}
</script>

sw.js

let x = 0;
self.addEventListener('message', e => {
  console.log(`sw onmessage: ${e.data}`);
  e.source.postMessage(`${++x}`);
});

簡単!