2017-08-08 64 views
1

後的應用程序無法讀取環境變量我有一個反應的應用程序,與create-react-app創建然後我構建應用程序使用命令:npm run build創建反應生成

它使用serve運行編譯後的程序,如果我們開始與應用開發代碼運行ENV=production npm run start它可以讀取process.env.ENV變量東陽我加入這個插件的WebPack開發配置

new webpack.DefinePlugin({ 
     'process.env':{ 
     'ENV': JSON.stringify(process.env.ENV), 
     } 
    }), 

我還加上面的WebPack督促配置腳本,但如果我嘗試這個命令建立ENV=prod serve -s build後,它無法讀取envir onment變量

如何解決此問題?

回答

2

爲什麼你不能閱讀ENV VAR的原因是:

(1)在發展模式webpack應用手錶在飛行文件和捆綁你。它還會讀取(因爲DefinePlugin)您的process.env.ENV並將其作爲全局變量添加。所以它基本上從process.env管道變量到您的JS應用程序。

(2)當您已經構建您的應用程序(與webpack)的每件事都已經捆綁成一個或多個文件。當你運行serve時,你只需啓動一個服務於靜態構建文件的HTTP服務器。所以沒有辦法將ENV傳遞給你的應用程序。

基本上DefinePlugin所做的就是將var添加到捆綁包中。例如。

new webpack.DefinePlugin({ 
    'token': '12356234ga5q3aesd' 
}) 

將添加類似這樣一行:

var token = '12356234ga5q3aesd'; 

,因爲JS文件是靜態有沒有辦法改變你建立後該變量/與webpack它捆綁。基本上,當你做npm run build你正在創建編譯二進制/ .dll/.jar/...文件,並不能再通過插件影響其內容。

+0

所以解決的辦法是,我必須用'DefinePlugin'添加一個靜態標誌變量,它告訴它是生產還是開發,是嗎?或有任何解決方案? – Mamen

+1

是的,CRA被設置爲在'process.env'下添加everthing到define插件。見https://github.com/facebookincubator/create-react-app/blob/e12d053c273037c5ec75971ddcd117b3e9858cdf/packages/react-scripts/config/env.js#L89-L95 它也會自動爲你設置prod/dev - >' process.env.NODE_ENV' –