AMDモジュールを使用すると、define()内でrequire()を使用しても構いませんか(またはなぜ)
質問
AMDモジュールについての私の理解(たとえば、requirejsまたはcurl.jsを使用)は次のとおりです。
require()
異なるモジュールを非同期にロードするために使用され、ロードされるとコールバックFNが実行されます。
モジュールを定義するには、使用する個別のスクリプトがあります define()
しかし、いくつかのモジュールが使用されているのを見てきました require()
その関数定義の内部、例えば
define([a, b, c], function(i, ii, iii){
require([d, e, f], function(d, e, f) {
// do some stuff with these require()'d dependancies
})
/* rest of the code for this module */
})
しかし、モジュールに依存関係がある場合、メインを介して通過する必要があると思っていたので、これは混乱していると思います。 define([dependancies], fnDefinition)
機能し、その中ではありません require()
上記の例によると、そうです。
この背後に理由はありますか?
解決
あなたが使いたいかもしれないいくつかの理由があります require()
モジュールで。
しかし、最初に、正しいものへの参照を要求してください require
変数。あなたの例では、への参照 require
aです グローバル. 。あなたはaへの参照が必要です require
これは、モジュールのコンテキスト(「ローカル要件」と呼ばれることもあります)にscopedされます。かんたんだよ:
define(["a", "b", "c", "require"], function(i, ii, iii, require){
require(["d", "e", "f"], function(moduleD, moduleE, moduleF) {
// do some stuff with these require()'d dependencies
})
/* rest of the code for this module */
});
これが重要な主な理由は、相対モジュールID(「./peermodule」または「../unclepath/cousinmodule ")が正しく解決されるようにすることです。 (これが理由の1つです。Curl.jsにはグローバルがありません require
デフォルトで。)
ローカルを使用する理由 require
:
- 実行時の条件により、ビルド時(またはロード時に)必要なモジュールがわからない
- あなたは、それらが必要になるまでいくつかのモジュールのロードを延期することを明示的に望んでいます
- 機能検出の結果に基づいてモジュールのバリエーションをロードしたい(Dojoの「Have!」プラグインのようなものはより良いソリューションかもしれません(申し訳ありませんが、リンクを避けてください))
最後に、AMDは2回目の使用法を定義します require
CommonJSモジュール/1.1で作成されたモジュールとの互換性については、 define
. 。これらは次のように見えます:
define(function(require, exports, module){
var a = require("pkgZ/moduleA"), // dependency
b = require("pkgZ/moduleB"); // dependency
/* rest of the code for this module */
});
サーバー側のJavaScript開発者は、この形式が魅力的であると感じるかもしれません。 :)
一部のAMDローダー(requirejs 0.2+、Dojo 1.7+、Bdload、curl.js 0.6+など)は、このハイブリッドAMD/CJSM1.1形式を検出し、モジュールをスキャンして依存関係を見つけます。 require
電話。