javascript - htmlwebpackplugin - webpack externals
Cambie las constantes de url codificadas para diferentes entornos a través de webpack (2)
Puede configurar el complemento de definición para definir una variable de PRODUCTION
siguiente manera (o, alternativamente, a true
si utiliza diferentes archivos de configuración para las compilaciones):
new webpack.DefinePlugin({
PRODUCTION: process.env.NODE_ENV === ''production''
})
Luego en tu código escribirás algo como:
var API_URL = PRODUCTION ? ''my-production-url'' : ''my-development-url'';
Durante la compilación, el paquete web reemplazará a PRODUCTION
con su valor (por lo tanto, true
o false
), y esto debería permitir que UglifyJS minimice nuestra expresión:
var API_URL = <true/false> ? ''my-production-url'' : ''my-development-url'';
El peor de los casos es que uglify no pueda minimizar la expresión condicional dejándola como está.
Tengo un módulo ApiCaller.js
que genera llamadas a nuestro servidor api para obtener datos. Tiene el campo const API_URL que apunta a la url del servidor. Esta API_URL constará cambios para los entornos dev y prod .
Entonces, cuando necesito implementar en el entorno dev , necesito cambiar esa url ( API_URL ) manualmente para apuntar a dev-api-server y viceversa.
Quiero que estos parámetros de configuración estén fuera del código y, durante el proceso de compilación, quiero cambiarlos dinámicamente para poder construir con diferentes configuraciones.
Estoy usando un paquete web para empaquetar mis archivos javascript, html, css.
Puedes almacenar tu API_URL
en la configuración del paquete web:
// 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]
})
],
// ...
}
Ahora en tu ApiCaller
puedes usar API_URL
como variable definida, que será diferente dependiendo de process.env.NODE_ENV
:
ajax(API_URL).then(/*...*/);
(editar) ¿Si tengo más que configuración de producción / desarrollo para diferentes constantes de entorno?
Imagina que tienes API_URL
como en la respuesta anterior, API_URL_2
y API_URL_3
que deberían admitir diferentes configuraciones de entorno de 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)
})
],
// ...
}
(editar 2)
- Si pasa una cadena como una constante de entorno, debe usar
JSON.stringify
. - No es necesario que defina el
new webpack.DefinePlugin
.new webpack.DefinePlugin
varias veces. Puede hacerlo en un objeto pasado a unnew webpack.DefinePlugin
- se ve más limpio.