使用node和angularjs为configuration文件设置自动化

我几周前在AngularJS开始了一个应用程序。 我所有的configurationvariables都存储在像这样的常量:

/** * defines constants for application */ define(['angular'], function (ng) { 'use strict'; return ng.module('app.constants', []) .constant('CONFIG', { node_port: 3700, api_host: 'api.acme.local', node_host: 'acme.com', facebook_app_id: 'xxxxxxxxx' }); }); 

我遇到的问题是每次我想在舞台上推送我的应用程序时,我需要更改此值。 我正在使用rsync所以我可以忽略这个文件,并在舞台服务器上修改一次。 这可能不是最好的解决scheme,但它会工作。

现在我最近使用expresssocket.io添加了一个nodejs服务器到我的应用程序,这意味着我现在必须在我的angularjs应用程序和server.js设置客户端。 因为我正在使用requirejs我还需要更新socket.io的path。

requirejs:

 paths: { 'jquery': 'bower_components/jquery/dist/jquery.min', ... 'socketio': 'http://acme.local:3700/socket.io/socket.io' }, 

和我的server.js

 var express = require('express'), debug = true, http = require('http'), _ = require('underscore'), server = express(), port = 3700, api_host = 'api.acme.local', io = require('socket.io').listen(server.listen(port), {log: debug}); ... var options = { hostname: api_host, port: 80, path: '/courses', method: 'GET' }; var req = http.request(options, function(res) { var output = ''; res.setEncoding('utf8'); res.on('data', function (chunk) { output += chunk; }); ... 

所以基本上,我结束了我的节点应用程序和angular度应用程序的重复variables,再加上我需要切换devstagevariables值之间的值。

这个问题最好的解决办法是什么?

谢谢


更新1

刚刚发现requirejs有一个path的故障转移选项,所以现在我使用它:

 paths: { 'jquery': 'bower_components/jquery/dist/jquery.min', ... 'socketio': [ 'http://stage.acme.com:3700/socket.io/socket.io', 'http://acme.local:3700/socket.io/socket.io' ] }, 

仍在研究如何正确地做到这一点

我和你有相同的configuration。

基本上,这是我的架构:

  • angular的“前”文件夹
  • 阳极的“后退”文件夹
  • angular度和节点之间共享文件的“公共”文件夹

  • 通用文件夹中的环境中的一个特定configuration文件(通过angular度和节点进行锐化)

  • i18n语言环境中的一个特定的configuration文件(通过angular度和节点分割)
  • 由Grunt在运行时/build立时间填充的“常量型”angular模块

和安装了几个模块的Grunt。 然后 :

  • 在特定环境中运行nodejs服务器时,只加载环境configuration文件。
  • 当打包angularjs时,这个相同的文件被用来创build常量types的“angular度模块”,这个键值来自静态的JSONconfiguration文件。
  • i18n内容模块也是一样

这样,双方,angular和nodejs共享相同的configuration和同步configuration。

有关此行为的示例,请参阅我的详细和Grunt动力的答案: 如何基于获取的环境variablesdynamic地设置AngularjJS基本URL? :


我personnaly做这种grunt的东西。

当我运行我的angular度应用程序时,我有多个任务:

 > grunt run --target=dev > grunt run --target=prod > grunt build --target=dev > grunt build --target=prod > etc... 

然后grunt在grunt-preprocess模块的帮助下做stringreplace:

我的constants.tpl.js文件被parsing:

 [...] baseUrl: '/* @echo ENV_WS_URL */', [...] 

并且URL被填充。

有无限的可能性(stringreplace,文件复制等)。

做咕噜确保dev的configuration文件不会在生产中例如..

如果你有兴趣,我可以提供更多的细节,但我只想告诉你一个不同的方法。

编辑gruntFile例子:

 'use strict'; module.exports = function(grunt) { /** * Retrieving current target */ var target = grunt.option('target') || 'dev'; var availableTargets = [ 'dev', 'prod' ]; /** * Load environment-specific variables */ var envConfig = grunt.file.readJSON('conf.' + target + '.json'); /** * This is the configuration object Grunt uses to give each plugin its * instructions. */ grunt.initConfig({ env: envConfig, /*****************************************/ /* Build files to a specific env or mode */ /*****************************************/ preprocess: { options: { context: { ENV_WS_URL: '<%= env.wsUrl %>' } }, constants: { src: 'constants.tpl.js', dest: 'constants.js' } }, karma: { unit: { configFile: '<%= src.karma %>', autoWatch: false, singleRun: true }, watch: { configFile: '<%= src.karma %>', autoWatch: true, singleRun: false } } }); /****************/ /* Plugins load */ /****************/ grunt.loadNpmTasks('grunt-preprocess'); /*******************/ /* Available tasks */ /*******************/ grunt.registerTask('run', 'Run task, launch web server for dev part', ['preprocess:constants']); }; 

现在,命令:

 > grunt run --target=dev 

将创build一个新的文件“constants.js”与Angular将使用的特定于环境的URL

我已经看到了更好的答案:

假设你有一个像这样的Angular模块的客户端configuration:

 angular.module('config', []) .constant('configuration', { API_END_POINT: 'localhost:3000', APP_END_POINT : "localhost:9000", "ORIGIN_HOST" : "localhost:3000", 'ENVIRONMENT' : 'dev' }); 

您希望将这些常量放入您的nodejs环境中,以保持常量规范。 你不想要一些超级复杂的模块使事情变得混乱。

只需在服务器端定义一个“假angular”,然后抓住你的常量。

 /* inside nodejs now */ var CONSTANTS; angular = { module : function() { return { constant: function(name, constants) { CONSTANTS = constants; } } } } require("../web/scripts/config.js"); console.log(JSON.stringify(CONSTANTS)); // easy peasy 

认为这可能会帮助你们中的一些人在Angular和节点应用程序之间共享代码挣扎!