选项 | 描述 |
---|---|
development | 会将 process.env.NODE_ENV 的值设为 development 。启用 NamedChunksPlugin 和 NamedModulesPlugin |
production | 会将 process.env.NODE_ENV 的值设为 production 。启用 FlagDependencyUsagePlugin , FlagIncludedChunksPlugin , ModuleConcatenationPlugin , NoEmitOnErrorsPlugin , OccurrenceOrderPlugin , SideEffectsFlagPlugin 和 UglifyJsPlugin |
"scripts": {
// 默认 mode 为 development
"dev1": "webpack-dev-server",
// 默认 mode 为 production,不过这样写,打包的时候会有警告
"build1": "webpack",
}
复制代码
process.env.NODE_ENV
获取当前的环境变量// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// development | production
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
console.log('NODE_ENV',process.env.NODE_ENV);// undefined
module.exports = {
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
...
};
复制代码
"scripts": {
"dev2": "webpack --mode=development",
"build2": "webpack --mode=production",
}
复制代码
"scripts": {
"dev3": "webpack-dev-server --env=development",
"build3": "webpack --env=production",
}
复制代码
process.env.NODE_ENV
获取当前的环境变量// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// undefined
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
console.log('NODE_ENV',process.env.NODE_ENV);// undefined
// 经过函数获取当前环境变量
module.exports = (env,argv) => {
console.log('env',env);// development | production
return {
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
...
}
};
复制代码
// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// development | production
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
console.log('NODE_ENV',process.env.NODE_ENV);// undefined
module.exports = {
mode:'development',// development | production
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
...
};
复制代码
window
上),全部模块都能读取到该变量的值// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// development
console.log(NODE_ENV);// production
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
// 这里只是凑巧和环境变量同名了,因此才不会报错
console.log('process.env.NODE_ENV',process.env.NODE_ENV);// undefined
console.log('NODE_ENV',NODE_ENV);// error !!!
module.exports = {
mode:'development',// development | production
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
plugins:[
new webpack.DefinePlugin({
'process.env.NODE_ENV':JSON.stringify('development'),
'NODE_ENV':JSON.stringify('production'),
}),
],
...
};
复制代码
process.env.NODE_ENV
获取当前的环境变量NODE_ENV
"scripts": {
"dev1": "cross-env NODE_ENV='production' webpack-dev-server",
"build1": "cross-env NODE_ENV='development' webpack",
}
复制代码
process.env.NODE_ENV
获取当前的环境变量// !!!!!!
// npm run build1
// !!!!!!
// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// production
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
console.log('process.env.NODE_ENV',process.env.NODE_ENV);// development
module.exports = {
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
...
};
复制代码
"scripts": {
"dev2": "cross-env NODE_ENV='development' --mode development",
"build2": "cross-env NODE_ENV='production' --mode production",
}
复制代码
process.env.NODE_ENV
获取当前的环境变量mode
,在 node 环境下读取到环境变量的值,靠的是 cross-env
// !!!!!!
// npm run build2
// !!!!!!
// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// production
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
console.log('process.env.NODE_ENV',process.env.NODE_ENV);// production
module.exports = {
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
...
};
复制代码
cross-env
和 webpack.DefinePlugin
配合使用的时候,没法经过 process.env.xxx
来获取到设置的环境变量,须要经过 webpack.DefinePlugin
里面设置的 key
来获取。NODE_ENV
变量,而后又到 DefinePlugin
里设置了一遍环境变量"scripts": {
"dev": "cross-env NODE_ENV='development' --mode development"
}
复制代码
// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// development
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
console.log('process.env.NODE_ENV',process.env.NODE_ENV);// development
module.exports = {
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
plugins:[
new webpack.DefinePlugin({
// 设置环境变量
'process.env.NODE_ENV':JSON.stringify('development'),
}),
],
...
};
复制代码
此时会发现浏览器环境和 node 环境都能获取到设置的变量了,而后就认为以后再设置其余的全局变量时,也像这样写就好了。javascript
认为 cross-env
和 DefinePlugin
是配套一块儿使用的,这个见解自己就很奇怪,由于二者的做用点不同前端
DefinePlugin
的做用:是设置浏览器环境下能读取到的 "全局变量",直接经过 key
读取,在 node 环境下是没法读取到的cross-env
的做用:是经过命令行设置环境变量 NODE_ENV
,使 node 环境下能读取到,经过 process.env.NODE_ENV
读取DefinePlugin
里设置的 key
是 process.env.NODE_ENV
,会覆盖 webpack 经过 mode
模式设置的环境变量的值"scripts": {
"dev": "cross-env NODE_ENV='development' --mode development"
}
复制代码
// index.js
function getEnv() {
console.log(process.env.NODE_ENV);// 666666
}
// webpack.config.js
const path = require('path');
const webpack = require('webpack');
console.log('process.env.NODE_ENV',process.env.NODE_ENV);// development
module.exports = {
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
plugins:[
new webpack.DefinePlugin({
// 注意:由于同名的 key,这里的值会覆盖默认的值 !!!!!!
'process.env.NODE_ENV':JSON.stringify('666666'),
}),
],
...
};
复制代码
cross-env
是专门用来设置 node 环境变量的webpack.DefinePlugin
是专门用来设置浏览器环境下的全局变量(不会挂载到 window
上)React Hooks 详解 【近 1W 字】+ 项目实战node
React SSR 详解【近 1W 字】+ 2个项目实战webpack