如果您在同一个窗口中加载模块两次,它将只加载一次模块,并在第二次请求时返回相同的对象。
所以,如果你有两个独立的页面,那么它将有两个窗口,这意味着它将加载模块两次。如果您想共享信息,则必须将其存储在某处(Web无状态),您可以使用后端服务+数据库,也可以使用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/_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
)