TheEnvironmentPlugin is shorthand for using theDefinePlugin onprocess.env keys.
TheEnvironmentPlugin accepts either an array of keys or an object mapping its keys to their default values.
newwebpack.EnvironmentPlugin(['NODE_ENV','DEBUG']);This is equivalent to the followingDefinePlugin application:
newwebpack.DefinePlugin({'process.env.NODE_ENV':JSON.stringify(process.env.NODE_ENV),'process.env.DEBUG':JSON.stringify(process.env.DEBUG),});EnvironmentPlugin checksprocess.env for the specified variable. If it’s missing, it searches for a default value provided in the configuration. If neither the environment variable nor the default value is defined, an error will be thrown:"EnvironmentPlugin -${key} environment variable isundefined".
Alternatively, theEnvironmentPlugin supports an object, which maps keys to their default values. The default value for a key is taken if the key is undefined inprocess.env.
newwebpack.EnvironmentPlugin({NODE_ENV:'development',// use 'development' unless process.env.NODE_ENV is definedDEBUG:false,});Variables coming fromprocess.env are always strings.
UnlikeDefinePlugin, default values are applied toJSON.stringify by theEnvironmentPlugin.
Default values ofnull andundefined behave differently. Useundefined for variables thatmust be provided during bundling, ornull if they are optional.
Example:
Let's investigate the result when running the previousEnvironmentPlugin configuration on a test fileentry.js:
if(process.env.NODE_ENV==='production'){ console.log('Welcome to production');}if(process.env.DEBUG){ console.log('Debugging output');}When executingNODE_ENV=production webpack in the terminal to build,entry.js becomes this:
if('production'==='production'){// <-- 'production' from NODE_ENV is taken console.log('Welcome to production');}if(false){// <-- default value is taken console.log('Debugging output');}RunningDEBUG=false webpack yields:
if('development'==='production'){// <-- default value is taken console.log('Welcome to production');}if('false'){// <-- 'false' from DEBUG is taken console.log('Debugging output');}The followingEnvironmentPlugin configuration providesprocess.env.GIT_VERSION (such as "v5.4.0-2-g25139f57f") andprocess.env.GIT_AUTHOR_DATE (such as "2020-11-04T12:25:16+01:00") corresponding to the last Git commit of the repository:
const child_process=require('child_process');functiongit(command){return child_process.execSync(`git${command}`,{ encoding:'utf8'}).trim();}newwebpack.EnvironmentPlugin({GIT_VERSION:git('describe --always'),GIT_AUTHOR_DATE:git('log -1 --format=%aI'),});The third-partyDotenvPlugin (dotenv-webpack) allows you to expose (a subset of)dotenv variables:
// .envDB_HOST=127.0.0.1DB_PASS=foobarS3_API=mysecretkeynewDotenv({ path:'./.env',// Path to .env file (this is the default) safe:true,// load .env.example (defaults to "false" which does not use dotenv-safe)});