2012-02-11 6 views
9

私はRequirejsとBackbonejsを使ってうまく動作するアプリケーションを作っていますが、時には実際には減速しています...たとえば、算術演算を行う場合などです!Requirejsを使用してWeb Workersをモジュールビルドに使用する方法は?

マイ・モジュール(traffic.js):

define(["jquery", "use!underscore", "use!backbone", "namespace" ], 
    function ($, _, Backbone, globals) { 
    ..... 
    var worker = new Worker("arithmetic.js"); 
    worker.addEventListener('message', function(e) { 
     console.log(e.data); 
    }, false); 

    worker.postMessage(globals.data); // Send data to our worker. 
    }); 

arithmetic.js:私はこのようなこの算術演算作業を行うために、Webワーカーを使用しようとした

define(["use!underscore", "use!backbone" ], 
    function ($, _) { 
     //Here die Operations 
}); 

をしかし、私はエラーがある定義が定義されていない!

thisでも試しましたが成功しませんでした。

Web Workerをrequirejsまたはbackbonejsに挿入する方法

ありがとうございます!

答えて

12

ウェブワーカーからのrequireJSを使用できます。詳しくはAPI docsをご覧ください。

Webワーカーの開始時にrequireJSをロードする必要があるのは、importScripts(…)です。ロードされたら、defineを使用し、通常のようにrequireJSを使用できます。

私は仕事にそれを得ていた私のための重要な部分はあなたにも、あなたのアプリの残りの部分で使用しているウェブワーカーの同じブートストラップコンフィギュレーション(例えばconfig.jsまたはmain.js)をロードしていることを確認しました。これは、次のようなときにドキュメントが言います。

require()が読み込むスクリプトを見つけるためには、baseUrl設定オプションを設定する必要があります。

もう一つは、あなたがthis requireJS pluginを利用(代わりにスクリプトパスをハードコーディングの)モジュールIDを使用してtraffic.jsファイルから労働者をロードすることができるということです。

+0

Webワーカーをロードして開始することができますが、 'add()'が 'require(function {}) 'ブロック内で完了した場合、' postMessage() 'に応答しません。ワーカーのイベントリスナーは、さまざまなrequirejsモジュールを呼び出す必要があります。あなたが言及したAPIドキュメントの例、つまりhttps://github.com/jrburke/requirejs/blob/master/tests/workers.jsは、 'onmessage'リスナーを設定しません。何か案は? – Fuhrmanator

+0

@Fuhrmanatorまた、onmessage'イベントハンドラを直接設定することもできます(ただし、addEventListenerは常にJavaScriptのninjasによって推奨されます)。 (http://www.html5rocks.com/jp/tutorials/workers/basics/)。 ** Webワーカー用のrequireJSプラグインを使用する場合は、onmessage構文**を使用してください。ネイティブワーカーが利用できない場合は、プラグインに含まれているpolyfill fake-worker.jsは機能しません。 –

+1

@puro_nervio私はそれを最終的に動作させることができました。私が見つけた実例では、作業者が 'addEventListener()'を実行する前にメインスレッドに返信するために 'postMessage()'を実行していました。私の問題は、スレッドが準備ができていなかったということだと思っています。いくつかのモジュールのrequirejsには時間がかかるので、 'addEventListener'はメインスレッドが' postMessage() 'を実行して何かを開始する前に実行されませんでした。言い換えると、メインスレッドは最初にそれと同期しなければなりません。 – Fuhrmanator

関連する問題