Dojo模块一般加载

时间:2014-11-21 07:02:28

标签: javascript dojo

来自Java / C#我很难理解作为开发人员对我来说实际上意味着什么(我想太多面向对象)。

假设有两个html文件在脚本标记中通过require()使用相同的Dojo模块,如下所示:

<script type="text/javascript">
require(["some/module"],    
   function(someModule) {    
      ...
   }            
);
</script>

我理解require()在调用回调方法之前加载所有给定的模块。但是,是否为每个require()加载了模块?所以在上面的示例中,一些/模块被加载一次,然后在两个HTML之间共享,或者它被加载两次(即在需求列表中列出的每个需求中加载)?

如果模块只加载一次,那么我可以在两个回调之间共享信息吗?如果加载两次,我怎么能在这两个回调之间共享信息?

官方文档说&#34;全局函数define允许您使用加载器注册模块。 &#34 ;.这是否意味着定义类似于静态类/方法?

2 个答案:

答案 0 :(得分:4)

如果在同一窗口中加载模块两次,它只会加载模块一次并在第二次请求时返回相同的对象。

所以,如果您有两个单独的页面,那么它将有两个窗口,这意味着它将加载模块两次。如果要共享信息,则必须将其存储在某处(Web是无状态的),您可以使用后端服务+数据库,或者您可以使用HTML5 localStorage API或IndexedDB(例如)。

如果您不想要,则可以始终使用单页应用程序。这意味着您将使用JavaScript(异步页面)在一个窗口中加载多个页面。


关于您的上一个问题...使用define()定义模块。模块可以是一个简单的对象(它类似于静态类,因为您不必实例化),但模块也可以是原型,这意味着您将能够创建实例,例如: / p>

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/ContentPanedojo/dnd/Moveable,...),那么它通常意味着模块需要实例。当模块以小写字母开头时,它是一个静态类/单例(例如dojo/_base/declaredijit/registry

答案 1 :(得分:1)

1)dojo require,加载模块一次,如果再次调用它require() will simply return if the package is already loaded.,那么请求将被调用一次,它也会调用任何依赖项。

但是,如果您在同一个HTML页面中,如果您离开页面并在不同的页面中调用相同的模块,则会从服务器调用它。您还可以在配置设置中使用缓存,这样就可以在浏览器中缓存内容,如果您想要新的副本,则将cacheBust设置为true,如果您想要缓存内容,则将其设置为false。 / p>

2)如果您在同一个html页面和域中,模块没有更改模块将是相同的,您可以共享值,您可以从任何地方获得任何更改,除非您调用新实例。但是在不同的html页面之间不可能。

3)并不像我所理解的静态方法A static class can be used as a convenient container for sets of methods that just operate on input parameters and do not have to get or set any internal instance fields.那样不像静态类或方法。 dojo的工作方式不同,如果您以这种方式执行它,它就是对象的引用:

define(function(){
    var privateValue = 0;
    return {
        increment: function(){
            privateValue++;
        },

        decrement: function(){
            privateValue--;
        },

        getValue: function(){
            return privateValue;
        }
    };
});

这意味着每一段代码都加载该模块将引用内存中的同一对象,因此在使用该模块时该值将是相同的。

当然这是我的理解,请随时告诉我哪里错了。