A simple method to make the JS client apps deployment environment-aware

When writing client apps, we usually need to connect to the data server. However, this connection is typically different for production and test environments. This post describes a simple way I’ve come up with to solve this little problem.

The client scripts are expecting to read in the environment somehow. A JS file reads it in as some variable say:

var env;

Okay, the client read in the configuration from a config file that we access using jQuery like so:

var env;
$.getJSON( 'config.js', function( json ) {
       env = json;
});

And in the configuration file, is a JSON structure for example:

file: config.json
{
    data_server : 192.168.1.31:4005
}

However, that value is different for different deployment environments. So let’s say we save all the different configurations in another file e.g:

file: config_all.json
{ 
    TEST : { data_server : 192.168.1.31:4005 },
    PROD : { data_server : 192.168.1.31:3005 }
}

And we’ll need a simple script that can generate the config.json from the config_all.json file. Something like:

$ configure_env PROD
or
$ configure_env TEST

From a project directory standpoint, the config.json file needs to be accessible within the browser while the config_all.json file should be outside. So we end up something like the following structure:

project/tools/configure_env
project/tools/config_all.json
project/www/js/config.json

Here’s a simple implementation of configure_env in perl:

#!/usr/bin/env perl

use strict;
use warnings;
use Path::Tiny qw/path/;
use JSON;

my $env = $ARGV[0] || 'TEST';   # Defaults to TEST environment
my $source_file = 'tools/config_all.js';
my $target_file = 'www/js/config.js';

my $config_all = decode_json path($source_file)->slurp();
path($target_file)->spew(encode_json $config_all->{$env});

Now, whenever we need to add an environment-specific value, we just open up config_all.js and put in the value we need and on the client, it becomes accessible.

And then later on, to retrieve the configuration in perl, we do the following:

use JSON qw/decode_json/;

my $env = init_environment('config.json');
my $dbfile = $env->{dbfile};

sub init_environment {
    my $config_file = shift;
    return decode_json path($config_file)->slurp;
}
Written on November 28, 2014