使用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,但它会工作。
现在我最近使用express
和socket.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,再加上我需要切换dev
和stage
variables值之间的值。
这个问题最好的解决办法是什么?
谢谢
更新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和节点应用程序之间共享代码挣扎!