NODE_ENV到底是個(gè)什么玩意访得??

技術(shù)上講陕凹, NODE_ENV是一個(gè)由 Node.js 暴露給執(zhí)行腳本的系統(tǒng)環(huán)境變量悍抑。通常用于確定在開發(fā)環(huán)境還是生產(chǎn)環(huán)境(dev-vs-prod)下,服務(wù)器工具杜耙、構(gòu)建腳本和客戶端 library 的行為搜骡。

NODE_ENV會賦值給process.env對象,作為它的一個(gè)屬性,其值通常為“production”(生產(chǎn)環(huán)境)和“development”(開發(fā)環(huán)境)佑女,或者“prod”和“dev”记靡,以此來區(qū)分不同環(huán)境下的邏輯行為,例如:

if(process.env.NODE_ENV === 'development'){ 
    //開發(fā)環(huán)境 do something
}else{
    //生產(chǎn)環(huán)境 do something
}

實(shí)際上process.env對象是不存在這個(gè)屬性的,打印Object.keys(process.env)可知:

[
    "TERM_SESSION_ID",
    "SSH_AUTH_SOCK",
    "Apple_PubSub_Socket_Render",
    "COLORFGBG",
    "ITERM_PROFILE",
    "XPC_FLAGS",
    "PWD",
    "SHELL",
    "LC_CTYPE",
    "TERM_PROGRAM_VERSION",
    "TERM_PROGRAM",
    "PATH",
    "COLORTERM",
    "TERM",
    "HOME",
    "TMPDIR",
    "USER",
    "XPC_SERVICE_NAME",
    "LOGNAME",
    "__CF_USER_TEXT_ENCODING",
    "ITERM_SESSION_ID",
    "SHLVL",
    "OLDPWD",
    "ZSH",
    "ANDROID_SDK_ROOT",
    "ANDROID_HOME",
    "PAGER",
    "LESS",
    "LSCOLORS",
    "NVM_DIR",
    "NVM_CD_FLAGS",
    "NVM_BIN",
    "PUB_HOSTED_URL",
    "FLUTTER_STORAGE_BASE_URL",
    "_"
]

然而process.env.NODE_ENV可用团驱,是前端工程化過程中大家約定俗成的做法摸吠,尤其是webpack構(gòu)建前端工程時(shí),會經(jīng)常使用嚎花。那這個(gè)屬性是什么時(shí)候賦值給process.env的呢寸痢?

以webpack的工程為例,通常是運(yùn)行腳本時(shí)來做這件事紊选,例如package.json中的腳本:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "NODE_ENV=development webpack --watch ",
    "build": "NODE_ENV=development webpack --mode=production"
  },

說明:NODE_ENV=development在windows環(huán)境下會報(bào)錯(cuò)啼止,需要改為set NODE_ENV=production道逗,為了解決這個(gè)差異,可以使用cross-env跨平臺的設(shè)置和使用環(huán)境變量,這里就不解釋具體使用方法了献烦。

這樣滓窍,就可以在webpack.config.js中使用process.env.NODE_ENV了,但是不能在webpack.config.js引入的模塊中使用仿荆,要想在模塊當(dāng)中直接使用贰您,我們還需要一些配置。

webpack4之前可以使用DefinePlugin插件配置

// webpack.config.js
const webpack = require('webpack');

module.exports = {
    entry: {
        app: './src/app'
    },
    output: {
        path: 'dist',
        filename: 'bundle.js'
    },
    plugins: [
        new webpack.DefinePlugin({
            'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
        })
    ]
};

webpack4版本之后可以通過mode選項(xiàng)實(shí)現(xiàn)

module.exports = {
    // 定義環(huán)境變量
    mode: 'development',
    // JavaScript 執(zhí)行入口文件
    entry: './main.js',
    output: {
        // 把所有依賴的模塊合并輸出到一個(gè) bundle.js 文件
        filename: 'bundle.js',
        // 輸出文件都放到 dist 目錄下
        path: path.resolve(__dirname, './dist'),
    }, 
};

這里有個(gè)需要注意的點(diǎn):

通過npm script 定義的NODE_ENV和 通過DefinePlugin拢操、mode選項(xiàng)定義的NODE_ENV是兩個(gè)相互獨(dú)立的存在锦亦,NODE_ENV=development這種方式定義的NODE_ENV只能在當(dāng)前腳本中生效,是個(gè)runtime(運(yùn)行時(shí))令境。假如webpack.config.js的mode設(shè)置為production杠园,腳本中執(zhí)行NODE_ENV=development,那么在模塊中NODE_ENV的值為production舔庶,而配置文件webpack.config.js中的NODE_ENV值為development抛蚁。

如果沒有在腳本中設(shè)置環(huán)境變量,只設(shè)置了mode惕橙,在webpack的配置文件中讀取process.env.NODE_ENV為undefined瞧甩,因此,例如
process.env.NODE_ENV === 'production' ? '[name].[hash].bundle.js' : '[name].bundle.js'
這樣的條件語句弥鹦,在 webpack 配置文件中肚逸,無法按照預(yù)期運(yùn)行。

上面的話可能不好理解彬坏,總結(jié)起來就是朦促,DefinePlugin和mode選項(xiàng)定義的NODE_ENV 作用于webpack入口文件下的業(yè)務(wù)代碼,通常為src文件夾下的代碼栓始, 而 npm腳本里的設(shè)置多用于配置相關(guān)务冕,例如在webpack.config.js里區(qū)分環(huán)境配置不同插件。

請查看 #2537

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幻赚,一起剝皮案震驚了整個(gè)濱河市禀忆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坯屿,老刑警劉巖油湖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異领跛,居然都是意外死亡乏德,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喊括,“玉大人胧瓜,你說我怎么就攤上這事≈J玻” “怎么了府喳?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蘑拯。 經(jīng)常有香客問我钝满,道長,這世上最難降的妖魔是什么申窘? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任弯蚜,我火速辦了婚禮,結(jié)果婚禮上剃法,老公的妹妹穿的比我還像新娘碎捺。我一直安慰自己,他們只是感情好贷洲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布收厨。 她就那樣靜靜地躺著,像睡著了一般优构。 火紅的嫁衣襯著肌膚如雪诵叁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天钦椭,我揣著相機(jī)與錄音黎休,去河邊找鬼。 笑死玉凯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的联贩。 我是一名探鬼主播漫仆,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼泪幌!你這毒婦竟也來了盲厌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤祸泪,失蹤者是張志新(化名)和其女友劉穎吗浩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體没隘,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懂扼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阀湿。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赶熟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陷嘴,到底是詐尸還是另有隱情映砖,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布灾挨,位于F島的核電站邑退,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劳澄。R本人自食惡果不足惜地技,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浴骂。 院中可真熱鬧乓土,春花似錦、人聲如沸溯警。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梯轻。三九已至食磕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喳挑,已是汗流浹背彬伦。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伊诵,地道東北人单绑。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像曹宴,于是被迫代替她去往敵國和親搂橙。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348