Construction conditionnelle basée sur l'environnement à l'aide de Webpack
J'ai quelques choses pour le développement - e.g se moque de qui je tiens à ne pas encombrer mon distribué fichier build avec.
Dans RequireJS vous pouvez passer d'une config dans un fichier de plugin et conditonally besoin de choses dans sur cette base.
Pour webpack il ne semble pas être un moyen de le faire. D'abord afin de créer un moteur d'exécution de config pour un environnement j'ai utilisé résoudre.alias à peretochki un besoin en fonction de l'environnement, de l'e.g:
//All settings.
var all = {
fish: 'salmon'
};
//`envsettings` is an alias resolved at build time.
module.exports = Object.assign(all, require('envsettings'));
Puis lors de la création de la webpack config je peut attribuer dynamiquement le fichier envsettings
points (c'est à dire webpackConfig.resolve.alias.envsettings = './' + env
).
Cependant, j'aimerais faire quelque chose comme:
if (settings.mock) {
//Short-circuit ajax calls.
//Require in all the mock modules.
}
Mais évidemment, je ne veux pas construire dans ces se moquer de fichiers si l'environnement n'est pas se moquer.
Je pourrais peut-être manuellement peretochki tous ceux qui nécessite un fichier stub à l'aide de résoudre.alias de nouveau - mais est-il une manière qui se sent moins hacky?
Des idées comment je peux faire? Merci.
- Notez que pour l'instant j'ai utilisé un alias à point à vide (stub) sur les environnements que je ne veux pas (par exemple, require('se moque') pointe vers un fichier vide sur la non-maquette envs. Semble un peu hacky, mais il fonctionne.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le définir plugin.
Je l'utilise en faisant quelque chose d'aussi simple que cela dans votre webpack fichier build où
env
est le chemin d'accès à un fichier qui exporte un objet de paramètres:et puis dans votre code
Il bande ce code de votre fichier de compilation si la condition est fausse. Vous pouvez voir un Webpack construire exemple ici.
env
. En regardant à travers cet exemple, il semble comme si ils sont la manipulation de cet indicateur par gulp et yargs qui pas tout le monde utilise."globals": { "ENV": true }
pour votre .eslintrcwebpack.DefinePlugin
si...var foo = "bar"; ... webpack.DefinePlugin({ENV: JSON.stringify(foo)}) ...
.JSON.stringify
sur l'ensemble des valeurs définies. Webpack insère "tel quel". Voir ici: github.com/webpack/docs/wiki/list-of-plugins#defineplugin. Il devrait être plutôt:ENV: JSON.stringify(require(path.join(__dirname, './path-to-env-files/', env)))
Pas pourquoi la "webpack.DefinePlugin" la réponse est le haut d'un peu partout pour la définition de l'Environnement basé sur les importations/exige.
La problème avec cette approche est que vous êtes toujours à la prestation de tous les modules pour le client -> vérifiez auprès de webpack-bundle-analyezer par exemple. Et de ne pas réduire votre bundle.js's taille à tous 🙂
Donc ce qui fonctionne vraiment bien et beaucoup plus logique est: NormalModuleReplacementPlugin
Donc, plutôt que de faire un on_client conditionnelle nécessite -> juste ne comprennent pas les fichiers nécessaires pour le bundle, en premier lieu,
Espère que ça aide
Utilisation
ifdef-chargeur
. Dans vos fichiers source, vous pouvez faire des trucs commePertinentes
webpack
configuration estJ'ai fini par utiliser quelque chose de similaire à Matt Derrick Réponse, mais était inquiet à propos de deux points:
ENV
(ce Qui est mauvais pour les grosses configs).require(env)
les différents fichiers.Ce que j'ai trouvé est un simple compositeur qui construit un objet de config et l'injecte à une config du module.
Voici la structure du fichier, Iam, en utilisant pour cela:
La
main.js
détient toutes les config par défaut trucs:La
dev.js
etproduction.js
seulement tenir config trucs qui remplace la configuration principal:L'important est le
webpack.config.js
qui compose la config et utilise le DefinePlugin pour générer une variable d'environnement__APP_CONFIG__
qui détient les composés objet de config:La dernière étape est maintenant la
config.js
, il ressemble à ceci (à l'Aide es6 import export de syntaxe ici, car son sous webpack):Dans votre
app.js
vous pouvez maintenant utiliserimport config from './config';
pour obtenir l'objet de config.un autre moyen est d'utiliser un fichier JS comme un
proxy
, et de laisser ce fichier charger le module d'intérêt àcommonjs
, et de l'exporter en tant quees2015 module
, comme ceci:Ensuite, vous pouvez utiliser ES2015 module dans votre application normalement:
webpack.optimize.UglifyJsPlugin()
, l'optimisation de la webpack ne se charge pas le module, comme la ligne de code à l'intérieur de la condition est toujours fausse, donc webpack retirer de l'généré bundleConfrontés au même problème que l'OP et nécessaire, en raison de l'octroi de licences, de ne pas inclure certaines de code dans certaines versions, j'ai adopté le webpack-conditionnel-chargeur comme suit:
Dans ma commande build-je définir une variable d'environnement de manière appropriée pour mon build. Par exemple "démo" dans le paquet.json:
La confusion de bits est absent de la documentation, j'ai lu, c'est que je dois le rendre visible tout au long de la construire de traitement en s'assurant de mon env variable est injecté dans le processus global donc dans mon webpack.config/demo.js:
Dans ce lieu, je peux conditionnellement rien exclure, en s'assurant que tout le code est bien secoué sur le résultant JavaScript. Par exemple, dans mes routes.js le contenu de démonstration est gardé à l'extérieur d'autres constructions ainsi:
Cela fonctionne avec webpack 4.29.6.
Alors que ce n'est pas la meilleure solution, il peut fonctionner pour certains de vos besoins. Si vous souhaitez exécuter un code différent du nœud et de navigateur à l'aide de cette fonctionné pour moi:
Utilisation envirnment variables pour créer de dev et de prod déploiements:
https://webpack.js.org/guides/environment-variables/
J'ai lutté avec le paramètre env dans mon webpack configs. Ce que j'ai l'habitude de voulez est de définir env de sorte qu'il peut être atteint à l'intérieur de
webpack.config.js
,postcss.config.js
et à l'intérieur du point d'entrée de l'application elle-même (index.js
habituellement). J'espère que mes résultats peuvent aider quelqu'un.La solution que j'ai trouvé est de passer en
--env production
ou-- env development
, puis réglez le mode à l'intérieur dewebpack.config.js
.Toutefois, cela ne m'aide pas à faire
env
accessible où je veux (voir ci-dessus), donc j'ai aussi besoin de définirprocess.env.NODE_ENV
explicitement, comme l'a recommandé ici.J'ai créé un minimum de pensions avec des branches
travail
etnot_working
. Comme peut être confirmé dansnot_working
, à l'aide dewebpack.DefinePlugin
pour définirprocess.env.NODE_ENV
comme documenté ici ne fonctionne pas comme prévu.Les plus pertinents de la partie de webpack.config.js de repo suivre ci-dessous.