我正在尝试根据环境自定义公共JavaScript文件。具体来说,对于socket.io,我正在尝试自定义客户端将连接到的位置:
发展:
var socket = io.connect('http://localhost/chat');
生产:
var socket = io.connect('http://xxx.xxx.xxx.xxx/chat');
我知道应用程序本身内部的环境变量(我通过express使用节点环境变量),但从我可以看出这些变量不会触及我正在为客户端服务的公共静态js文件。
基于开发/生产环境实现此上下文切换的最佳方法是什么?
答案 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
变量。