requirejs定义了预期的行为

时间:2017-07-13 22:42:01

标签: javascript requirejs

我试图更好地了解requirejs,并对define()的工作原理提出疑问。我有一个简单的html页面,通过以下脚本标记加载requirejs。

<script data-main="scripts/main.js" src="scripts/require.js"></script>

main.js包含:

&#13;
&#13;
console.log("in main");
require.config({
  baseUrl: 'scripts'
});

define('temp_module', ['module3'], function(t) {
  console.log("ta: ", t);
  return {
    "sundry": t.input
  }
});
&#13;
&#13;
&#13;

module3.js包含:

&#13;
&#13;
define(function() {

  return {
    input: "output"
  }
});
&#13;
&#13;
&#13;

我所期望的是define语句将定义和缓存名为&#39; temp_module&#39;的新模块。取决于回调函数返回的内容。回调函数接受module3的返回值。此时,如果稍后需要,则缓存temp_module和module3。

显然,这不应该是如何表现的,因为我只能在主要&#34;中获得#34;控制台中的输出,而不是回调函数中的console.log。

任何人都可以纠正我对这应该如何运作的理解吗?

感谢。

2 个答案:

答案 0 :(得分:0)

缺少的部分是您没有任何需要加载public sealed class Circle { // … } 的内容。当RequireJS处理temp_module时,它正在寻找名为data-main="scripts/main.js"的模块。它找到你的文件main并执行它,但其中没有名为scripts/main.js模块,因此加载就在那里结束。

您可以将main的名称更改为temp_module,或者完全删除该名称,然后它应该可以使用。

删除名称后,您所拥有的是匿名main电话。 RequireJS允许每个文件进行一次匿名define调用。匿名define调用在加载时获取与其关联的模块名称。 RequireJS使用请求模块时使用的模块名称,并将此名称与define相关联。在您的情况下,名称将是define。这是因为您的模块需要通过main属性,并且此属性需要进行一些特殊处理,因为它必须用于提供路径以加载模块和初始< em>模块名称。当RequireJS处理您的data-main值时,它会逐字地使用该值来确定要加载的路径。但是,它通过删除data-main并且仅保留路径的最后部分来创建模块名称,因此从.js获取模块名称scripts/main.js。然后,它将在路径中加载文件,并在文件中查找名为main的模块。由于只有一个匿名main,因此define定义define模块并调用回调。

答案 1 :(得分:0)

已定义的模块未加载&#34;直到某人要求(包括)。

在你的main.js中,只需:

require([ 'module3' ], function (module3) {
  ...
});

另外,除非您有特定的理由,否则请避免自己给模块指定明确的名称(例如&#34; temp_module&#34;)。让RequireJS根据路径给出模块名称。