ApiCaller.js
APIサーバーへの呼び出しを生成してデータを取得するモジュール。 constフィールドAPI_URLがあり、サーバーのURLを指します。これはAPI_URL constがdevおよびprod環境で変更されます。
dev環境にデプロイする必要がある場合、そのURL(API_URL)を手動でdev-api-serverを指すように変更する必要があります-その逆。
これらの構成パラメーターはコードの外部に置きたいので、ビルドプロセス中に動的に変更して、異なる設定でビルドできるようにします。
webpackを使用して、javascript、html、cssファイルをバンドルしています。
API_URL
をwebpack configに保存できます:
// this config can be in webpack.config.js or other file with constants
var API_URL = {
production: JSON.stringify('prod-url'),
development: JSON.stringify('dev-url')
}
// check environment mode
var environment = process.env.NODE_ENV === 'production' ? 'production' : 'development';
// webpack config
module.exports = {
// ...
plugins: [
new webpack.DefinePlugin({
'API_URL': API_URL[environment]
})
],
// ...
}
これでApiCaller
でAPI_URL
を定義済み変数として使用できます。これはprocess.env.NODE_ENV
によって異なります:
ajax(API_URL).then(/*...*/);
上記の回答のようにAPI_URL
、異なる環境設定をサポートするAPI_URL_2
およびAPI_URL_3
があると想像してくださいproduction/development/test
var API_URL = {
production: JSON.stringify('prod-url'),
development: JSON.stringify('dev-url')
};
var API_URL_2 = {
production: JSON.stringify('prod-url-2'),
development: JSON.stringify('dev-url-2'),
test: JSON.stringify('test-url-2')
};
var API_URL_3 = {
production: JSON.stringify('prod-url-3'),
development: JSON.stringify('dev-url-3'),
test: JSON.stringify('test-url-3')
};
// get available environment setting
var environment = function () {
switch(process.env.NODE_ENV) {
case 'production':
return 'production';
case 'development':
return 'development';
case 'test':
return 'test';
default: // in case ...
return 'production';
};
};
// default map for supported all production/development/test settings
var mapEnvToSettings = function (settingsConsts) {
return settingsConsts[environment()];
};
// special map for not supported all production/development/test settings
var mapAPI_URLtoSettings = function () {
switch(environment()) {
case 'production':
return API_URL.production;
case 'development':
return API_URL.development;
case 'test': // don't have special test case
return API_URL.development;
};
};
// webpack config
module.exports = {
// ...
plugins: [
new webpack.DefinePlugin({
'API_URL': mapAPI_URLtoSettings(),
'API_URL_2': mapEnvToSettings(API_URL_2),
'API_URL_3': mapEnvToSettings(API_URL_3)
})
],
// ...
}
JSON.stringify
を使用する必要があります。new webpack.DefinePlugin
を複数回定義する必要はありません。 new webpack.DefinePlugin
に渡される1つのオブジェクトでそれを行うことができます-きれいに見えます。define plugin を設定して、次のようにPRODUCTION
変数を定義できます(または、ビルドに異なる構成ファイルを使用する場合はtrue
に代わります)。
new webpack.DefinePlugin({
PRODUCTION: process.env.NODE_ENV === 'production'
})
次に、コードに次のように記述します。
var API_URL = PRODUCTION ? 'my-production-url' : 'my-development-url';
コンパイル中に、WebpackはPRODUCTION
をその値(したがってtrue
またはfalse
のいずれか)に置き換えます。これにより、UglifyJSが式を縮小できるようになります。
var API_URL = <true/false> ? 'my-production-url' : 'my-development-url';
最悪のシナリオは、uglifyが条件式をそのままにしてそのままにすることができないことです。