J'ai des choses à développer - par exemple des moqueries avec lesquelles je ne voudrais pas gonfler mon fichier de construction distribué.
Dans RequireJS, vous pouvez passer une configuration dans un fichier de plugin et exiger conditionnellement des éléments en fonction de cela.
Pour webpack, il ne semble pas y avoir de moyen de le faire. Tout d' abord pour créer une configuration d'exécution pour un environnement que je l' ai utilisé resolve.alias à rejointoyer un besoin en fonction de l'environnement, par exemple:
// All settings.
var all = {
fish: 'salmon'
};
// `envsettings` is an alias resolved at build time.
module.exports = Object.assign(all, require('envsettings'));
Ensuite, lors de la création de la configuration Webpack, je peux attribuer dynamiquement le fichier envsettings
vers lequel pointe (ie 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 créer ces fichiers simulés si l'environnement n'est pas simulé.
Je pourrais éventuellement rediriger manuellement tous ces éléments dans un fichier stub en utilisant à nouveau resolver.alias - mais y a-t-il un moyen qui semble moins piraté?
Des idées comment je peux faire ça? Merci.
la source
Réponses:
Vous pouvez utiliser le plugin define .
Je l'utilise en faisant quelque chose d'aussi simple que cela dans votre fichier de construction Webpack où se
env
trouve le chemin vers un fichier qui exporte un objet de paramètres:et puis ceci dans votre code
Il supprimera ce code de votre fichier de construction si la condition est fausse. Vous pouvez voir un exemple de construction Webpack fonctionnel ici .
la source
env
. En regardant à travers cet exemple, il semble qu'ils gèrent cet indicateur via gulp et yargs que tout le monde n'utilise pas."globals": { "ENV": true }
à votre .eslintrcJe ne sais pas pourquoi la réponse "webpack.DefinePlugin" est la meilleure partout pour définir les importations / exigences basées sur l'environnement.
Le problème avec cette approche est que vous fournissez toujours tous ces modules au client -> vérifiez avec webpack-bundle-analyezer par exemple. Et ne pas réduire du tout la taille de votre bundle.js :)
Donc, ce qui fonctionne vraiment bien et beaucoup plus logique est: NormalModuleReplacementPlugin
Donc, plutôt que de faire une demande conditionnelle on_client -> ne pas inclure les fichiers non nécessaires dans le bundle en premier lieu
J'espère que cela pourra aider
la source
Utilisez
ifdef-loader
. Dans vos fichiers source, vous pouvez faire des choses commeLe pertinent
webpack
configuration estla source
J'ai fini par utiliser quelque chose de similaire à la réponse de Matt Derrick , mais j'étais préoccupé par deux points:
ENV
(ce qui est mauvais pour les grosses configs).require(env)
pointe vers différents fichiers.Ce que j'ai trouvé est un simple compositeur qui construit un objet de configuration et l'injecte dans un module de configuration.
Voici la structure de fichier que j'utilise pour cela:
Le
main.js
contient tous les éléments de configuration par défaut:Le seul
dev.js
etproduction.js
unique contenu de configuration qui remplace la configuration principale:La partie importante est celle
webpack.config.js
qui compose la configuration et utilise le DefinePlugin pour générer une variable d'environnement__APP_CONFIG__
qui contient l'objet de configuration composé:La dernière étape est maintenant la
config.js
, elle ressemble à ceci (en utilisant la syntaxe d'import export es6 ici car elle est sous le pack web):Dans votre,
app.js
vous pouvez maintenant utiliserimport config from './config';
pour obtenir l'objet de configuration.la source
une autre façon consiste à utiliser un fichier JS en tant que fichier
proxy
, et à laisser ce fichier charger le module qui vous intéressecommonjs
et à l'exporter en tant quees2015 module
, comme ceci:Ensuite, vous pouvez utiliser normalement le module ES2015 dans votre application:
la source
webpack.optimize.UglifyJsPlugin()
, l'optimisation de webpack ne chargera pas le module, car le code de ligne à l'intérieur du conditionnel est toujours faux, donc webpack supprimez-le du bundle généréFace au même problème que l'OP et obligé, en raison de la licence, de ne pas inclure certains codes dans certaines builds, j'ai adopté le webpack-conditionitional-loader comme suit:
Dans ma commande de construction, j'ai défini une variable d'environnement appropriée pour ma construction. Par exemple 'demo' dans package.json:
Le peu déroutant qui manque dans la documentation que j'ai lue est que je dois rendre cela visible tout au long du processus de construction en m'assurant que ma variable env est injectée dans le processus global ainsi dans mon webpack.config / demo.js:
Avec cela en place, je peux conditionnellement exclure quoi que ce soit, en m'assurant que tout code associé est correctement secoué du JavaScript résultant. Par exemple, dans mes routes.js, le contenu de la démonstration est conservé hors des autres versions, ainsi:
Cela fonctionne avec webpack 4.29.6.
la source
J'ai eu du mal à définir env dans mes configurations Webpack. Ce que je veux habituellement est de mettre env afin qu'il puisse être atteinte à l' intérieur
webpack.config.js
,postcss.config.js
et à l' intérieur de l'application de point d'entrée lui - même (index.js
en général). J'espère que mes découvertes pourront aider quelqu'un.La solution que j'ai trouvée est de passer dans
--env production
ou--env development
, puis de définir le mode à l'intérieurwebpack.config.js
. Cependant, cela ne m'aide pas à rendreenv
accessible où je le souhaite (voir ci-dessus), donc je dois également définirprocess.env.NODE_ENV
explicitement, comme recommandé ici . La partie la plus pertinente que j'aiwebpack.config.js
ci-dessous.la source
Utilisez des variables d'environnement pour créer des déploiements de développement et de production:
https://webpack.js.org/guides/environment-variables/
la source
Bien que ce ne soit pas la meilleure solution, cela peut répondre à certains de vos besoins. Si vous souhaitez exécuter un code différent dans le nœud et le navigateur, cela a fonctionné pour moi:
la source