Tengo algunas cosas para desarrollar, por ejemplo, simulacros con los que no me gustaría inflar mi archivo de compilación distribuido.
En RequireJS, puede pasar una configuración en un archivo de complemento y, de manera conditonal, requerir cosas en función de eso.
Para el paquete web, no parece haber una forma de hacer esto. En primer lugar, para crear una configuración de tiempo de ejecución para un entorno, he usado resolve.alias para volver a señalar un requerimiento según el entorno, por ejemplo:
// All settings.
var all = {
fish: 'salmon'
};
// `envsettings` is an alias resolved at build time.
module.exports = Object.assign(all, require('envsettings'));
Luego, al crear la configuración del paquete web, puedo asignar dinámicamente a qué archivo envsettings
apunta (es decir webpackConfig.resolve.alias.envsettings = './' + env
).
Sin embargo, me gustaría hacer algo como:
if (settings.mock) {
// Short-circuit ajax calls.
// Require in all the mock modules.
}
Pero obviamente no quiero construir esos archivos simulados si el entorno no es simulado.
Posiblemente podría volver a apuntar manualmente todos esos requisitos a un archivo de código auxiliar usando resolve.alias nuevamente, pero ¿hay alguna forma que se sienta menos hacky?
¿Alguna idea de cómo puedo hacer eso? Gracias.
fuente
Respuestas:
Puede utilizar el complemento de definición .
Lo uso haciendo algo tan simple como esto en el archivo de compilación de su paquete web, donde
env
está la ruta a un archivo que exporta un objeto de configuración:y luego esto en tu código
Eliminará este código de su archivo de compilación si la condición es falsa. Puedes ver un trabajo ejemplo de construcción de Webpack aquí .
fuente
env
. Mirando ese ejemplo, parece que están manejando esa bandera a través de gulp y yargs que no todos están usando."globals": { "ENV": true }
a su .eslintrcNo estoy seguro de por qué la respuesta "webpack.DefinePlugin" es la mejor en todas partes para definir importaciones / requisitos basados en el entorno.
El problema con ese enfoque es que todavía está entregando todos esos módulos al cliente -> verifique con webpack-bundle-analyezer, por ejemplo. Y sin reducir el tamaño de su bundle.js en absoluto :)
Entonces, lo que realmente funciona bien y es mucho más lógico es: NormalModuleReplacementPlugin
Entonces, en lugar de hacer un requisito condicional on_client -> simplemente no incluya archivos no necesarios en el paquete en primer lugar
Espero que ayude
fuente
Utilice
ifdef-loader
. En sus archivos de origen puede hacer cosas comoLa
webpack
configuración relevante esfuente
Terminé usando algo similar a la respuesta de Matt Derrick , pero estaba preocupado por dos puntos:
ENV
(lo que es malo para configuraciones grandes).require(env)
apunta a diferentes archivos.Lo que se me ocurrió es un compositor simple que crea un objeto de configuración y lo inyecta en un módulo de configuración.
Aquí está la estructura de archivos que estoy usando para esto:
El
main.js
sostiene todas las cosas de configuración por defecto:El
dev.js
yproduction.js
único elemento de configuración que anula la configuración principal:La parte importante es la
webpack.config.js
que compone la configuración y usa el DefinePlugin para generar una variable de entorno__APP_CONFIG__
que contiene el objeto de configuración compuesto:El último paso es ahora
config.js
, se ve así (usando la sintaxis de importación y exportación de es6 aquí porque está en el paquete web):En su
app.js
, ahora podría usarimport config from './config';
para obtener el objeto de configuración.fuente
otra forma es usar un archivo JS como
proxy
, y dejar que ese archivo cargue el módulo de interéscommonjs
y lo exporte comoes2015 module
, así:Entonces puede usar el módulo ES2015 en su aplicación normalmente:
fuente
webpack.optimize.UglifyJsPlugin()
, la optimización del paquete web no cargará el módulo, ya que el código de línea dentro del condicional siempre es falso, por lo que el paquete web lo elimina del paquete generadoEnfrentado con el mismo problema que el OP y requerido, debido a la licencia, no incluir cierto código en ciertas compilaciones, adopté el cargador condicional de paquetes web de la siguiente manera:
En mi comando de compilación, establezco una variable de entorno apropiada para mi compilación. Por ejemplo, 'demo' en package.json:
El bit confuso que falta en la documentación que leí es que tengo que hacer esto visible durante todo el procesamiento de compilación asegurándome de que mi variable env se inyecte en el proceso global, por lo tanto, en mi webpack.config / demo.js:
Con esto en su lugar, puedo excluir condicionalmente cualquier cosa, asegurándome de que cualquier código relacionado se elimine correctamente del JavaScript resultante. Por ejemplo, en mis rutas.js, el contenido de demostración se mantiene fuera de otras compilaciones, por lo que:
Esto funciona con webpack 4.29.6.
fuente
He tenido problemas para configurar env en las configuraciones de mi paquete web. Lo que suelo quiero es env conjunto para que pueda ser alcanzado en el interior
webpack.config.js
,postcss.config.js
y dentro de la aplicación en sí punto de entrada (index.js
por lo general). Espero que mis hallazgos puedan ayudar a alguien.La solución que se me ocurrió es pasar
--env production
o--env development
, y luego establecer el modo dentrowebpack.config.js
. Sin embargo, eso no me ayuda a hacerenv
accesible donde quiero (ver arriba), por lo que también necesito establecerloprocess.env.NODE_ENV
explícitamente, como se recomienda aquí . La parte más relevante que tengo awebpack.config.js
continuación.fuente
Use variables de entorno para crear implementaciones de desarrollo y producción:
https://webpack.js.org/guides/environment-variables/
fuente
Si bien esta no es la mejor solución, puede funcionar para algunas de sus necesidades. Si desea ejecutar un código diferente en el nodo y el navegador usando esto funcionó para mí:
fuente