這篇文章給大家介紹怎么在Webpack中設置環(huán)境變量,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、前言
日常的前端開發(fā)工作中,至少會有兩套構建環(huán)境
一套開發(fā)時使用,構建結果用于本地開發(fā)調試,不進行代碼壓縮、打印 debug 信息、包含 sourcemap 文件等
一套發(fā)布時使用,構建結果用于線上,即代碼都是壓縮過的、運行時不打印 debug 信息、靜態(tài)文件不包括 sourcemap 等
webpack 4.0 版本開始引入了 mode 的概念
| 選項 | 描述 |
|---|---|
| development | 會將 process.env.NODE_ENV 的值設為 development。啟用 NamedChunksPlugin 和 NamedModulesPlugin |
| production | 會將 process.env.NODE_ENV 的值設為 production。啟用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin |
二、區(qū)分開發(fā)環(huán)境/生產環(huán)境的多種方式
2.1 使用命令行
2.1.1 寫法一
"scripts": {
// 默認 mode 為 development
"dev1": "webpack-dev-server",
// 默認 mode 為 production,不過這樣寫,打包的時候會有警告
"build1": "webpack",
}以上 script 腳本,可以在任意模塊內通過 process.env.NODE_ENV 獲取當前的環(huán)境變量
但無法在 node 環(huán)境(webpack 配置文件中)下獲取當前的環(huán)境變量
// 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'
},
...
};2.1.2 寫法二
"scripts": {
"dev2": "webpack --mode=development",
"build2": "webpack --mode=production",
}和寫法一, 是一樣的結果
2.1.3 寫法三
"scripts": {
"dev3": "webpack-dev-server --env=development",
"build3": "webpack --env=production",
}以上 script 腳本,無法在任意模塊內通過 process.env.NODE_ENV 獲取當前的環(huán)境變量
但可以在 node 環(huán)境(webpack 配置文件中)下,通過函數(shù)獲取當前環(huán)境變量
// 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
// 通過函數(shù)獲取當前環(huán)境變量
module.exports = (env,argv) => {
console.log('env',env);// development | production
return {
entry:'./src/index.js',
output: {
filename: 'js/[name].js'
},
...
}
};2.2 使用 mode
// 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'
},
...
};和 2.1 中的寫法二,是一樣的結果
一個是在命令行中設置,一個是在 webpack 配置文件中設置
2.3 使用 webpack.DefinePlugin
首先得知道這個插件的作用:設置全局變量(并非掛載到 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');
// 這里只是湊巧和環(huán)境變量同名了,所以才不會報錯
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 獲取當前的環(huán)境變量
但無法在 node 環(huán)境(webpack 配置文件中)下獲取當前的環(huán)境變量
2.4 使用 cross-env 插件
原先我一直以為這個插件,可以用來設置所有環(huán)境(瀏覽器環(huán)境、node 環(huán)境)下的變量。經(jīng)過測試發(fā)現(xiàn),只能設置node 環(huán)境下的變量 —— NODE_ENV
2.4.1 寫法一
"scripts": {
"dev1": "cross-env NODE_ENV='production' webpack-dev-server",
"build1": "cross-env NODE_ENV='development' webpack",
}以上 script 腳本,可以在任意模塊內通過 process.env.NODE_ENV 獲取當前的環(huán)境變量
可以在 node 環(huán)境(webpack 配置文件中)下,獲取當前環(huán)境變量
但是會有一個問題: 瀏覽器環(huán)境和 node 環(huán)境下獲取到的值是不一樣的
// !!!!!!
// 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'
},
...
};2.4.2 寫法二
"scripts": {
"dev2": "cross-env NODE_ENV='development' --mode development",
"build2": "cross-env NODE_ENV='production' --mode production",
}以上 script 腳本,可以在任意模塊內通過 process.env.NODE_ENV 獲取當前的環(huán)境變量
可以在 node 環(huán)境(webpack 配置文件中)下,獲取當前環(huán)境變量
所以在能瀏覽器環(huán)境下讀取到環(huán)境變量的值,靠的是 mode ,在 node 環(huán)境下讀取到環(huán)境變量的值,靠的是 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'
},
...
};三、誤區(qū)
經(jīng)常在一些群里看到這個問題: cross-env 和 webpack.DefinePlugin 配合使用的時候,無法通過 process.env.xxx 來獲取到設置的環(huán)境變量,需要通過 webpack.DefinePlugin 里面設置的 key 來獲取。
會引發(fā)這個問題的可能原因是:先往 cross-env 里設置了 NODE_ENV 變量,然后又到 DefinePlugin里設置了一遍環(huán)境變量
"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({
// 設置環(huán)境變量
'process.env.NODE_ENV':JSON.stringify('development'),
}),
],
...
};此時會發(fā)現(xiàn)瀏覽器環(huán)境和 node 環(huán)境都能獲取到設置的變量了,然后就認為之后再設置其他的全局變量時,也像這樣寫就行了。
認為 cross-env 和 DefinePlugin 是配套一起使用的,這個看法本身就很奇怪,因為兩者的作用點不一樣
DefinePlugin 的作用:是設置瀏覽器環(huán)境下能讀取到的 "全局變量",直接通過 key 讀取,在 node 環(huán)境下是無法讀取到的
cross-env 的作用:是通過命令行設置環(huán)境變量 NODE_ENV,使 node 環(huán)境下能讀取到,通過 process.env.NODE_ENV 讀取
如果在DefinePlugin 里設置的 key 是 process.env.NODE_ENV ,會覆蓋 webpack 通過 mode 模式設置的環(huán)境變量的值
"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'),
}),
],
...
};關于怎么在Webpack中設置環(huán)境變量就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網(wǎng)頁名稱:怎么在Webpack中設置環(huán)境變量-創(chuàng)新互聯(lián)
轉載來于:http://www.yijiale78.com/article44/cegshe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、ChatGPT、外貿建站、網(wǎng)頁設計公司、自適應網(wǎng)站、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)