一些關(guān)于環(huán)境變量的總結(jié)

做的項目多了他嚷,就接觸到很多種process.env的設(shè)置方式墓赴,有時候難免會有些迷糊钉赁,這里做些總結(jié)

準備工作

環(huán)境變量是一些我們不想在代碼里處理的變量丹允,它可以讓我們寫的代碼與它所運行的環(huán)境聯(lián)系起來郭厌。我們工作中常常都會用到環(huán)境變量,但是很多時候我們用的并不是那么的得心應(yīng)手雕蔽,特別是在它的作用域問題上折柠。

最常見的環(huán)境變量的設(shè)置是在.bash_profile文件中export出來

export AWS_SECRET_ACCESS_KEY=foo
export AWS_ACCESS_KEY_ID=bar

然后在node程序(其他的程序中有自己的獲取方式)中你就可以直接使用了

var secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
var accessKeyId = process.env.AWS_ACCESS_KEY_ID;

這種方式最大的缺點就是如果有兩個程序,需要不同的accessKeyId和secretAccessKey批狐,這樣我們就得修改變量的名字扇售,比如加上前綴proA_accessKeyId等,如果有三個甚至更多呢嚣艇,這樣的處理方式就肯定不是我們想要的了

最理想的就是每個程序有自己的環(huán)境變量配置缘眶,下面我們看下在node、npm髓废、webpack中如何使用環(huán)境變量

1. node中使用環(huán)境變量

我們常見的方式是這種方式

NODE_ENV=production node index.js

這種方式最大的問題就是變量一多,寫起來有點長该抒,也不便于維護慌洪。所以如果你寫node程序的話顶燕,你可能需要dotenv,他通過項目根目錄的.env文件來維護環(huán)境變量

DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3

然后就能這樣使用了

require('dotenv').config()
var db = require('db')
db.connect({
  host: process.env.DB_HOST,
  username: process.env.DB_USER,
  password: process.env.DB_PASS
})

dotenv還支持preload功能冈爹。就是你不想在代碼里留下這句require('dotenv').config()涌攻,畢竟這對有潔癖的人來說還是難以忍受的,你可以使用 node的--require (-r)選項

node -r dotenv/config your_script.js

當然webpack的工程中也可以使用dotenv频伤,只不過是有時候webpack.DefinePlugin基本就夠用了

2. npm中使用環(huán)境變量

npm對于環(huán)境變量的使用最多的應(yīng)該是在package.json的scripts模塊中

  • package.json文件中的變量

package.json vars
The package.json fields are tacked onto the npm_package_ prefix. So, for instance, if you had {"name":"foo", "version":"1.2.5"} in your package.json file, then your package scripts would have the npm_package_name environment variable set to "foo", and the npm_package_version set to "1.2.5"

上面這段是官方文檔中摘下來的恳谎,就是告訴我們package.json文件中的key值都會被設(shè)置成以npm_package_為前綴的環(huán)境變量,比如如果你的package.json文件中有這么一段{"name":"foo", "version":"1.2.5"} 憋肖,那么你在package scripts 中就可以使用$npm_package_name變量了因痛,它的值就是foo,自然你也可以在js代碼中使用process.env.npm_package_name獲取到它的值

不過現(xiàn)在都是開源時代岸更,誰還看文檔啊鸵膏,直接看源碼就好了

有個例外,如果是config模塊的值還會被設(shè)置成以npm_config_前綴的環(huán)境變量怎炊,使用上和上面一致

當然如果我們只需要在js代碼中使用package中的信息谭企,還是通過require的方式獲取顯得更加方便

const package = require('./package.json')
console.log(package.version)
  • package.json文件中scripts模塊的環(huán)境變量
    我們對已有的環(huán)境變量可以$xxx和${xxx}這兩種方式使用
{
  scripts:{
    "argv": "echo $npm_package_version",    
    "argv": "echo ${npm_package_version}",  
  }
}

我們還可以設(shè)置環(huán)境變量,我們称浪粒看到的就是這樣了

// NODE_ENV就是我們設(shè)置的環(huán)境變量债查,通過process.env.NODE_ENV就可以使用了
{
  scripts:{
    "build": "NODE_ENV=production webpack --config config/webpack/production.config.js"
  }
}

當然這其實都是bash和node的知識范疇

3. webpack中使用環(huán)境變量

上面node和npm設(shè)置的環(huán)境變量在webpack中都可以使用,而webpack中我們還可以看到一種定義方式瓜挽,就是通過DefinePlugin來定義

  new webpack.DefinePlugin({
    'process.env': {
      NODE_ENV: "production"
    },
    PRODUCTION: JSON.stringify(true),
    RELEASE: JSON.stringify(process.env.RELEASE)
  })

這種定義方式本質(zhì)上有點類似 process.env.NODE_ENV = "production"這種js代碼直接賦值的方式盹廷,為什么類似呢,因為它還是有區(qū)別的秸抚,區(qū)別就是在build出來的代碼上你可以看待到process.env.NODE_ENV會直接被production字符串替換(注意:并不是簡單的直接替換速和,它是根據(jù)AST來替換的)。因為并非真正的設(shè)置到了環(huán)境變量中剥汤,所以我們不能把需要環(huán)境變量的地方依賴于它颠放,否則不會有效果

4.總結(jié)

其實這里的應(yīng)該都是屬于node中的環(huán)境變量,畢竟npm和webpack都是用node跑的吭敢,所以node的環(huán)境變量的設(shè)置方式對三者都有效碰凶,只是npm和webpack有些是自己封裝過的設(shè)置方式,其設(shè)置只對自己有效罷了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹿驼,一起剝皮案震驚了整個濱河市欲低,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畜晰,老刑警劉巖砾莱,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凄鼻,居然都是意外死亡腊瑟,警方通過查閱死者的電腦和手機聚假,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闰非,“玉大人膘格,你說我怎么就攤上這事〔扑桑” “怎么了瘪贱?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辆毡。 經(jīng)常有香客問我菜秦,道長,這世上最難降的妖魔是什么胚迫? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任喷户,我火速辦了婚禮,結(jié)果婚禮上访锻,老公的妹妹穿的比我還像新娘褪尝。我一直安慰自己,他們只是感情好期犬,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布河哑。 她就那樣靜靜地躺著,像睡著了一般龟虎。 火紅的嫁衣襯著肌膚如雪璃谨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天鲤妥,我揣著相機與錄音佳吞,去河邊找鬼。 笑死棉安,一個胖子當著我的面吹牛底扳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贡耽,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼衷模,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒲赂?” 一聲冷哼從身側(cè)響起阱冶,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滥嘴,沒想到半個月后木蹬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡若皱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年届囚,在試婚紗的時候發(fā)現(xiàn)自己被綠了有梆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡意系,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饺汹,到底是詐尸還是另有隱情蛔添,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布兜辞,位于F島的核電站迎瞧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逸吵。R本人自食惡果不足惜凶硅,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扫皱。 院中可真熱鬧足绅,春花似錦、人聲如沸韩脑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽段多。三九已至首量,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間进苍,已是汗流浹背加缘。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留觉啊,地道東北人拣宏。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像柄延,于是被迫代替她去往敵國和親蚀浆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺搜吧,特此分享以備自己日后查看市俊,也希望更多的人看到...
    小小字符閱讀 8,180評論 7 35
  • GitChat技術(shù)雜談 前言 本文較長,為了節(jié)省你的閱讀時間滤奈,在文前列寫作思路如下: 什么是 webpack摆昧,它要...
    蕭玄辭閱讀 12,699評論 7 110
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)蜒程,斷路器绅你,智...
    卡卡羅2017閱讀 134,719評論 18 139
  • -01- “王阿爹伺帘,你說這沙漠可真教人害怕,我們已經(jīng)走了兩個多小時忌锯,可周遭的環(huán)境就和沒變過一樣伪嫁,天是天沙是沙的.....
    江南的故事酒館閱讀 968評論 1 1
  • 時光靜好似舵,終是滄桑脚猾;歲月無言,不曾回望砚哗。許些惋惜龙助,卻迎不回曾經(jīng)的一份擁有;許些安慰蛛芥,卻找不到心中的一份安然提鸟。可能...
    風(fēng)吹過指尖沙閱讀 226評論 0 0