RequireJS - 将参数传递给模块进行初始化

时间:2012-04-25 15:41:42

标签: javascript module requirejs amd

  

可能重复:
  How to load bootstrapped models in Backbone.js while using AMD (require.js)

我目前正在为我们的某个项目创建RESTful API,并且还想提供一个Javascript库来访问它。

由于我喜欢AMD原理并使用require.js,我也会提供AMD模块。 问题是:模块的初始化需要一些信息,比如初始化时的API密钥。

如何在初始化时将这些参数传递到模块中?

5 个答案:

答案 0 :(得分:15)

如果你有类似的话:

define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) {

    var module = {
        ...
    };

    return module;

});

将其更改为:

define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) {
    var module = {
        ...
    };

    var init = function (options) {
        // Initialize here
        return module;

    };

    return init;
});

然后在某处需要你的模块之后,你可以调用来初始化它。如果您需要更复杂的东西并返回工厂,您可能还需要查看工厂模式。

require.js不会限制您返回的内容。它可以是一个简单的对象,一个字符串,一个函数......

答案 1 :(得分:6)

我认为您所寻找的是能够设置模块拾取的配置变量。以下是使用require.js

的示例

How to load bootstrapped models in Backbone.js while using AMD (require.js)

答案 2 :(得分:4)

我想到的另一种可能性是在您请求时使用服务器端脚本来操作模块的源。

例如,当您必须将API密钥传递到模块中时,请执行以下操作:

在进行第一次define()调用之前,请输入以下代码:

require.config({
    paths: {
        api: 'https://api.example.com/api.amd.js?api_key=f615ac61&'
    }
});

这使您可以从以下任何地方简单地要求您的API:

require(['api'], function(api){

});

因此服务器收到请求 - 将它从mod_rewrite映射到某个脚本,获取GET参数并将其放在模块源代码中的正确位置,然后返回自定义源。

这就是我现在解决这个问题的方式,它就像一个魅力,不需要改变开发人员的任何行为,而是利用已经内置到requirejs中的功能。

答案 3 :(得分:1)

我认为你不能用require.js做到这一点,但你可以使用Frame.js或其他模块库。在Frame中你会这样做:

//moduleName.js

(function(exports){
    exports.moduleName = function(args){
        // do stuff
    }
})(window.exports);


// in main js file

var exports = {}; // global variable

Frame('moduleName.js');
Frame(function(next){
    var myArgs = { ... settings ... };
    exports.moduleName(myArgs);
    next();
});
Frame.init();

答案 4 :(得分:0)

是否可以使用命名空间变量,然后在初始化特定库时引用相应的对象?也许我不明白你想要什么require.js要做,但看起来你在任何情况下从你的main.js调用它,所以我很确定它会工作......我不认为你可以像<script = "require.js?apiKey=jsdfhjkfklsjkfdjks">

那样做
var libData = {
   apiKey: "jsdfhjkfklsjkfdjks",
   otherpram: "userIDorsomething"
}

require(libData.apiKey); 

但是如果你需要在页面的url参数中发送apikey,你可以使用这样的脚本来获取参数:

<script>
      function getQueryParams(qs) {
            qs = qs.split("+").join(" ");
            var params = {},
                tokens,
                re = /[?&]?([^=]+)=([^&]*)/g;

            while (tokens = re.exec(qs)) {
                params[decodeURIComponent(tokens[1])]
                    = decodeURIComponent(tokens[2]);
            }

            return params;
        }

// assuming the page is loaded like page.html?apikey=jsdfhjkfklsjkfdjks

     apiKey = getQueryParams(document.location.search).apiKey;

//但是你必须调用require,传递api密钥?

</script>