2022 第13週 學習筆記:前端專案中的環境變數
總結
記錄一下 Node.js 中的 process.env 與環境變數的相關特性,以及在前端搭配 webpack5 的 React APP 專案中,環境變數是怎麼被讀入的
版本與環境
react: 17
dotenv: 10.0.0
webpack: 5.64.4
筆記
Node.js 與環境變數
process: Theprocessobject is aglobalthat 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 anobjectcontaining the user environment.- Assigning a property on
process.envwill 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: Returnstrueif the path exists,falseotherwise. 檢驗該路徑是否存在- 這段程式碼的目的:檢驗
.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)型別,故會以轉換過的型別出現