我试图更好地了解requirejs,并对define()的工作原理提出疑问。我有一个简单的html页面,通过以下脚本标记加载requirejs。
<script data-main="scripts/main.js" src="scripts/require.js"></script>
main.js包含:
console.log("in main");
require.config({
baseUrl: 'scripts'
});
define('temp_module', ['module3'], function(t) {
console.log("ta: ", t);
return {
"sundry": t.input
}
});
&#13;
module3.js包含:
define(function() {
return {
input: "output"
}
});
&#13;
我所期望的是define语句将定义和缓存名为&#39; temp_module&#39;的新模块。取决于回调函数返回的内容。回调函数接受module3的返回值。此时,如果稍后需要,则缓存temp_module和module3。
显然,这不应该是如何表现的,因为我只能在主要&#34;中获得#34;控制台中的输出,而不是回调函数中的console.log。
任何人都可以纠正我对这应该如何运作的理解吗?
感谢。
答案 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根据路径给出模块名称。