AMDモジュールを使用すると、define()内でrequire()を使用しても構いませんか(またはなぜ)

StackOverflow https://stackoverflow.com/questions/7835116

  •  27-10-2019
  •  | 
  •  

質問

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:

  1. 実行時の条件により、ビルド時(またはロード時に)必要なモジュールがわからない
  2. あなたは、それらが必要になるまでいくつかのモジュールのロードを延期することを明示的に望んでいます
  3. 機能検出の結果に基づいてモジュールのバリエーションをロードしたい(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 電話。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top