2

build.dojotoolkit.org (初めての試み) を使用して、dojo.js、dojox.js、dijit.js の 3 つのレイヤーでマルチレイヤー ビルドを作成しました。各 js ファイルは、独自のフォルダー (dojo、dojox、dijit) にアップロードされます。

コードを実行すると、dijit.js を調べて、dijit.form.TextBox のようなフォーム モジュールを取得することが期待されます。しかし、代わりに dijit/form/TextBox.js をロードしようとし、もちろん 404 エラーで終了します。

私は何を間違っていますか?

役立つ場合は、ファイルがここにあります: http://usermanagedsolutions.com/Demos/Pages

4

1 に答える 1

1

ページのスクリプト タグに各レイヤーを手動で含めます。

<script src="path/to/dojo.js" />
<script src="path/to/dojox.js" />
<script src="path/to/dijit.js" />

これにより、ビルドで定義したすべてのモジュールが利用可能になります。テキスト・ボックスが必要な場合、Dojo はコードがあることを認識し、XHR 呼び出しを行いません。

個々のファイルを使用するつもりはありませんが、それらをサーバーに配置することもできます。このように、誰かがファイルをビルドに追加するのを忘れた場合、発生するペナルティは、javascript エラーではなく、xhr リクエストになります。


Re:AMD

上記の方法でレイヤーをインクルードすると、ビルドにインクルードしたすべてのモジュールが読み込まれるわけではありません。xhr リクエストを行うことなく、定義関数を利用できるようにするだけです。

ビルドから出力された js ファイルを見ると、ファイルには、呼び出されたときにモジュールを定義する関数へのモジュール パスのマップが含まれています。

したがって、次のコードを書くと

require(["dijit/form/TextBox"], function(TextBox){
  ...
});

AMD は、dijit/form/TextBoxがすでに定義されているかどうかを最初に判断します。その場合、オブジェクトを取得してコールバックを実行します。

モジュールがまだ定義されていない場合、AMD はそのキャッシュを調べて、定義コードが利用可能かどうかを確認します。スクリプト ファイルを含めると、定義関数のキャッシュが提供されます。AMD は、モジュールを定義するコードを見つけます。この定義関数を呼び出し、結果はコールバックに渡されるオブジェクトです。後続の requiredijit/form/TextBoxも、上記のようにこのオブジェクトを使用します。

モジュールがまだ定義されておらず、AMD が定義関数をキャッシュ内に見つけられない場合、AMD はサーバーに XHR 要求を返し、特定のモジュール コードを見つけようとします。XHR 呼び出しの結果は、define 関数を提供する必要があります。AMD は関数を呼び出し、結果をオブジェクトとして使用してコールバックに渡します。繰り返しになりますが、後続の requiredijit/form/TextBoxもこのオブジェクトを使用します。

Dojo ビルドは、1) コードを縮小し、2) サーバーから要求する必要がある少数のファイルに結合する機能を提供します。

AMD では、変更を加えることなく、(ビルド ファイルまたは個々のファイルを使用して) どちらの環境でも実行できるコードを作成できます。

于 2012-12-10T20:03:29.720 に答える