2013-02-13 2 views
27

オプションでモジュールを定義し、それを自分のコードで使用するかどうかを知りたいと思っています。私が検討している特定の状況は、モック/スタブモジュールをデバッグ/テスト環境にロードすることですが、ライブに行くときはロードしません。 JSファイルは、必要に応じて(擬似コード)ロードされるHTMLファイルにrequirejsを使用すると、モジュールがロードしようとせずに定義されているかどうかを確認できますか?

:両方real_serviceとmock_service上記で

//index.cshtml 
... 
<script src="/Scripts/lib/require.js"></script> 
<script src="/Scripts/app/service_user.js"></script> 
<script src="/Scripts/app/real_service.js"></script> 
#if DEBUG 
<script src="/Scripts/app/mock_service.js"></script> 
#endif 

デバッグバージョンにロードされなければならない。ここでの例です。

各モジュールはrequirejs、例えば使用して定義されます:「

//service_user.js 
define(['require', 'real_service'], 
    function (require, real_service) { 
     if (require.isDefined('mock_service')) { // 'isDefined' is what I wish was available 
      var mock = require('mock_service'); 
      mock.init(real_service); 
     } 

     ... 
    }); 

だから私の想定元本:サービスを使用する際にその後、私はmock_serviceが定義されているかどうかを確認したいと思います

//mock_service.js 
define('mock_service', [], 
    function() { 
     ... 
    }); 

//real_service.js 
define('real_service', [], 
    function() { 
     ... 
    }); 

をisDefined '関数は定義されている与えられた名前(または名前?)を持つモジュールをチェックするだけです。私のコードでは、それが定義されている場合、私はそれを要求して使用することができます。そうでない場合は、それも良いです。

重要なことは、オプションモジュールをロードしようとしていないことです。私はtry/requireステートメントの周りにキャッチすることができますが、それはサーバーからそれをロードしようとすると、私はそれを望んでいないの原因になります。

別のオプションは、私が常に読み込むスタブ定義を持つことで、実際に必要かどうかを調べることができます。

require.jsに深く関わっている人がいますが、この機能が必要であり、実装のための戦略を策定していますか?

は、私はちょうどこのために自分を探していた、事前にロブ

答えて

41

David Wolfの回答は、私のニーズを完全に満たしていませんでしたが、

問題は非同期的に要件を解決する必要があるため、私が与えた例でDavidの提案require.defined('mock_service')falseを返しますが、まだ解決されていません。

これを調べると、別の機能が見つかりましたspecified。例ではrequire.specified('mock_service')trueを返しますが、まだ解決されていないため、require('mock_service')を使用して参照を取得しようとすると失敗します。

幸いにも、コールバックバージョンのrequireを使用することで、簡単に修正できます。私たちはすべて一緒に置いています:

if (require.specified('mock_service')) { 
    require([ 'mock_service' ], function (mock) { 
     mock.init(real_service); 
    }); 
} 

@David Wolf - ありがとう、あなたの助けなしにそこにいないでしょう。

56

をありがとう、グローバル必要はモジュール名を取り、trueまたはfalseを返し、その上に「定義された」メソッドを持っています。

// returns true 
require.defined("my/awesome/defined/module"); 

// returns false 
require.defined("not/yet/loaded"); 
+0

Thx - これは私のニーズにほぼ合致し、私が今追加して完全な解決策としてマークした正しい答えを見つけるのを助けました。 – WooWaaBob

+0

+1素晴らしい答えと素晴らしい機能は、この1つについて知りませんでした! – thomaux

+0

ちょうど好奇心が強い、アーモンドバージョンの代替品があれば? –

関連する問題