如何保持对RequireJS模块的引用?

时间:2015-08-21 12:39:14

标签: javascript requirejs

我试图弄清楚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尚未加载。

1 个答案:

答案 0 :(得分:1)

要求JS是AMD - 异步模块定义,这意味着模块会在您需要时加载到文档中。它为JavaScript代码提供了功能范围/模块化方法,例如Java中的 import 关键字或C#中的使用关键字。

现在回答您的问题:是的,您需要在require模块中引用已定义的模块,以获取其作为功能参数的参考。

例如,请考虑以下代码

http://jsfiddle.net/NssGv/52/

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

我的输出结果如下:

enter image description here

何时加载外部模块文件要求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中引用)

enter image description here

将此文件异步附加到头部后,将执行模块中的代码,并将模块的结果推送到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应用程序的速度。您的代码会自动构建,并且易于维护。