19

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)内ではなく、main関数を介して渡されるべきだと思ったので、これは混乱を招きます。require()

この背後にある理由はありますか?

4

1 に答える 1

28

require()モジュールで 使用する理由はいくつかあります。

ただし、最初に、正しいrequire変数への参照を要求していることを確認してください。あなたの例では、への参照requireグローバルです。モジュールのコンテキストをスコープとする への参照がrequire必要です (「ローカルの require」と呼ばれることもあります)。かんたんだよ:

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」など) が正しく解決されるようにするためです。require(これが理由の 1 つです。curl.js にはデフォルトでグローバルがありません。)


local を使用する理由require:

  1. 実行時の条件により、ビルド時 (またはロード時) に必要なモジュールがわからない
  2. 一部のモジュールのロードを、必要になるまで明示的に延期したい場合
  3. 機能検出の結果に基づいてモジュールのバリエーションをロードしたい (ただし、dojo の「has!」プラグインのようなものがより良い解決策かもしれません (申し訳ありませんが、私を逃れるリンク))

最後に、AMD はrequire、CommonJS Modules/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呼び出しをスキャンして依存関係を見つけます。

于 2011-10-20T11:43:25.363 に答える