I'm in the same configuration as you.
Basically, here is my architecture :
- a "front" folder for angular
- a "back" folder for anodejs
a "common" folder for shared files between angular and node
one specific configuration file by environment in the common folder (sharzed by angular and node)
- one specific configuration file by i18n locale in the common folder (sharzed by angular and node)
- a "constant-type" angular module filled in at runtime/buildtime by Grunt
and Grunt with a few modules installed. Then :
- When running nodejs server on a specific environment, only the environment config file is loaded.
- When packaging angularjs, this same file is used to create the constant-type" angular module which keys comes from the static JSON config file.
- same thing for i18n contant module
That way both sides, angular and nodejs shares the same configuration and have synchronized configurations.
For an example of this behavior, see my detailed and Grunt-powered answer here : How to set AngularjJS base URL dynamically based on fetched environment variable? :
I personnaly do this kind of stuff with grunt
.
When I run my angular-app I have multiple tasks :
> grunt run --target=dev
> grunt run --target=prod
> grunt build --target=dev
> grunt build --target=prod
> etc...
Then grunt do strings replacement with the help of the grunt-preprocess
module :
my constants.tpl.js
file gets parsed :
[...]
baseUrl: '/* @echo ENV_WS_URL */',
[...]
and the url is populated.
There are endless possibilities (string replacements, file copy, etc).
Doing it with grunt ensure that dev config files do not go in production for example..
I can put more details if you're interested but I only wanted to show you a different approach.
edit gruntFile example :
'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']);
};
Now, the command :
> grunt run --target=dev
will create a new file "constants.js" with a environment-specific url which will be used by Angular