2016-06-13 114 views
4

困惑我試圖設置一個標誌,通知我的代碼是否在生產或開發。到目前爲止,我已經看到了:有多少種方式設置NODE_ENV

在VS代碼的launch.json

{ "configurations": { "env": "NODE_ENV": "development" } } 

在節點的package.json

{ "scripts": { "start": "NODE_ENV=production" } } 

在的WebPack的webpack.config.js

module.exports = { "plugins": new webpack.DefinePlugin({ 'process.env.NODE_ENV': '"production"' }) } 

在運行的代碼:

set NODE_ENV=production && node app 

NPM包:

https://www.npmjs.com/package/envify 

PowerShell的:

$env:NODE_ENV="production" 

我想我只是困惑,因爲默認情況下,我有那些當前設置的約4。這些如何相互作用?他們都指的是相同的變量?我應該只有其中之一嗎?哪些覆蓋其他人?

我真的更喜歡如果只有一個點來設置它,因爲它似乎每個單獨的模塊可以讓你指定它,因此,我很困惑它實際上被設置。另外,還有無論如何在客戶端訪問此標誌,還是僅在服務器端?

+0

設置'環境變量'似乎是一種很好的方法,並且獨立於軟件包,模塊或IDE。 –

+0

@MukeshSharma:那麼我會刪除這裏列出的所有其他列表嗎?我認爲'React'需要webpack才能在客戶端的生產環境中運行。 –

+0

是的,但是'webpack'又一次設置了在服務器上運行的'node'環境。這裏也已經討論過了。 https://github.com/gaearon/react-transform-b​​oilerplate/issues/54 –

回答

1

在您指定的場景中,NODE_ENV環境變量將由實際執行代碼的進程初始化。請參閱以下摘自environment variable wikipedia

在所有類Unix系統中,每個進程都有自己獨立的一組環境變量。默認情況下,創建進程時,它會繼承其父進程的重複環境,除非父進程在創建子進程時進行顯式更改。在API級別,這些更改必須在運行fork和exec之間完成。或者,從命令shell(如bash),用戶可以通過env或使用ENVIRONMENT_VARIABLE=VALUE <command>表示法間接調用特定命令調用來更改環境變量。所有Unix操作系統的風格,DOS和Windows都有環境變量;但是,它們並不都使用相同的變量名稱。正在運行的程序可以訪問環境變量的值以進行配置。

所以,如果你是使用pm2來運行你的代碼,然後pm2將實際分配之前執行你的應用程序中的NODE_ENV環境變量。它使用JSON file for options,您可以在其中使用env屬性指定環境變量。

簡而言之,所有設置您的NODE_ENV的方法或多或少都具有同等性質,這只是歸結於誰開始您的流程。

由於環境變量是本地機器(環境),它們在本地設置並且不能由客戶端設置。

+0

所以你說的是'pm2'將覆蓋所有其他六個標誌,所以我不妨刪除它們。好,謝謝。 –

+0

就像我說的,它完全取決於哪個進程實際上正在執行你的應用程序,也就是決定什麼是環境變量設置爲 – peteb

+0

是的我的意思是如果我使用pm2。因此,如果我使用節點執行它,那麼'{「scripts」:{「start」:「NODE_ENV = production」}}'會勝利,如果我用VS Code執行它,那麼'{「configurations」:{「env」: 「NODE_ENV」:「開發」}}'會贏,對嗎? –

相關問題