如何通过环境自定义Node.js中的公共js文件?

时间:2012-07-31 22:18:47

标签: javascript node.js express

我正在尝试根据环境自定义公共JavaScript文件。具体来说,对于socket.io,我正在尝试自定义客户端将连接到的位置:

发展:

var socket = io.connect('http://localhost/chat');

生产:

var socket = io.connect('http://xxx.xxx.xxx.xxx/chat');

我知道应用程序本身内部的环境变量(我通过express使用节点环境变量),但从我可以看出这些变量不会触及我正在为客户端服务的公共静态js文件。

基于开发/生产环境实现此上下文切换的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您正在编写不引人注目的JavaScript并使用正确的捆绑系统,那么您提供的每个HTML页面应仅引用一个“加载器”脚本,然后该脚本负责引入所有其余脚本。创建该脚本的两个版本,一个用于开发,一个用于生产,并为它们指定不同的名称。在呈现HTML时,请将脚本的名称设置为您根据环境设置的模板变量。然后,您的加载器脚本可以设置适当的变量,以供它带来的脚本使用。

答案 1 :(得分:0)

我接近它的方法是在布局页面中加载socket.io:

<script src='<%= socketIoUrl %>/socket.io/socket.io.js'></script>

<script type="text/javascript">
    var socket = io.connect('<%= socketIoUrl %>');
</script>

然后我添加了一个动态帮助器来公开socketIoUrl

var helpers = function(app) {

    app.dynamicHelpers({
        socketIoUrl: function(req, res) {
            return app.settings.socketIoUrl;
       }
    });
};

module.exports = helpers;

所以在我的server.js文件中,我根据环境设置了适当的值并加载了帮助文件:

app.configure('development', function(){
    app.set('socketIoUrl', 'http://localhost:3003');
});

app.configure('test', function(){
    app.set('socketIoUrl', 'http://...');
});

app.configure('production', function(){
    app.set('socketIoUrl', 'http://...');
});

require('./apps/helpers')(app);

现在,您可以在布局页面中使用您拥有的任何其他js文件中创建的socket变量。