一部の環境で条件付きで2番目のモジュールを必要とするAMDモジュールがあると仮定します。
define(["require"]、function(require){ var myObj = { foo:console.error.bind(console) }; if(browserEnv) require(["./ conditional-polyfill"]、function(polyfill){ myObj.foo = console.log.bind(console、polyfill); }); myObjを返します。//条件付きrequireが満たされる前に戻ります });
問題は、条件付き要求が完了した後、define()呼び出しを遅らせてreturn / callbackを返すにはどうすればよいですか?
つまり、以下のコードは失敗します:
require(["module-from-above"]、function(logger){ logger.foo( "こんにちは!"); //console.errorが呼び出されます });
この問題の解決策についての私の考え:
- インライン
./polyfill
にすると、すべてが機能します。ただし、これは問題を回避するだけであり、すべての場合に機能するとは限りません。理由でモジュール化してほしい。 - 後で実行される代わりに、 Deferredオブジェクトを返すことができます。これはうまくいくでしょうが、いつも電話をかけるのは本当に醜いです。
myObj
./conditional-polyfill
loggerDeferred.then(function(logger){ ... });
- このモジュール用のAMDローダープラグインを作成できます。そして、すべての準備ができたらすぐにコールバックを呼び出します。繰り返しますが、これは機能しますが、独自のローダープラグインは私のビルドツールでは機能しません。
私が考えることができるすべての解決策は、優れたコードよりもハックです。しかし、私の問題はそれほど大げさではないと思います。それで、これをどのように処理するのですか?