如果你在同一个窗口中加载了两次模块,它只会加载一次,第二次请求时返回相同的对象。
因此,如果您有两个单独的页面,那么它将有两个窗口,这意味着它将加载该模块两次。如果您想共享信息,则必须将其存储在某个地方(网络是无状态的),您可以使用后端服务 + 数据库,或者您可以使用 HTML5 localStorage API 或 IndexedDB(例如)。
如果您不想这样,您可以随时使用单页应用程序。这意味着您将使用 JavaScript(异步页面)在一个窗口中加载多个页面。
关于您的最后一个问题...使用define() 定义模块。模块可以是简单的对象(类似于静态类,因为您不必实例化),但模块也可以是原型,这意味着您将能够创建实例,例如:
define([], function() {
return {
"foo": function() {
console.log("bar");
}
};
});
这将在您每次需要时返回相同的单个对象。您可以将其视为静态类或单例。如果你需要它两次,那么它将返回相同的对象。
不过,你也可以这样写:
define([], function() {
return function() {
this.foo = function() {
console.log("bar");
};
};
});
这意味着您正在返回一个原型。使用它需要你实例化它,例如:
require(["my/Module"], function(Module) {
new Module().foo();
});
原型设计是 JavaScript 的一项基本功能,但在 Dojo 中有一个模块可以为您做这件事,称为 dojo/_base/declare。你会经常看到这样的事情:
define(["dojo/_base/declare"], function(declare) {
return declare([], {
foo: function() {
console.log("bar");
}
});
});
在这种情况下,您必须以类似于原型的方式加载它(使用 new 关键字)。
您可以在Plunker 上找到所有这些的演示。
您可能会问,如何区分单例/静态类模块和原型模块...嗯,它有一个通用的命名约定。当您的模块以大写字母开头时(例如dijit/layout/ContentPane、dojo/dnd/Moveable、...),通常意味着该模块需要实例。当模块以小写字母开头时,它是一个静态类/单例(例如dojo/_base/declare、dijit/registry)