En passant de l'environnement-les variables dépendantes dans webpack
Je suis en train de convertir angulaire application de gulp à webpack. dans gulp-je utiliser gulp-prétraiter pour remplacer certaines variables dans le code html de la page (par exemple, nom de base de données) en fonction de la NODE_ENV. Quelle est la meilleure façon de parvenir à un résultat similaire avec webpack?
- N'alias travail pour vous?
- avant que je puisse obtenir ma tête autour de alias, j'ai mis en place l'autre solution proposée en se basant sur DefinePlugin(). Je ne vois maintenant que alias serait une meilleure solution et sera probablement refactoriser un certain temps - grâce. Si vous souhaitez inclure votre deux solutions dans une réponse, je vais heureux de l'accepter.
- A été dirigé ici par message de la console. Comment résoudre ce problème dans Browserify?
- Cette question est d'essayer de configurer le SPA au moment de la construction ou de temps de chargement? Je note deux types de configuration pour les SPAs: 1) le développement ou le mode de production, et 2) de l'environnement de déploiement, par exemple, le développement, la mise en scène, la production. Je pense que NODE_ENV peut être utilisé pour la configuration (1) au moment de la construction, mais comment la configurer pour l' (2) lors du déploiement, par exemple, la configuration d'un mode de production pour les différents environnements de déploiement. J'espère que ce n'est pertinente à cette question.
- juste
webpack -p
est suffisant - Grande question à laquelle je ne pouvais pas trouver une réponse sur ce thread (peut-être que je l'ai raté), mais a affiché ce nouveau thread: stackoverflow.com/questions/44464504/...
- Est-ce utile? stackoverflow.com/questions/40954400/...
- Salut, je suis en train d'essayer de comprendre comment cela fonctionne vraiment. DefinePlugin rend les variables accessibles pour le client de l'application. Il met ces variables dans un espace global. Signifie-t-il ces revendeurs à valeur ajoutée sont disponibles dans la fenêtre de l'objet? Est-ce une bonne pratique de le faire?
Vous devez vous connecter pour publier un commentaire.
Il y a deux façons de base pour atteindre cet objectif.
DefinePlugin
Noter que ce sera juste remplacer les matchs "comme est". C'est pourquoi la chaîne est dans le format qu'il est. Vous pourriez avoir une structure plus complexe, comme un objet, mais vous obtenez l'idée.
EnvironmentPlugin
EnvironmentPlugin
utiliseDefinePlugin
en interne et des cartes de l'environnement les valeurs de code à travers elle. Terser syntaxe.Alias
Vous pouvez également consommer une configuration par un alias module. Du côté des consommateurs, il devrait ressembler à ceci:
De Configuration lui-même pourrait ressembler à ceci:
Disons
process.env.NODE_ENV
estdevelopment
. Il serait carte en./config/development.js
ensuite. Le module cartes de pouvez exporter la configuration comme ceci:JSON.stringify()
JSON.stringify('development')
au lieu de simplement'"development"'
?'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`
JSON.stringify(someVariable)
peut être tout à fait!"${process.env.NODE_ENV || 'development'}"
est bien meilleur choix, parce que vous permet d'outrepasser NODE_ENV dans mnp scripts et également de remplacer mnp scripts en ligne de commande params.NODE_ENV
de le faire. Comment définir en fonction de votre plate-forme.process.env.NODE_ENV
modèle et il fonctionne.new webpack.EnvironmentPlugin({NODE_ENV: 'development'})
Cela fournit une valeur par défaut uniquement si NODE_ENV n'est pas déjà défini, dont il sera si vous la définissez sur la ligne de commande, comme dansNODE_ENV=production webpack ...
Juste une autre option, si vous souhaitez utiliser une seule interface cli, il suffit d'utiliser la
define
option de webpack. J'ai ajouter le script suivant dans monpackage.json
:Je viens donc d'exécuter
npm run build-production
.J'ai étudié quelques options sur la façon de définir spécifiques à l'environnement des variables et des fini avec cela:
J'ai 2 webpack configs actuellement:
webpack.production.config.js
webpack.config.js
Dans mon code j'obtiens la valeur de API_URL dans cette (brève) de manière à:
const apiUrl = process.env.API_URL;
EDIT 3 Nov, 2016
Webpack docs est un exemple: https://webpack.js.org/plugins/define-plugin/#usage
Avec ESLint vous devez autoriser expressément les variables non définies dans le code, si vous avez
no-undef
règle. http://eslint.org/docs/rules/no-undef comme ceci:7e ÉDITION de la Sep, 2017 (Créer-Réagir-Application spécifique)
Si vous n'êtes pas dans la configuration de trop, découvrez Créez-Réagir-App: Créer-Réagir-Application - Ajout De Variables D'Environnement. Sous le capot de l'ARC utilise Webpack de toute façon.
process.env
puis n'est-ce pasprocess.env.PORT
par exemple se résoudre àundefined
au cours de la webpack construire ce qui signifie que vous ne pouvez plus ignorer le port de l'environnement?Vous pouvez utiliser directement le
EnvironmentPlugin
disponible danswebpack
d'avoir accès à toutes les variables d'environnement au cours de la transpilation.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.
Vous pouvez passer tout argument de ligne de commande sans plugins supplémentaires à l'aide de
--env
depuis webpack 2:À l'aide de la variable dans webpack.config.js:
Source
Ajouter au tas de réponses personnellement, je préfère le suivant:
À l'aide ce n'est pas funky env variable ou de la croix-plate-forme de problèmes (à env vars). Tout ce que vous faire est d'exécuter la normale
webpack
ouwebpack -p
de dev ou de production, respectivement.Référence: Github problème
'process.env.NODE_ENV': JSON.stringify('production')
surprocess: { env: { NODE_ENV: JSON.stringify('production') } }
. À l'aide de ce dernier remplacera l'objet de processus, qui peut se casser la compatibilité avec certains modules s'attendre à d'autres valeurs sur le processus de l'objet à définir.Depuis mon montage sur le post ci-dessus par thevangelist n'a pas été approuvé, l'affichage des informations supplémentaires.
Si vous voulez récupérer la valeur de paquet.json comme un définies numéro de version et y accéder par DefinePlugin à l'intérieur de Javascript.
Ensuite, Importez paquet.json à l'intérieur respectifs webpack.config, accéder à l'attribut à l'aide de la variable à l'importation, puis utilisez l'attribut dans le DefinePlugin.
Par exemple, de certaines de configuration sur webpack.config est à l'aide de MÉTADONNÉES pour DefinePlugin:
L'accès à l'intérieur de toute la machine de fichier:
La façon la plus intelligente serait comme ceci:
Grâce à Ross Allen
Juste une autre réponse qui est similaire à @zer0chain de réponse. Cependant, avec une distinction.
Réglage
webpack -p
est suffisant.C'est la même chose que:
Et c'est le même que
Ainsi vous pouvez seulement besoin de quelque chose comme cela dans
package.json
Nœud fichier:Juste quelques conseils de la DefinePlugin:
Que c'est le cas, vous pouvez vérifier si vous tapez
webpack --help
Ajouter au tas de réponses:
Utilisation ExtendedDefinePlugin au lieu de DefinePlugin
ExtendedDefinePlugin est beaucoup plus simple à utiliser et est documenté 🙂
lien
Parce que DefinePlugin manque une bonne documentation, je veux l'aider, en disant que cela fonctionne réellement comme #DEFINE en c#.
Donc, si vous voulez comprendre comment DefinePlugin fonctionne, lire la c# #define doucmentation. lien
Je préfère utiliser .fichier de configuration pour les différents environnement.
env.dev
pour .env dans le dossier racineenv.prod
pour .envet dans le code
utilisation
require('dotenv').config();
const API = process.env.API ## which will store the value from .env file
J'ai trouvé la solution suivante pour être plus facile à configuration variable d'environnement pour Webpack 2:
Par exemple, nous avons un webpack paramètres:
Ajouter la Variable d'Environnement dans Webpack:
Définir Plugin Variable et l'ajouter à
plugins
:Maintenant lors de l'exécution de webpack de commande, passer
env.NODE_ENV
comme argument:Vous pouvez maintenant accéder à
NODE_ENV
variable n'importe où dans votre code.Depuis Webpack v4, il suffit de réglage
mode
dans votre Webpack config sera de définir laNODE_ENV
pour vous (viaDefinePlugin
). Docs ici.Voici une manière qui a travaillé pour moi et m'a permis de garder mes variables d'environnement SEC, en réutilisant un fichier json.
Je ne suis pas un grand fan de...
...comme il ne fournit pas n'importe quel type de sécurité. au lieu de cela, vous vous retrouvez à stimuler votre secret trucs, sauf si vous ajoutez un webpack à gitignore ♀️ il est une meilleure solution.
De coeur avec cette configuration, une fois que vous compilez votre code de toutes les variables d'environnement sera retiré de l'ensemble du code, il ne va pas être un processus unique.env.VAR grâce à l'babel plugin
transform-inline-environment-variables
PS: si vous ne voulez pas vous retrouver avec tout un tas de annule la définition, assurez-vous que vous appelez la env.js avant webpack appelle babel-chargeur, c'est pourquoi c'est la première chose webpack appels. le tableau de vars dans babel.config.js le fichier doit correspondre à l'objet sur env.js. maintenant il y a un seul tondre chose à faire.
ajouter un
.env
fichier mettez tous vos variables d'environnement il existe, le fichier doit être à la racine du projet ou n'hésitez pas à l'ajouter à l'endroit où tu veux, assurez-vous de définir le même emplacement sur le env.js fichier et l'ajouter à gitignoreSi vous voulez voir l'ensemble de babel + webpack + ts obtenir à partir de heaw
https://github.com/EnetoJara/Node-typescript-babel-webpack.git
et la même logique s'applique à réagir et à tous les autres
env.js
webpack fichier sans plugins troll
babel.config.js
Je ne sais pas pourquoi, mais personne n'a vraiment de mentionner la solution la plus simple. Cela fonctionne pour moi, pour nodejs et grunt. Comme pour beaucoup de gens, la 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, le simple standard solution peut fonctionner pour certaines personnes.