2022 第13週 學習筆記:前端專案中的環境變數
總結
記錄一下 Node.js 中的 process.env
與環境變數的相關特性,以及在前端搭配 webpack5 的 React APP 專案中,環境變數是怎麼被讀入的
版本與環境
react: 17
dotenv: 10.0.0
webpack: 5.64.4
筆記
Node.js 與環境變數
process
: Theprocess
object is aglobal
that provides information about, and control over, the current Node.js process. As a global, it is always available to Node.js applications without usingrequire()
. 是一種物件,提供當下 Node.js 執行環境的資訊process.env
: returns anobject
containing the user environment.- Assigning a property on
process.env
will implicitly convert the value to a string. 注意process.env
只會回傳字串形式的資料("true"
,"undefined"
,"42"
) - On Windows operating systems, environment variables are case-insensitive. 在 Windows 的環境變數不會區別大小寫
- Assigning a property on
前端專案中的環境變數
注意:以下筆記內容是建立在使用
create-react-app
建立專案,並執行npm run eject
後整理出來的資訊
示範專案 repo:https://github.com/tzynwang/react-process-env
/react-app/config/path.js
第 53, 55 行:預設為讀取位在專案根目錄的.env
檔案
/react-app/config/env.js
第 33-41 行:讀取.env
內容existsSync
: Returnstrue
if the path exists,false
otherwise. 檢驗該路徑是否存在- 這段程式碼的目的:檢驗
.env
是否存在,若存在,則require('dotenv')
來協助讀取.env
內容 - dotenv 此 npm package 的目的:協助專案讀取
.env
內容,可參考原始碼
- 第 61 行:將
.env
檔案中變數名稱帶有REACT_APP_
前綴的變數自動納入 63 行getClientEnvironment
回傳的內容,如果不在變數加上REACT_APP_
此前綴,就需要手動將變數一個一個加入getClientEnvironment
中- 優點:加上
REACT_APP_
即可讓 webpack 在打包時幫忙自動處理相關的環境變數,不需透過手動加入 - 缺點:透過自動處理的環境變數內容只會是 string 型別,在需要判定環境變數的
true/false
或使用PORT
等做為 number 型態的資料時,需在使用時進行型別轉換,或進行手動判別(布林值)
- 優點:加上
- 第 92-95 行:這邊是手動追加的部分,代表追加
PROJECT_AUTHOR
,PROJECT_SINCE
與PROJECT_RELEASE
這三個項目,並針對 process.env 回傳的內容進行型別轉換
- 在
/react-app/src/App.tsx
中透過console.log(process.env)
可以觀察到:如果是有REACT_APP_
前綴的環境變數,全部都是string
型別;而如果是透過手動追加的環境變數,因為已經先在 webpack 編譯的過程中將之還原回應有的(boolean
、number
)型別,故會以轉換過的型別出現