我试图弄清楚RequireJS是如何运作的,但是RequireJS网站在解释基础知识时非常不清楚,特别是关于如何使用'要求'并且'定义'方法
我运行了以下示例:
//module1.js
define([], function () {
var returnedModule = function () {
var _name = 'whoa I am a module';
this.getName = function () {
return _name;
}
};
return returnedModule;
});
//main.js
require(['module1'], function(temp_reference){
var m = new temp_reference();
console.log("created module: " + m.getName());
});
// ... some other code ...
// now, if I need the module1.js again, do I need to require it again??
我的问题:我是否需要"要求"这个module1.js文件每次我想用它做什么? (在这种情况下,从临时引用创建一个新的m()对象)。
我是否可以将require调用的结果保存在某个地方,而不是仅在回调中使用它?
修改
我认为我可以通过这种方式保持参考来解决问题:
// keep the required module available
var myModule = require("module1");
但这会产生错误: module1尚未加载。
答案 0 :(得分:1)
要求JS是AMD - 异步模块定义,这意味着模块会在您需要时加载到文档中。它为JavaScript代码提供了功能范围/模块化方法,例如Java中的 import 关键字或C#中的使用关键字。
现在回答您的问题:是的,您需要在require模块中引用已定义的模块,以获取其作为功能参数的参考。
例如,请考虑以下代码
define('a', {
add: function(x, y){
return console.log(x + y);
}
});
// Use the module (import)
require(['a'], function(a){
a.add(1, 2);
});
require(['a'], function(a){
a.add(4, 6);
});
在此代码上下文中, a - 是模块定义,由其他模块导入以访问已定义模块的 add()方法。
要求JS构造模块树并使用模块的名称保存此树中的所有已定义模块。在这个例子中,它是 - a (这称为命名模块)
可以通过开发控制台
访问此树window.requirejs.s.contexts._.defined.a
我的输出结果如下:
何时加载外部模块文件要求JS创建<script>
标记并将其附加到文档<head>
考虑您的示例:
工作plunker链接:http://plnkr.co/edit/eNQkcfwftkYSY00wMPeI?p=preview
执行以下入口点代码时
HTML:
<script src="xdomain/require.js" data-main="script"></script>
JS:
require(['module1'], function(temp_reference){
var m = new temp_reference();
console.log("created module: " + m.getName());
});
要求JS附加2个文件,即 script.js (在HTML头部的脚本标记中引用为主脚本文件),其次是 module1.js (在script.js中引用)
将此文件异步附加到头部后,将执行模块中的代码,并将模块的结果推送到requirejs模块树,如前所述。
稍后,这些模块将根据您作为数组传递给require函数的依赖项定义注入到参考模块中。
require([{{YOUR_DEPENDENCIES}}],function({{INJECTED_REFERENCES}}){ - 你的代码 - });
这是您要实现的目标(不建议)
http://plnkr.co/edit/5SYoNf8xNL1DcMfjuy0Y?p=preview
var myModule; //Global variable
require(['require', 'module1'], function(require){
myModule = require("module1");
var m = new myModule();
console.log("created module: " + m.getName());
});
你也可以试试这个Hacky!
http://plnkr.co/edit/Rr34HlhOiyja6XnwH8fw?p=preview
var myModule; //Global variable
require(['module1'], function(){
myModule = window.requirejs.s.contexts._.defined.module1;
var m = new myModule();
console.log("created module: " + m.getName());
});
要求JS提供javascript模块化方法并按需加载脚本而不是预先加载到内存中。这节省了一些内存,也有助于提高Web应用程序的速度。您的代码会自动构建,并且易于维护。