SharedWorker については、インターネットと StackOverflow で多くの議論とチュートリアルが行われてきましたが、2 つの共有ワーカー間で直接データを渡すという最も基本的な目標を実際に達成したものはありません。
私にとって、専用の Web ワーカーに対する SharedWorker の強みは、前者が異なるタブ、iframe、およびスレッドを介して直接通信できることです。私は次のことを試しました:
(shared.html:)
<!DOCTYPE html><html><head></head><body>
<button onclick="init('a')">Initiate A</button>
<button onclick="init('b')">Initiate B</button>
<script>
var a,b;
function init(v) {
if (v=='a'){
a = (new SharedWorker('./shared.js')).port;
a.start();
a.postMessage({type:'start', port:b})
} else {
b = (new SharedWorker('./shared.js')).port;
b.start();
b.postMessage({type:'start', port:a}); // <== error here
}
}
</script></body></html>
(共有.js)
let peer = null;
onconnect = function (ev) {
let port = ev.ports[0];
port.onmessage = (e) => {
if (e.data.type=='start' && e.data.port){
peer=e.data.port;
} else if (e.data.type=='msg' && peer){
setInterval(()=>{
peer.postMessage({type:'msg',msg:'greetings!'});
},2000);
}
}
port.start();
}
[Initiate A] をクリックしてから [Initiate B] をクリックすると、コンソールに次のエラー メッセージが表示されました。
shared.html:15 Uncaught DOMException: 'MessagePort' で 'postMessage' を実行できませんでした: 転送されなかったため、MessagePort を複製できませんでした。
つまり、ポートを渡すことができませんでした。
SharedWorker もまったく同じです。ほとんどの場合、通常の専用 Worker で十分なようです。