J'essaie de convertir une application angulaire de gulp en webpack. dans gulp, j'utilise gulp-preprocess pour remplacer certaines variables dans la page html (par exemple le nom de la base de données) en fonction du NODE_ENV. Quelle est la meilleure façon d'obtenir un résultat similaire avec webpack?
306
Réponses:
Il existe deux moyens de base pour y parvenir.
DefinePlugin
Notez que cela remplacera simplement les correspondances "telles quelles". C'est pourquoi la chaîne est dans le format qu'elle est. Vous pourriez avoir une structure plus complexe, comme un objet là-bas, mais vous avez l'idée.
EnvironmentPlugin
EnvironmentPlugin
utilise enDefinePlugin
interne et mappe les valeurs d'environnement pour les coder. Syntaxe du terser.Alias
Vous pouvez également utiliser la configuration via un module avec alias . Du côté des consommateurs, cela ressemblerait à ceci:
La configuration elle-même pourrait ressembler à ceci:
Disons que
process.env.NODE_ENV
c'estdevelopment
. Cela correspondrait./config/development.js
alors. Le module auquel il est mappé peut exporter une configuration comme celle-ci:la source
JSON.stringify()
'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`
JSON.stringify('development')
tel quel pourrait ne pas être vraiment utile. Au lieu de celaJSON.stringify(someVariable)
peut être tout à fait!NODE_ENV
. Comment définir cela dépend de votre plate-forme.process.env.NODE_ENV
modèle et cela fonctionne.Juste une autre option, si vous souhaitez utiliser uniquement une interface cli, utilisez simplement l'
define
option de webpack. J'ajoute le script suivant dans monpackage.json
:Je dois donc juste courir
npm run build-production
.la source
J'ai étudié quelques options sur la façon de définir des variables spécifiques à l'environnement et je me suis retrouvé avec ceci:
J'ai actuellement 2 configurations webpack:
webpack.production.config.js
webpack.config.js
Dans mon code, j'obtiens la valeur de API_URL de cette manière (brève):
const apiUrl = process.env.API_URL;
EDIT 3 novembre 2016
Les documents Webpack ont un exemple: https://webpack.js.org/plugins/define-plugin/#usage
Avec ESLint, vous devez autoriser spécifiquement les variables non définies dans le code, si vous avez une
no-undef
règle. http://eslint.org/docs/rules/no-undef comme ceci:EDIT 7 septembre 2017 (spécifique à Create-React-App)
Si vous ne souhaitez pas trop configurer, consultez Create-React-App: Create-React-App - Ajout de variables d'environnement personnalisées . Sous le capot, CRA utilise quand même Webpack.
la source
process.env
ne pas alorsprocess.env.PORT
par exemple à résoudreundefined
lors de la construction de webpack qui signifie que vous ne pouvez plus passer outre le port de l'environnement?Vous pouvez passer n'importe quel argument de ligne de commande sans plugins supplémentaires en utilisant
--env
depuis webpack 2:Utilisation de la variable dans webpack.config.js:
La source
la source
Vous pouvez utiliser directement
EnvironmentPlugin
dans disponiblewebpack
pour avoir accès à n'importe quelle variable d'environnement pendant la transpilation.Il vous suffit de déclarer le plugin dans votre
webpack.config.js
fichier:Notez que vous devez déclarer explicitement le nom des variables d'environnement que vous souhaitez utiliser.
la source
Pour ajouter personnellement au tas de réponses, je préfère ce qui suit:
En utilisant ceci, il n'y a pas de problème de variable env funky ou de problème multiplateforme (avec les vars env). Tout ce que vous faites est d'exécuter la normale
webpack
ouwebpack -p
pour le développement ou la production respectivement.Référence: problème Github
la source
'process.env.NODE_ENV': JSON.stringify('production')
plusprocess: { env: { NODE_ENV: JSON.stringify('production') } }
. L'utilisation de ce dernier écrasera l'objet de processus, ce qui peut rompre la compatibilité avec certains modules qui s'attendent à ce que d'autres valeurs de l'objet de processus soient définies.Puisque ma modification sur le post ci - dessus par l'évangéliste n'a pas été approuvée , la publication d'informations supplémentaires
Si vous souhaitez choisir la valeur de package.json comme un numéro de version défini et y accéder via DefinePlugin dans Javascript.
Ensuite, importez package.json dans le webpack.config respectif , accédez à l'attribut à l'aide de la variable d'importation, puis utilisez l'attribut dans DefinePlugin .
Par exemple, certaines configurations sur webpack.config utilisent METADATA pour DefinePlugin:
Accédez à cela dans n'importe quel fichier dactylographié:
La façon la plus intelligente serait la suivante:
Merci à Ross Allen
la source
Juste une autre réponse similaire à la réponse de @ zer0chain. Cependant, avec une distinction.
Le réglage
webpack -p
est suffisant.C'est la même chose que:
Et c'est la même chose que
Vous n'aurez donc besoin que de quelque chose comme ça dans le
package.json
fichier Node:Quelques conseils du DefinePlugin :
Que ce soit pour que vous puissiez vérifier si vous tapez
webpack --help
la source
Pour ajouter au tas de réponses:
Utilisez ExtendedDefinePlugin au lieu de DefinePlugin
ExtendedDefinePlugin est beaucoup plus simple à utiliser et est documenté :-) lien
Parce que DefinePlugin manque de bonne documentation, je veux aider, en disant qu'il fonctionne réellement comme #DEFINE en c # .
Ainsi, si vous souhaitez comprendre le fonctionnement de DefinePlugin, lisez la doucmentation c # #define. lien
la source
Je préfère utiliser le fichier .env pour un environnement différent.
env.dev
dans .env dans le dossier racineenv.prod
vers .envet en code
utilisation
require('dotenv').config(); const API = process.env.API ## which will store the value from .env file
la source
J'ai trouvé que la solution suivante était la plus facile à configurer la variable d'environnement pour Webpack 2:
Par exemple, nous avons des paramètres de webpack:
Ajouter une variable d'environnement dans Webpack:
Définissez la variable du plugin et ajoutez-la à
plugins
:Maintenant, lors de l'exécution de la commande webpack, passez
env.NODE_ENV
comme argument:Vous pouvez désormais accéder à des
NODE_ENV
variables n'importe où dans votre code.la source
Depuis Webpack v4, la simple configuration
mode
de votre configuration Webpack définira leNODE_ENV
pour vous (viaDefinePlugin
). Documents ici.la source
Voici une méthode qui a fonctionné pour moi et m'a permis de garder mes variables d'environnement SEC en réutilisant un fichier json.
la source
Je ne suis pas un grand fan de ...
... car il n'offre aucun type de sécurité. à la place, vous finissez par booster vos trucs secrets, à moins que vous n'ajoutiez un webpack à gitignore 🤷♀️ il y a une meilleure solution.
Fondamentalement, avec cette configuration une fois que vous avez compilé votre code, toutes les variables env du processus seront supprimées de tout le code, il n'y aura pas un seul process.env.VAR grâce au plugin babel
transform-inline-environment-variables
PS si vous ne voulez pas finir avec tout un tas d'indéfinis, assurez-vous d'appeler env.js avant que webpack appelle babel-loader, c'est pourquoi c'est la première chose que webpack appelle. le tableau de variables dans le fichier babel.config.js doit correspondre à l'objet sur env.js. maintenant il n'y a qu'une seule chose à faire. ajoutez un.env
fichier, mettez toutes vos variables env là-bas, le fichier doit être à la racine du projet ou n'hésitez pas à l'ajouter où vous le souhaitez, assurez-vous de définir le même emplacement sur le fichier env.js et de l'ajouter également à gitignoreSi vous voulez voir l'ensemble babel + webpack + ts l'obtenir de heaw
https://github.com/EnetoJara/Node-typescript-babel-webpack.git
et la même logique s'applique pour réagir et tous les autres 💩
env.js
fichier webpack sans plugins troll
babel.config.js
la source
Je ne sais pas pourquoi mais personne ne mentionne vraiment la solution la plus simple. Cela fonctionne pour moi pour nodejs et grunt. Comme pour beaucoup de gens, le webpack peut être déroutant, vous pouvez simplement utiliser la ligne ci-dessous:
process.env.NODE_ENV = 'production';
Avec la solution ci-dessus, vous n'avez pas vraiment besoin d'utiliser envify ou webpack. Parfois, la solution simple codée en dur peut fonctionner pour certaines personnes.
la source