【问题标题】:Dojo module loading in general一般的 Dojo 模块加载
【发布时间】:2014-11-21 07:02:28
【问题描述】:

来自 Java/C#,我很难理解这对我作为开发人员的实际意义(我认为面向对象太多了)。

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

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

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

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

官方文档说“全局函数定义允许你向加载器注册一个模块。”。这是否意味着定义类似于静态类/方法?

【问题讨论】:

    标签: javascript dojo


    【解决方案1】:

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

    因此,如果您有两个单独的页面,那么它将有两个窗口,这意味着它将加载该模块两次。如果您想共享信息,则必须将其存储在某个地方(网络是无状态的),您可以使用后端服务 + 数据库,或者您可以使用 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/ContentPanedojo/dnd/Moveable、...),通常意味着该模块需要实例。当模块以小写字母开头时,它是一个静态类/单例(例如dojo/_base/declaredijit/registry

    【讨论】:

      【解决方案2】:

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

      但是如果你在同一个 HTML 页面中,如果你离开页面并在不同的页面中调用相同的模块,那么它将从服务器调用。您还可以在配置设置中使用缓存,以便将内容缓存在浏览器中,如果您想要一个新的副本,则将 cacheBust 设置为 true,如果您希望缓存内容,则设置为 false。

      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;
              }
          };
      });
      

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

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

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 1970-01-01
        • 2012-10-10
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多