36

オプションでモジュールを定義して、それをコードで使用するかどうかを指定できるようにしたいと考えています。私が検討している特定の状況は、デバッグ/テスト環境でモック/スタブ モジュールをロードすることですが、ライブに移行するときではありません。次に例を示します。

html ファイルでは、js ファイルがオプションでロードされます (疑似コード):

//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

上記では、real_service と mock_service の両方をデバッグ バージョンにロードする必要があります。

各モジュールは、requirejs を使用して定義されます。

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

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

次に、サービスを使用するときに、mock_service が定義されているかどうかを確認したいと思います。

//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);
        }

        ...
    });

したがって、私の概念的な「isDefined」関数は、指定された名前 (または名前?) が定義されているモジュールをチェックするだけです。次に、コードで定義されている場合は、それを要求して使用できます。そうでないなら、それもいい。

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

別のオプションは、常にロードするスタブを定義することです。そのため、必要なモックが常に存在し、それが本物かどうかを問い合わせることができますが、それも無駄に思えます。

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

前もってありがとう、ロブ

4

2 に答える 2

63

私はこれを自分で探していました.requireグローバルには、モジュール名を取り、trueまたはfalseを返す「定義済み」メソッドがあります。

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

// returns false
require.defined("not/yet/loaded");
于 2013-02-13T22:27:20.070 に答える
47

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

問題は、 require が要件を非同期に解決することです。そのため、私が示した例では、指定されているにもかかわらずまだ解決されていないため、 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 - ありがとう、あなたの助けがなければそこにたどり着くことができなかったでしょう.

于 2013-02-22T16:41:43.877 に答える