1 つの方法は、私が「ウィンドウ プロキシ」と呼んでいるものを作成することです....
で指定する cdn でワーカーをホストしたいとしますnew Worker('at.yourCDN.com/worker.js')
。このワーカーは、同じドメインのさまざまなタブが共有状態を維持できるようにする SharedWorker である可能性があります。おそらく、このワーカーが異なるドメインのすべてのタブにもアクセスできるようにしたいでしょう。つまり、ワーカーをサービス/サーバー プラットフォームとして使用したいと考えています。
問題: 別のドメインにある、またはファイル プロトコルを使用する Worker()/SHAredWorker() を指すことはできません。
これは私が今週テストするものです:
- CDN や file:// プロトコルなど、SharedWorker() 専用の場所を用意します。
- 新しいウィンドウまたは iframe を使用してこの場所を開きます。
- このウィンドウまたは iframe を介して、このワーカーへのすべての対話を代理的に対話させ、メッセージをワーカーに転送します。このウィンドウ/iframe は、ワーカーをプルするか、インライン ワーカーである DOM 内のスクリプト タグにすぎません。
詳細: このワーカーにアクセスする必要があるウィンドウ/タブでa を実行し、ワーカーに対してa を実行myWindow.postMessage('my message')
させます。myWindow
port.postMessage(myMsg)
私が言ったように、私はまだこれをテストしていませんが、これが役立つことを願っています.
また、ヘッドレス ブラウザ、または CORS を備えた「Forever Server」を実行して、iframe インジェクションと window.postMessageing を大幅に軽減できることを期待しています。
解決策が見つかったら投稿します。
************************************ EDIT ************************************
を使用して状態を共有する方法について調査しSharedWorker
ました。同じドメインの複数のタブだけでなく、複数のドメイン間で状態を共有する方法についても調査しSharedWorker
ました。これは解決策ではありませんが、FileReader
API からワーカーを構築する方法を示すコードは次のとおりです。
//DOM コード:
<b>1</b>
<input id="uploadImage" type="file" name="myPhoto" onchange="onSelect();" autofocus="true" />
<script>
var fReader = new FileReader();
fReader.onload = function(e){
var blob = new Blob([e.target.result], {type: 'text/javascript'});
var blobURL = URL.createObjectURL(blob);
var w = new SharedWorker(blobURL);
w.port.onmessage = function(e){
console.log('%%^', e);
};
w.port.start();
w.port.postMessage('Echo');
};
function onSelect(e){
var file = document.getElementById("uploadImage").files[0];
var dataURL = fReader.readAsText(file);
}
</script>
// デスクトップ上のワーカー ファイルのコード:
var ports = ports || [];
self.onconnect = function(e){
var port = e.ports[0];
ports.push(port);
port.addEventListener('message', function(e){
port = e.target;
ports.forEach(function(p){
p.postMessage('gWorker:: ' + e.data);
});
}, false);
port.start();
};
可能な解決策:
CDN-Worker に関する限り、FileReader
/は使用できないようです。これは、ローカルにBlobBuilder
「独自の」ものを作成するためです。を介してワーカーコードをピッチすることができる有効なサーバーとして使用できないようですが、 の作成は、これまでに見たのと同じ " "で失敗します。worker object
heap
CORS
CORS
XMLHttpRequest
new Worker('http://from.mycors.com/enabled/server')
DOM Exception 18
SecurityError
最善の解決策は、上記で詳述した「ウィンドウ プロキシ」メソッドです (iframe.postMessage()
独自のワーカーを持つ別のサーバーで iframe を使用し、window.onmessage
メッセージをワーカーに転送する場合)。http 以外の別のインターネット プロトコルを利用する場合、window.postMessage は http を使用することに注意してください。
あるいは、実行に頼った人もいますgoogle-chrome --allow-file-access-from-files
が、これは運用シナリオでは明らかに危険です。
もう 1 つの方法は、おそらく最も堅牢な WebRTC アーキテクチャのランデブー ポイントを作成することです。
これにより、多くの不必要な調査が節約され、より良い解決策が得られることを願っています.
乾杯、