2022 第14週 學習筆記:使用 superstruct 驗證 process.env 資料
總結
使用 create-react-app
建立 React APP 並執行 npm run eject
後,在 config
資料夾內的 env.js
會協助處理 .env
中帶有 REACT_APP_
關鍵字的環境變數,讓開發者可以在 React APP 中讀取 process.env 內容;而如果開發者想要檢驗 process.env 的 schema 並將環境變數由字串型態轉變回布林、數值等資料形式的話,可以搭配 npm package superstruct
來實現
目前未解明:為何投入 webpack.DefinePlugin
後「沒有 REACT_APP_
前綴的環境變數」依舊可以保留字串以外的資料型態 🤔
版本與環境
superstruct: 0.15.4
webpack: 5.64.4
筆記
使用 superstruct 的優點
- 除了驗證資料型態(字串、布林、數值等)是否正確,也可檢查資料結構是否符合預期(指定的鍵值是否皆有出現)
- 提供型別轉換的功能
- 支援 typescript,定義好的 schema 可挪作 type/interface 使用(本次未使用)
實作想法梳理
- 不將 process.env 的資料檢驗與型別轉換實作在
config/env.js
中,因環境變數最後還是會送至config/webpack.config.js
中的webpack.DefinePlugin
轉換回純字串資料 - 將 process.env 執行型別轉換後的資料保存在
class Env
中,令 process.env 保持字串形式,而在「需要在 React APP 中引用環境變數」時,就從class Env
取用已經進行型別轉換後的資料
原始碼
示範專案 repo:https://github.com/tzynwang/react-process-env/tree/feature/superstruct
src.Model.Env.index.ts
- 第 16~22 行:加上
!
迴避 ts 檢查後回報Property '...' has no initializer and is not definitely assigned in the constructor
的問題 - 第 32 行:使用
define
提供 superstruct 自訂義的資料型別 - 第 33 行:使用
type
允許 process.env 中出現 schema 沒有定義到的鍵值(因 config/env.js 除了回傳帶有REACT_APP_
的環境變數外,也會納入其他變數內容);如果資料結構需完全符合定義好的 schema 則可以使用object
來進行檢查(會在出現額外的鍵值時直接 throw Error) - 第 44 行:使用
create
建立型別轉換後的環境變數物件,若 process.env 中有不符合 schema 定義的資料內容,在這階段就會 throw Error - 第 47~54 行:將檢驗後的環境變數保存到
class Env
中
- 第 16~22 行:加上
src.Hook.useEnv.tsx
- 建立該 React APP 中的唯一
Env
實例(singleton pattern)
- 建立該 React APP 中的唯一
src.App.tsx
- 第 12 行:透過 useEnv 取得 React APP 中的唯一
Env
實例
- 第 12 行:透過 useEnv 取得 React APP 中的唯一