実際には、AMDモジュールのインスタンスは常に1つだけです。これは、(ソース):
defineには、すぐには明らかにならない可能性のある2つの追加の重要な特性があります。
- モジュールの作成は遅延して非同期であり、defineが呼び出されてもすぐには発生しません。これは、ファクトリが実行されず、実行中のコードが実際にモジュールを必要とするまで、モジュールの依存関係が解決されないことを意味します。
- モジュール値がモジュール名前空間に入力されると、要求されるたびに再計算されることはありません。実際のレベルでは、これはファクトリが1回だけ呼び出され、戻り値がキャッシュされ、特定のモジュールを使用するすべてのコード間で共有されることを意味します。(注:dojoローダーには、モジュール値の定義を解除する非標準関数require.undefが含まれています。)
さらに、ファクトリ関数だけを提供する必要はありません。オブジェクトリテラルも提供できます。
define("some/module", {
someValue: "some",
otherValue: "other"
});
次に、コード内の別の場所:
require(["some/module"], function(module) {
console.log("module.someValue", module.someValue); // some
module.someValue = "some changed";
});
require(["some/module"], function(module) {
console.log("module.someValue", module.someValue); // some changed
});
より堅牢なソリューションにはのインスタンスが含まれているため、変更を加えたり、カスタムセッターとゲッターを定義したりdojo/Stateful
できます。watch
define("some/stateful-module", ["dojo/Stateful"], function(Stateful){
var stateful = new Stateful({
someValue: "some",
otherValue: "other"
});
return stateful;
});
次に、コード内の別の場所:
require(["some/stateful-module"], function(module) {
console.log("stateful-module.someValue:", module.get("someValue"));
module.watch(function(name, oldValue, newValue) {
console.log("stateful-module: property"
, name
, "changed from"
, "'" + oldValue + "'"
, "to"
, "'" + newValue + "'"
);
});
});
require(["some/stateful-module"], function(module) {
module.set("someValue", "some changed");
});
jsFiddleでどのように機能するかを確認してください:http://jsfiddle.net/phusick/fHvZf/。そこには単一のファイルがありますが、モジュールを使用しない限り、アプリケーション全体で同じように機能require.undef(mid)
します。