NODE_ENV是使用Node.js常去設定的環境變數,不過它其實並不是Node.js本身會去使用到的環境變數,而是這個生態系約定俗成的用法。在Linux、macOS等Unix-like的作業系統環境下,要設定程式的環境變數的值,只要在執行指令的前面加上變數=值並用空格隔開即可,但在如Windows等其它作業系統,指令就不支援這樣的語法。



例如我們要執行Node.js的應用程式,通常會透過npmnpm start指令來執行。在生產環境下(production),經常將指令寫成NODE_ENV=production npm start,來設定行程(process)的NODE_ENV環境變數的值為production;在開發環境下(development)下,則是經常將指令寫成NODE_ENV=development npm run ...;同樣地,在跑測試的時候,則是經常將指令寫成NODE_ENV=test npm test。不過每次下指令都要去設定NODE_ENV環境變數實屬麻煩了點,所以package.json檔案可能會寫成像是以下這樣:

{
    ...

    "scripts": {
        "start": "NODE_ENV=production node ...",
        "start:dev": "NODE_ENV=development node ...",
        "test": "NODE_ENV=test mocha ...",
    },

    ...
}

不過寫成上面這樣的package.json檔案到Windows作業系統中使用就會出問題了。如下圖:

run-with-node-env

這是因為在Windows上,若要在指令中設定環境變數,要使用set指令來協助完成。像是以下這樣:

set NODE_ENV=production && node index.js

run-with-node-env

但是寫成以上這樣,反而會變成Unix-like的作業系統會有問題。如下圖:

run-with-node-env

實際上,這個問題有個流行的解法是使用cross-env這個套件,不過這個套件並不是專為設定NODE_ENV環境變數而設計。它基於cross-spawn套件,把指令的所有引數包含環境變數的設定都去做跨平台處理。如果只是拿來設定NODE_ENV環境變數,就有點大材小用的感覺,實在沒必要加了一堆程式碼只為了要設定NODE_ENV環境變數。此外,這兩個套件的作者(不同作者)都已經不更新了,還是少用為妙。

Run with NODE_ENV

「Run with NODE_ENV」是筆者開發的套件,可以用來在任意平台上設定NODE_ENV環境變數。

GitHub:

https://github.com/magiclen/run-with-node-env

npm:

https://www.npmjs.com/package/run-with-node-env

用法

用法非常簡單,就像以下這樣:

run-with-node-env production npm start          # NODE_ENV=production  npm start
run-with-node-env development npm run start:dev # NODE_ENV=development npm run start:dev

以上面的package.json檔案作為例子,在使用npm i run-with-node-env安裝套件後,將package.json檔案改寫成這樣:

{
    ...

    "scripts": {
        "start": "run-with-node-env production node ...",
        "start:dev": "run-with-node-env development node ...",
        "test": "run-with-node-env test mocha ...",
    },

    ...
}