实际上总是只有一个 AMD 模块实例,因为(来源):
define 有两个额外的重要特征,可能不是很明显:
- 模块创建是惰性和异步的,并且在调用 define 时不会立即发生。这意味着工厂不会被执行,并且模块的任何依赖关系都不会被解析,直到某些正在运行的代码实际需要该模块。
- 一旦模块值被输入到模块命名空间中,它就不会在每次被要求时重新计算。在实际层面上,这意味着factory 只被调用一次,并且返回的值被缓存并在使用给定模块的所有代码之间共享。(注意: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
进行更改并定义自定义setter和getter:
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)
它在那里的单个文件中,但除非您使用模块,否则它将在整个应用程序中以相同的方式工作。