Estoy tratando de convertir una aplicación angular de gulp a webpack. en gulp utilizo gulp-preprocess para reemplazar algunas variables en la página html (por ejemplo, nombre de la base de datos) dependiendo del NODE_ENV. ¿Cuál es la mejor manera de lograr un resultado similar con webpack?
javascript
webpack
kpg
fuente
fuente
Respuestas:
Hay dos formas básicas de lograr esto.
DefinePlugin
Tenga en cuenta que esto solo reemplazará las coincidencias "tal cual". Es por eso que la cadena tiene el formato que tiene. Podría tener una estructura más compleja, como un objeto allí, pero se entiende la idea.
Medio ambiente
EnvironmentPlugin
usosDefinePlugin
internamente y asigna los valores del entorno para codificar a través de él. Sintaxis Terser.Alias
Alternativamente, podría consumir la configuración a través de un módulo con alias . Desde el lado del consumidor se vería así:
La configuración en sí misma podría verse así:
Digamos que
process.env.NODE_ENV
esdevelopment
../config/development.js
Entonces se mapearía en . El módulo al que se asigna puede exportar configuraciones como esta:fuente
JSON.stringify()
'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`
JSON.stringify('development')
como está podría no ser realmente útil. En cambioJSON.stringify(someVariable)
puede ser bastante!NODE_ENV
a hacer eso. Cómo configurar eso depende de su plataforma.process.env.NODE_ENV
patrón y funciona.Solo otra opción, si desea usar solo una interfaz cli, simplemente use la
define
opción de webpack. Agrego el siguiente script en mipackage.json
:Entonces solo tengo que correr
npm run build-production
.fuente
Investigué un par de opciones sobre cómo establecer variables específicas del entorno y terminé con esto:
Tengo 2 configuraciones de paquete web actualmente:
webpack.production.config.js
webpack.config.js
En mi código obtengo el valor de API_URL de esta manera (breve):
const apiUrl = process.env.API_URL;
EDITAR 3 de noviembre de 2016
Webpack docs tiene un ejemplo: https://webpack.js.org/plugins/define-plugin/#usage
Con ESLint , debe permitir específicamente variables indefinidas en el código, si tiene
no-undef
regla. http://eslint.org/docs/rules/no-undef así:EDITAR 7 de septiembre de 2017 (Crear-Reaccionar-Aplicación específica)
Si no está interesado en configurar demasiado, consulte Crear-Reaccionar-Aplicación: Crear-Reaccionar-Aplicación - Agregar variables de entorno personalizadas . Debajo del capó, CRA usa Webpack de todos modos.
fuente
process.env
, ¿no seprocess.env.PORT
resuelve, por ejemplo,undefined
durante la compilación del paquete web, lo que significa que ya no puede anular el puerto del entorno?Puede pasar cualquier argumento de línea de comandos sin complementos adicionales usando
--env
desde webpack 2:Usando la variable en webpack.config.js:
Fuente
fuente
Puede usar directamente el
EnvironmentPlugin
disponible enwebpack
para tener acceso a cualquier variable de entorno durante la transpilación.Solo tiene que declarar el complemento en su
webpack.config.js
archivo:Tenga en cuenta que debe declarar explícitamente el nombre de las variables de entorno que desea utilizar.
fuente
Para agregar al conjunto de respuestas personalmente, prefiero lo siguiente:
Al usar esto, no hay variables funky env o problemas multiplataforma (con env vars). Todo lo que haces es ejecutar el normal
webpack
owebpack -p
para desarrollo o producción respectivamente.Referencia: problema de Github
fuente
'process.env.NODE_ENV': JSON.stringify('production')
sobreprocess: { env: { NODE_ENV: JSON.stringify('production') } }
. El uso de este último sobrescribirá el objeto del proceso, lo que puede romper la compatibilidad con algunos módulos que esperan que se definan otros valores en el objeto del proceso.Desde mi edición en la publicación anterior por thevangelist no fue aprobada , información adicional.
Si desea elegir el valor de package.json como un número de versión definido y acceder a él a través de DefinePlugin dentro de Javascript.
Luego, importe package.json dentro del respectivo webpack.config , acceda al atributo usando la variable de importación, luego use el atributo en DefinePlugin .
Por ejemplo, cierta configuración en webpack.config está utilizando METADATA para DefinePlugin:
Acceda a esto dentro de cualquier archivo mecanografiado:
La forma más inteligente sería así:
Gracias a ross allen
fuente
Solo otra respuesta que es similar a la respuesta de @ zer0chain. Sin embargo, con una distinción.
El ajuste
webpack -p
es suficiente.Es lo mismo que:
Y esto es lo mismo que
Por lo tanto, es posible que solo necesite algo como esto en el
package.json
archivo Node:Solo algunos consejos de DefinePlugin :
Que esto es para que puedas comprobar si escribes
webpack --help
fuente
Para agregar al conjunto de respuestas:
Use ExtendedDefinePlugin en lugar de DefinePlugin
ExtendedDefinePlugin es mucho más simple de usar y está documentado :-) enlace
Debido a que DefinePlugin carece de buena documentación, quiero ayudar, diciendo que en realidad funciona como #DEFINE en c # .
Por lo tanto, si desea comprender cómo funciona DefinePlugin, lea la documentación de c # #define. enlace
fuente
Prefiero usar el archivo .env para diferentes entornos.
env.dev
a .env en la carpeta raízenv.prod
a .envy en código
utilizar
require('dotenv').config(); const API = process.env.API ## which will store the value from .env file
fuente
Encontré que la siguiente solución es la más fácil de configurar variable de entorno para Webpack 2:
Por ejemplo, tenemos una configuración de paquete web:
Agregar variable de entorno en Webpack:
Defina la variable del complemento y agréguela a
plugins
:Ahora, cuando ejecute el comando webpack, pase
env.NODE_ENV
como argumento:Ahora puede acceder a la
NODE_ENV
variable en cualquier parte de su código.fuente
Desde Webpack v4, simplemente configurando
mode
su configuración de Webpack establecerá elNODE_ENV
para usted (a través deDefinePlugin
). Documentos aquí.fuente
Aquí hay una manera que me ha funcionado y me ha permitido mantener SECAS mis variables de entorno reutilizando un archivo json.
fuente
No soy un gran fan de ...
... ya que no proporciona ningún tipo de seguridad. en cambio, terminas aumentando tus cosas secretas, a menos que agregues un paquete web a gitignore 🤷♀️ hay una mejor solución.
Básicamente, con esta configuración, una vez que compila su código, todas las variables env del proceso se eliminarán de todo el código, no habrá un solo proceso.env.VAR gracias al complemento de babel
transform-inline-environment-variables
PS si no desea terminar con un montón de indefinidos, asegúrese de llamar a env.js antes de que webpack llame a babel-loader, por eso es lo primero que llama webpack. la matriz de vars en el archivo babel.config.js debe coincidir con el objeto en env.js. ahora solo hay una cosa para cortar. agregue un.env
archivo coloque todas sus variables env allí, el archivo debe estar en la raíz del proyecto o siéntase libre de agregarlo donde lo desee, solo asegúrese de establecer la misma ubicación en el archivo env.js y también agréguelo a gitignoreSi quieres ver todo el babel + webpack + ts obtenlo de heaw
https://github.com/EnetoJara/Node-typescript-babel-webpack.git
y la misma lógica se aplica para reaccionar y todos los demás 💩
env.js
archivo webpack sin troll de complementos
babel.config.js
fuente
No sé por qué, pero nadie menciona realmente la solución más simple. Esto funciona para mí para nodejs y gruñido. Como para muchas personas, el paquete web puede ser confuso, simplemente puede usar la siguiente línea:
process.env.NODE_ENV = 'production';
Con la solución anterior, realmente no necesita usar envify o webpack. A veces, la solución simple codificada puede funcionar para algunas personas.
fuente