1

我正在使用 Backbone.js 和 require.js 开发前端,一切进展顺利,直到我需要创建一个名为 config.js 的文件来存储一些默认值以在整个应用程序中使用它

下面是 config.js 文件的代码

// Filename: config.js
define([''], function(){        

var baseUrl = "http://localhost:8888/client/",
apiServer = "http://api-server:8888";

return function(type){
    return eval(type);
};

});

在我的一个观点中,我会定义 config.js 然后我可以访问两者的值

var baseUrl = "http://localhost:8888/client/",
apiServer = "http://api-server:8888";

通过下面的这行代码,我将它放在我的应用程序的任何 *.js 文件中

var baseUrl = config('baseUrl');
console.log(baseUrl); //prints out this > http://localhost:8888/client/

这里的问题是我正在使用 eval 来获取我需要检索的值的值,我知道这不是安全的使用方法,但任何人都可以提出安全的解决方案

4

2 回答 2

2

RequireJS 让您可以像定义更复杂的模块一样定义对象。您可以拥有一个配置模块,然后在需要它的任何其他文件中使用它。

在 config.js 中,您可以执行以下操作:

define({
    baseUrl:"http://localhost:8888/client/",
    apiServer:"http://api-server:8888"
});

然后在其他模块中要求它:

//someotherfile.js , defining a module
define(["config"],function(config){
   config.baseUrl;// will return the correct value here
   //whatever
});

旁注:您可以使用实际的全局状态(在窗口上定义变量),但我强烈建议您不要这样做,因为这会使测试变得困难,并且会使依赖关系隐式而不显式。应始终首选显式依赖项。在上面的代码中,与全局不同的是,使用它的模块需要配置是非常清楚的。

请注意,如果您想要不是有效标识符的值,您也可以使用括号语法config["baseUrl"],这两个(that 和config.baseUrl)在 JavaScript 中是相同的。

于 2013-08-22T21:04:18.253 回答
1

作为替代解决方案(并且比 Benjamin 的更丑),您可以将两个 url 放入一个对象中:

define([''], function(){        

    var urls = {
        baseUrl: "http://localhost:8888/client/",
        apiServer: "http://api-server:8888"
    };

    return function(type){
        return urls[type];
    };

});

不过,简单地导出一个对象要干净得多。

于 2013-08-22T21:13:08.197 回答