2013-01-21 3 views
3

과거에는 클라이언트 측 응용 프로그램을 개발할 때 항상 일종의 서버 측 응용 프로그램을 사용하여 JavaScript를 패키지하고 제공했습니다. 이를 통해 생산 환경과 개발 환경 사이에서 변화하는 클라이언트에게 환경 변수를 전달할 수있었습니다.RequireJS를 사용하여 시스템 환경 변수를 확인하는 방법

저는 RequireJS를 사용하여 순수한 클라이언트 측 응용 프로그램을 만들고 정적 웹 서버와 함께 제공하고 있습니다. 일부 구성은 앱이 개발 또는 프로덕션에서 로컬로 실행되는지 여부 (즉, AJAX 요청을 생성 할 서버의 URL)에 따라 다릅니다.

RequireJS를 사용하여 현재 환경을 확인하는 가장 좋은 방법은 무엇입니까?

답변

1
// you can store two configs in two separate files 
// FILE NAME: config-development.json: 
// FILE CONTENT: {"url":"http://localhost:8000"} 
// FILE NAME: config-production.json: 
// FILE CONTENT: {"url":"http://google.com"} 

// then load correct one and save it to variable 
var config = getConfig(); 

function getConfig() { 
    // if you pass ?dev=true to your url address default config that will be used is `config-development` 
    // otherwise - `config-production` 
    var configName = getParameterByName('dev', false) ? 'config-development' : 'config-production'; 

    window._config || (window._config = {}); 

    // for production version you should concat your config with main script or put it above main script 
    // inside global `_config` variable for example 
    if (window._config[configName]) return window._config[configName]; 

    // for development version you can just make an ajax call to get the config 
    $.ajax({ 
    url : 'app/' + configName + '.json', 
    async : false, 
    success : function(response) { 
     window._config[configName] = response; 
    } 
    }); 
    return window._config[configName]; 
} 

// helper 
function getParameterByName(name, defaults, location) { 
    location = location || window.location.href; 
    name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]'); 
    var result = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(location); 
    return result === null ? defaults : decodeURIComponent(result[1].replace(/\+/g, ' ')); 
} 

// usage 
console.log(config.url); // `http://localhost:8000` for development env 
         // `http://google.` for production env 
+0

고맙다 - :

여기
define(function() { return { load: function(name, req, load, config) { if (!config.env || config.isBuild) { config.env = 'production'; } var path = name + '/' + config.env; req([path], function(mod) { load(mod); }); } }; }); 

내가 그것을 사용하는 방법입니다. 아마 localStorage에서'env' 변수를 수동으로 설정하는 것만으로도 잘 동작 할 것입니다 (dev = true를 매번 URL에 추가하는 것을 기억할 필요가 없을 것입니다). – scttnlsn

3

내가 발견 한 또 다른 방법은 RequireJS 구성을 직접 사용하는 것입니다. RequireJS 1.1 이후에는 임의의 구성 값을 포함 할 수 있습니다. 내 주요 구성에서 나는 env: 'development '을 설정하고 빌드 중에 (r.js로) 값을 'production'으로 설정합니다.

development.jsproduction.js의 두 파일을 포함하는 config 디렉토리를 만들었습니다. 적절한 파일을로드하는 것은 필요 플러그인을 수행 할 수 있습니다 (우리는 그것을 env 전화 할게) : 꽤 좋은 방법처럼 보인다

var config = require('env!config'); 
관련 문제