【问题标题】:I've just compiled some dojo files together: How do I call a function inside the anonymous wrapper?我刚刚编译了一些 dojo 文件:如何在匿名包装器中调用函数?
【发布时间】:2015-02-05 05:10:27
【问题描述】:

我今天是第一次编译我的一些道场资料。为简单起见,我在与这头野兽搏斗时将所有内容(dojo.js 除外)编译到一个名为 all.js 的文件中。

但在 all.js 中,我有一个入口点,它完全密封在我需要调用的这个匿名函数中,但我不太清楚如何获得它。

这是文件的开头:

require({cache:{
'dojo/dom-geometry':function(){
 define(["./sniff", "./_base/window","./dom", "./dom-style"],
    function(has, win, dom, style){
// module:
//      dojo/dom-geometry

// the result object
var geom = {
    // summary:
    //      This module defines the core dojo DOM geometry API.
};
//dom-geometry continues on for awhile....

还有我感兴趣的部分,在第 14798 行!如何调用 CreateActivityEntryPoint?

   //end of previous part
    return singleton;
});

},
'app/Activity/Create':function(){


function CreateActivityEntryPoint()
{
    //do things here.
}

下面是后面的部分:

}, //closing bracket of Activity/Create anon function
'dojo/dom-attr':function(){
define(["exports", "./sniff", "./_base/lang", "./dom", "./dom-style", "./dom-prop"],
        function(exports, has, lang, dom, style, prop){
    // module:

在我的主页视图中,我只需要调用入口点。以前它只是在窗口对象上,但现在不是了!如何从这个“缓存:”对象中调用 Create.js 文件函数?

我试过了:

require(["app/Activity/Create"], function (create) {
          create.CreateActivityEntryPoint();
      });

但 create 似乎是未定义的。

【问题讨论】:

  • 看来我需要正确定义我的代码模块,以便它们可以相互调用。我想明天的工作就是解决这个问题。
  • 我认为您需要 define 模块而不是 require。您需要将您的require({cache:{..... 替换为define({cache:{.....require 用于要求模块,而 define 用于定义模块。 define 返回一个具有一组属性和方法的模块,可以调用这些属性和方法与模块进行交互。
  • 你能告诉我们app/Activity/Create的源代码之前构建过程。它应该包含一个define 调用。
  • 我认为你是对的。我真的很高兴在我的 javascript 变得太大之前尝试编译它。
  • @frank,永远不需要直接修改构建层模块。 require({cache: ... }) 调用是一种机制,层可以通过该机制直接填充 AMD 加载程序的缓存,关键是可以一次填充多个模块,以便稍后通过 requiredefine 引用它们的模块 ID 将加载它们来自加载器的缓存,而不是实际生成服务器请求并尝试单独加载每个文件。

标签: javascript dojo dojo-build


【解决方案1】:

通常,您在编译自定义层后以与以前相同的方式访问函数——通过requiredefine 获取对模块的引用并传递模块的标识符。 (这就是层内的代码也继续工作的方式。)唯一的区别是,对于构建的层,您只想在层加载后才执行此操作(否则加载器最终会为您的单个模块发出请求实际上并不希望它生成,因为它应该通过图层将它们全部加载在一起)。

如果您的层对应于暴露您需要调用的函数的顶级入口点,您将层直接构建到 dojo/dojo 中,以便您的所有模块都可用dojo.js 加载(下面会详细解释),您不需要做任何特别的事情 - 只需 require([ 'app/myEntryPoint' ], function (entryPoint) { ... }) 并在 require 回调中调用您需要调用的函数。

否则,如果您的层不对应于暴露您需要调用的函数的顶级入口点,并且您编译一个单独的层而不是直接构建到 dojo/dojo 中,您将需要稍微退出在尝试与其他代码交互之前确保您的层已加载的方法,以避免对实际位于该层中的各个模块的多余请求:

require([ 'app/layer' ], function () {
    require([ 'app/moduleWithEntryPoint' ], function (moduleWithEntryPoint) {
        moduleWithEntryPoint.entryPoint(...);
    });
});

此回复的其余部分谈到了理想的构建配置文件配置。

通常,为了便于维护和使用而组织层的推荐方法是围绕应用程序的顶级入口点模块创建一层;理想情况下,这个入口点将传递地包括应用程序的所有依赖项。例如,app/main 可能是您的入口点;它可能取决于app/UI,这是您的顶级应用程序小部件,它将依赖于进一步的小部件、商店等,并且依赖链将继续向下。

围绕顶级模块定义层非常简单,因为构建会自动包含层的模块 ID 引用的模块,并自动包含所有传递依赖项:

layers: {
    'app/main': {}
}

不过,为了进一步减少请求,您可以将此层直接构建到 dojo.js

layers: {
    'dojo/dojo': {
        boot: true, // This layer includes the Dojo loader
        customBase: true, // Override the default of including all of dojo/_base
        include: [ 'app/main' ]
    }
}

在这两种情况下,当您执行require([ 'app/main' ], function (app) { ... }) 时,它最终会从require 缓存中提取所有单独的依赖项,同时仍将main 模块的返回值交给您,因此您可以访问任何用于初始化应用程序的函数。

【讨论】:

  • 这个 freenode dojo 频道是寻求帮助的更好地方吗?
  • 好吧,我已经减少了很多要求!我最终编译成单个 dojo 文件。但是:仍有一堆 xhr 请求通过。例如,它 xhr 请求 dojo/sniff。但是dojo sniff肯定是在新编译的dojo文件中。不知道怎么了...
  • 无论是在这里还是在 IRC 上,我们都可能需要查看更多代码来帮助解决这个问题(即,试图加载层但最终仍然加载额外模块的页面是什么样的) . IRC 通常在美国时区的白天活跃,但有时也有几个人来自新西兰地区或附近。
  • 我会看看我自己能走多远,我还没有研究很多构建选项。感谢您的帮助肯,我很感激!
  • 设置 data-dojo-config="async:1" 使我的 dojo 相关请求减少到 2 个:一个用于 css 文件,一个用于 dojo.js。这太棒了!
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多