4

私はBeSpinをハッキングしてCDNで機能させようとしており、JSONPを使用するように変換することで、theme.lessに対するXHRクロスドメインリクエストを乗り越えました。私が直面している次の問題は、js_fileが別のドメインにある新しいWorker(js_file)です。

どうすれば/Worker()のクロスドメインを有効にできますか?

ワーカーにソースコードを直接提供できますか?(つまり、別のファイルが埋め込まれた超大型のJavaScriptファイルを作成します)[これは理想的とは言えませんが、機能するはずです]。

4

2 に答える 2

2

これを試して:

  • ワーカーのコードで関数を作成する
  • 関数の文字列表現 (.toString) を取得し、最初と最後の行を削除します。これで、ワーカーのコードを含む文字列ができました
  • 新しい BlobBuilder を作成します ( window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder)
  • それにワーカー文字列を追加します
  • getBlob() を呼び出してブロブを取得する
  • ウィンドウの URL (window.URL || window.webkitURL) を使用する createObjectURL を使用してオブジェクトの URL を作成する
  • ワーカーにその URL を使用します

これがコードです

function getUrlForWorker(workerFunction) {
    var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder,
    URL = window.URL || window.webkitURL,
        mainString = workerFunction.toString(),
        bodyString     = mainString.substring( mainString.indexOf("{")+1, mainString.lastIndexOf("}") ),
        bb = new BlobBuilder()

    bb.append(bodyString)

    return URL.createObjectURL(bb.getBlob())
}
于 2011-06-24T13:34:05.420 に答える
0

1 つの方法は、私が「ウィンドウ プロキシ」と呼んでいるものを作成することです....

で指定する cdn でワーカーをホストしたいとしますnew Worker('at.yourCDN.com/worker.js')。このワーカーは、同じドメインのさまざまなタブが共有状態を維持できるようにする SharedWorker である可能性があります。おそらく、このワーカーが異なるドメインのすべてのタブにもアクセスできるようにしたいでしょう。つまり、ワーカーをサービス/サーバー プラットフォームとして使用したいと考えています。

問題: 別のドメインにある、またはファイル プロトコルを使用する Worker()/SHAredWorker() を指すことはできません。

これは私が今週テストするものです:

  1. CDN や file:// プロトコルなど、SharedWorker() 専用の場所を用意します。
  2. 新しいウィンドウまたは iframe を使用してこの場所を開きます。
  3. このウィンドウまたは iframe を介して、このワーカーへのすべての対話を代理的に対話させ、メッセージをワーカーに転送します。このウィンドウ/iframe は、ワーカーをプルするか、インライン ワーカーである DOM 内のスクリプト タグにすぎません。

詳細: このワーカーにアクセスする必要があるウィンドウ/タブでa を実行し、ワーカーに対してa を実行myWindow.postMessage('my message')させます。myWindowport.postMessage(myMsg)

私が言ったように、私はまだこれをテストしていませんが、これが役立つことを願っています.

また、ヘッドレス ブラウザ、または CORS を備えた「Forever Server」を実行して、iframe インジェクションと window.postMessageing を大幅に軽減できることを期待しています。

解決策が見つかったら投稿します。

************************************ EDIT ************************************

を使用して状態を共有する方法について調査しSharedWorkerました。同じドメインの複数のタブだけでなく、複数のドメイン間で状態を共有する方法についても調査しSharedWorkerました。これは解決策ではありませんが、FileReaderAPI からワーカーを構築する方法を示すコードは次のとおりです。

//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 objectheapCORSCORSXMLHttpRequestnew Worker('http://from.mycors.com/enabled/server')DOM Exception 18SecurityError

最善の解決策は、上記で詳述した「ウィンドウ プロキシ」メソッドです (iframe.postMessage()独自のワーカーを持つ別のサーバーで iframe を使用し、window.onmessageメッセージをワーカーに転送する場合)。http 以外の別のインターネット プロトコルを利用する場合、window.postMessage は http を使用することに注意してください。

あるいは、実行に頼った人もいますgoogle-chrome --allow-file-access-from-filesが、これは運用シナリオでは明らかに危険です。

もう 1 つの方法は、おそらく最も堅牢な WebRTC アーキテクチャのランデブー ポイントを作成することです。

これにより、多くの不必要な調査が節約され、より良い解決策が得られることを願っています.

乾杯、

于 2013-08-12T18:15:38.463 に答える