2017-03-01 62 views
2

我使用運行在Express服務器上的許多項目,無論它們是前端(即React.js)代碼庫還是服務器端Node.jscodebases在JavaScript項目中對多個環境使用NODE_ENV

很多次與前端codebases我會加載條件配置基於NODE_ENV,如前端請求的restful API的URL。

我很多次也用NODE_ENV有條件地加載的東西像服務器端Node.js項目DB配置。

在一個包含開發,分期和生產(3個環境)的項目中,我通常會設置我的代碼以基於將NODE_ENV設置爲3個環境中的任何一個來加載配置(也可能是「本地「)。

我最近的工作對指的是生產環境的項目「活」。

當我決定設置NODE_ENV =活這樣的環境中,一個同事指出,這種方法的一個重大缺陷。

似乎Express和Node.js的一些其他庫會鎖定事實,即您將使用「生產」或「開發」作爲您的環境NODE_ENV,並且爲您的環境使用其他名稱可能會產生意想不到的效果。

例如,Express需要NODE_ENV=production才能在「生產」模式下運行。根據Express文檔「測試表明,只是這樣做可以將應用程序性能提高三倍!」

基本上,我很好奇是否將NODE_ENV設置爲「開發」和「生產」以外的值,就像我在項目中一樣。

我覺得,如果我要部署我的代碼,在雲開發或升級的環境中,我不認爲他們應該在不同的快車「模式」相比,生產環境中運行。

是否更有意義,以保持配置從NODE_ENV分開?

例如,它是有意義的基礎配置過的變量像APP_ENV,同時確保NODE_ENV或者是「發展」或「生產」的frameworks/packages喜歡快車。

回答

1

NODE_ENV用於開發和生產實例之間進行區分。在沒有NODE_ENV=production的情況下運行生產代碼並不是一個好主意。 NODE_ENV=development通常不是那麼重要,因爲圖書館通常只是檢查看看NODE_ENV !== 'production'。因此,如果您想擁有多個生產節點環境或類似生產環境,則每個環境應設置NODE_ENV=production。也就是說,你可以確定將其他環境變量設置爲你想要的任何值,並在運行時從節點讀回它們。

一個合理的例子是有一個localstagingproduction版本的配置。在這種情況下,我建議讓NODE_ENV只是您爲每個環境設置的參數之一。例如,您可能希望爲每個localstagingproduction三個不同的數據庫,但設置NODE_ENVdevelopmentlocal,並production兩個stagingproduction

由於變量將是shell變量,因此在運行服務器之前,需要在目標操作系統上加載某些環境變量。像https://www.npmjs.com/package/dotenv這樣的模塊看起來很有希望達到這個目的。

+0

看來你建議NODE_ENV應該堅持「開發」或「生產」,並且可以通過另一種方式加載配置(即爲每個項目環境添加一個獨特的dotenv文件)。這是有道理的,但我仍然覺得我經常在野外看到基於NODE_ENV的配置。以環回爲例,https://loopback.io/doc/en/lb2/Environment-specific-configuration.html#overview。他們在文檔中提到,您可以使用NODE_ENV = staging並設置一個config.staging.json文件。我並不是說這是正確的,但它似乎相當普遍。 – seansean11

+0

它可能在野外存在,它可能對非生產環境有效,但由於許多庫在「NODE_ENV」設置爲「production」時啓用優化,因此您應該確保已爲生產環境設置了該設置。 – Mobius

+0

@ seansean11你在尋找不同的答案嗎?就最佳實踐而言,對許多軟件包不使用「NODE_ENV = production」是非常不明智的。我不知道你是否在使用它們,但它是行業最佳實踐。 – Mobius