// 文件目录结构
|--config
|--jest
|--env.js
...
|--paths.js
|--node_modules
|--public
|--scripts
|--build.js
|--start.js
|--test.js
|--src
|--package.json
Utiliser des bibliothèques tierces dotenv, dotenv-expand
-
Le fichier d'analyse dotenv est affecté à process.env et le fichier .env est analysé par défaut. Vous pouvez également ajouter une configuration pour analyser d'autres fichiers
const path = require("path"); const envFile = path.join(__dirname, ".env.local") dotenv({ path: envFile});
-
Dotenv-expand
Par défaut, dotenv ne peut pas analyser les variables dans le fichier, il doit s'agir d'une chaîne, dotenv-expand étend la fonction de dotenv
Les variables peuvent être référencées dans le fichier cible via $ / ${}
// .env.local NODE_ENV = "production" VUE_APP_NAME = "vue app" SUNSET = $REAC_APP_NAME
règles d'utilisation
React stipule que pour utiliser des variables sur process.env, vous pouvez créer de nouveaux fichiers tels que .env, .env.development, .env.production, .env.local localement et définir REACT_APP
des variables commençant par dans les fichiers. Ensuite, vous pouvez utiliser process.env.xxx
des variables d'environnement comme dans votre projet.
Regardez le processus de définition des variables d'environnement à partir du code source
-
Lorsque nous exécutons npm start,
scripts --> start.js
deux variables sont montées au début de l'en-tête du fichier
BABEL_ENV
,NODE_ENV
// Do this as the first thing so that any code reading it knows the right env. process.env.BABEL_ENV = 'development'; process.env.NODE_ENV = 'development';
-
puis allez dans
config --> env.js
le dossier
Tout d'abord, dotenvFiles est défini ici, qui est un tableau contenant plusieurs noms de fichiers.Ces noms de fichiers sont les fichiers qui définissent les variables (.env, .env.local, .env.development ...) spécifiées par react mentionné ci-dessus.paths.dotenv可以在
config --> paths.js`, qui est le fichier .env dans le répertoire racine du projet,
et le reste est basé sur le nom de .env.const NODE_ENV = process.env.NODE_ENV; if (!NODE_ENV) { throw new Error( 'The NODE_ENV environment variable is required but was not specified.' ); } // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use const dotenvFiles = [ `${ paths.dotenv}.${ NODE_ENV}.local`, `${ paths.dotenv}.${ NODE_ENV}`, // Don't include `.env.local` for `test` environment // since normally you expect tests to produce the same // results for everyone NODE_ENV !== 'test' && `${ paths.dotenv}.local`, paths.dotenv, ].filter(Boolean);
Ici, parcourez les dotenvFiles ci-dessus et utilisez dotenv, dotenv-expand pour lier les variables à process.env respectivement.
Après avoir exécuté le morceau de code suivant, vous pouvez voir les variables que vous avez définies dans .env et d'autres fichiers sur process.env.
Jusqu'à présent, ces variables ne sont visibles que dans l'environnement du nœud, pas dans le navigateurEnsuite, injectez des variables dans l'environnement du navigateur via webpack.DefinePlugin.
// Load environment variables from .env* files. Suppress warnings using silent // if this file is missing. dotenv will never modify any environment variables // that have already been set. Variable expansion is supported in .env files. // https://github.com/motdotla/dotenv // https://github.com/motdotla/dotenv-expand dotenvFiles.forEach(dotenvFile => { if (fs.existsSync(dotenvFile)) { require('dotenv-expand')( require('dotenv').config({ path: dotenvFile, }) ); } });
-
Avant d'injecter des variables dans l'environnement du navigateur, react effectue également une couche de filtrage et
config --> env.js
définit une/^REACT_APP_/i
régularité dans celui-ci. Cette fonction consiste à extraire uniquement les variables dont les noms de variablesREACT_APP_
commencent par elles en tant que variables d'environnement client.const REACT_APP = /^REACT_APP_/i; function getClientEnvironment(publicUrl) { const raw = Object.keys(process.env) .filter(key => REACT_APP.test(key)) .reduce( (env, key) => { env[key] = process.env[key]; return env; }, { // Useful for determining whether we’re running in production mode. // Most importantly, it switches React into the correct mode. NODE_ENV: process.env.NODE_ENV || 'development', // Useful for resolving the correct path to static assets in `public`. // For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />. // This should only be used as an escape hatch. Normally you would put // images into the `src` and `import` them in code to get their paths. PUBLIC_URL: publicUrl, // We support configuring the sockjs pathname during development. // These settings let a developer run multiple simultaneous projects. // They are used as the connection `hostname`, `pathname` and `port` // in webpackHotDevClient. They are used as the `sockHost`, `sockPath` // and `sockPort` options in webpack-dev-server. WDS_SOCKET_HOST: process.env.WDS_SOCKET_HOST, WDS_SOCKET_PATH: process.env.WDS_SOCKET_PATH, WDS_SOCKET_PORT: process.env.WDS_SOCKET_PORT, } ); // Stringify all values so we can feed into webpack DefinePlugin const stringified = { 'process.env': Object.keys(raw).reduce((env, key) => { env[key] = JSON.stringify(raw[key]); return env; }, { }), }; return { raw, stringified }; } module.exports = getClientEnvironment;
-
Ouvrez ensuite
config --> webpack.config.js
, dansplugins
la configurationnew webpack.DefinePlugin(env.stringified),
Cette étape consiste à injecter les variables finalement filtrées dans l'environnement client.
Enfin, mettez une partie du fichier introduction de webpack.
DéfinirPlugin
DefinePlugin
Permet la création d'une constante globale configurable au moment de la compilation . Cela peut être utile pour autoriser un comportement différent pour les builds en mode développement et en mode release. Si la journalisation est effectuée dans une version de développement, mais pas dans une version de version, une constante globale peut être utilisée pour décider de journaliser ou non. C'estDefinePlugin
là qu'intervient le, configurez-le et oubliez les règles de développement et de versions.new webpack.DefinePlugin({ // Definitions... })