二、React環(huán)境變量

官網(wǎng)文檔地址:https://www.html.cn/create-react-app/docs/adding-custom-environment-variables/
dotenv配置與使用:https://juejin.cn/post/6917794798732574733
dotenv 的使用:https://juejin.cn/post/6844904198929121288

僅供自己學習使用,噴子勿評。
npm -g install dotenv-cli

在實際開發(fā)中,前端er會面對多個環(huán)境的接口:開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境...這些環(huán)境最終要的區(qū)別是API的URL不同,所以代碼中不能將URL寫死,而是要根據(jù)不同的環(huán)境配置。

注:create-react-app或者 umi這樣的腳手架初始化的項目,會將webpack的配置黑盒化了,如何在不執(zhí)行 eject 操作的前提下優(yōu)雅地配置多個項目環(huán)境呢?(最好不要一遇到問題就一鍵執(zhí)行 eject 操作, eject 操作是不可逆的,執(zhí)行之后會把所有細節(jié)都暴露在我們面前,讓項目目錄變得很龐大)

create-react-app 支持多環(huán)境,接下來我們一起看下如何設置。

1、react自帶的兩個環(huán)境變量:

1.1)NODE_ENV

create-react-app 創(chuàng)建的項目有內置的環(huán)境變量NODE_ENV,該變量是自動賦值的,不可更改。在js代碼中可通過 process.env.NODE_ENV 讀取它。NODE_ENV 默認有三個可能的值,分別是:

  1. development:開發(fā)環(huán)境,運行 npm start, NODE_ENV 的值為 development;
  2. test:測試環(huán)境,運行npm run test 則是 test;
  3. production:生產(chǎn)環(huán)境,運行npm run build 則對應 prodution.

比如開發(fā)環(huán)境的 API 的 URL 為 urlDev,生產(chǎn)環(huán)境的 URL 為 urlProd,就可通過環(huán)境變量,判斷當前環(huán)境,使用相應的 URL:

let env = process.env.NODE_ENV
 
let baseUrl = ''
 
if (env === 'development') {
  baseUrl = urlDev
} else if (env === 'production') {
  baseUrl = urlProd
}
 
get(baseUrl) // 偽代碼,表示請求動作

簡單的系統(tǒng),我們通過上面代碼已經(jīng)能夠完成不同環(huán)境的設置了。

1.2)PUBLIC_URL:

這個變量可以用于引用模塊系統(tǒng)之外的資源路徑前綴,用create-react-app腳手架創(chuàng)建的react項目,在public目錄下,有index.html、favicon.ico等文件,index.html中使用了該變量引用圖片:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />

默認改變量的值是空(“”),上面index.html中,href=“/favicon.ico”表示站點根路徑,可以設置該變量為cdn,加速靜態(tài)資源訪問效率。

1)如何使用改變量:

html中通過%PUBLIC_URL% 獲取變量值
js中通過process.env.PUBLIC_URL 獲取變量值

2)設置該變量:

在.env文件中設置該變量的值為一個合法的url路徑,打包后,在使用該變量的文件中就會被替換成對應的值。(.env文件相關內容見下文)

更多的自建變量:https://create-react-app.dev/docs/advanced-configuration/

2、多環(huán)境設置:

項目的根目錄添加一系列名為 .env的文件,里面寫上變量名和值,打包后,可以在js代碼中通過process.env.REACT_APP_XXX讀取到對應文件中的變量值。
注:文件中的變量必須以REACT_APP_ 開頭,其他的react不識別。
說明:此功能適用于 react-scripts@0.5.0 及更高版本,可以通過以下命令更新:

npm install --save --save-exact react-scripts@1.1.4
2.1)默認可以使用哪些 .env 文件?

默認,可以在項目根目錄下建立如下文件:

  • .env:默認。
  • .env.local:本地覆蓋。除 test 之外的所有環(huán)境都加載此文件。
  • .env.development, .env.test, .env.production:設置特定環(huán)境。
  • .env.development.local, .env.test.local, .env.production.local:設置特定環(huán)境的本地覆蓋。

左側的文件比右側的文件具有更高的優(yōu)先級:

  • npm start: .env.development.local, .env.development, .env.local, .env
  • npm run build: .env.production.local, .env.production, .env.local, .env
  • npm test: .env.test.local, .env.test, .env (注意沒有 .env.local )

注:實際測試發(fā)現(xiàn)添加完.env文件后,需要重新執(zhí)行npm start后,代碼中獲取變量才能生效。

看個示例:

1)在項目根目錄建立兩個文件:

.env.development文件,內容:REACT_APP_TEST=development
.env.production文件,內容:REACT_APP_TEST=production

2)在js中通過如下代碼訪問變量:
function App() {
  return (
    <div className="App">
      {process.env.REACT_APP_TEST}<br/>
    </div>
  );
}
export default App;
3)訪問變量值:

執(zhí)行npm start后,訪問頁面,得到的變量值為:development
執(zhí)行npm build后,再執(zhí)行serve -s build,訪問頁面,得到的變量值為:production

2.2)dotenv管理環(huán)境變量:

上面知道,默認通過create-react-app創(chuàng)建的react項目只能支持上面幾種.evn文件,并且通過npm run build只能指定.env.production和默認.env文件中的環(huán)境變量,假設系統(tǒng)還有個stage環(huán)境,該如何指定呢?官方推薦使用dotenv來做環(huán)境變量的管理。dotenv的github地址:https://github.com/motdotla/dotenv

看一個例子:

1)在項目根目錄建立三個文件:
  • .env.development文件,內容:REACT_APP_TEST=development
    .env.stage文件,內容:REACT_APP_TEST=stage
    .env.production文件,內容:REACT_APP_TEST=production
2)在js中通過如下代碼訪問變量:

同上

3)修改 package.json 中的 scripts來指定環(huán)境:
 "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "build:stage": "dotenv -e .env.stage react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
4)訪問變量值:

npm run build:stage

在使用前需要安裝dotenv-cli(https://github.com/entropitor/dotenv-cli),否則會報如下錯誤:

# npm run build:stage
 
> test@0.1.0 build:stage /tmp/test
> dotenv -e .env.development react-scripts build
 
sh: dotenv: command not found
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! test@0.1.0 build:stage: `dotenv -e .env.development react-scripts build`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the test@0.1.0 build:stage script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
 
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-08-30T16_22_57_811Z-debug.log

安裝dotenv-cli:

# npm -g install dotenv-cli
[..................] / rollbackFailedOptional: verb npm-session dfed37ae051d8c52
[..................] \ fetchMetadata: sill resolveWithNewModule dotenv-cli@3.2.0 checking installable status
[..................] \ fetchMetadata: sill resolveWithNewModule dotenv-cli@3.2.0 checking installable status
/usr/local/node-v12.9.0-linux-x64/bin/dotenv -> /usr/local/node-v12.9.0-linux-x64/lib/node_modules/dotenv-cli/cli.js

然后再次執(zhí)行:npm run build:stage,之后啟動serve:serve -s build
訪問頁面,得到變量值為:test

參考:

https://www.html.cn/create-react-app/docs/adding-custom-environment-variables/

https://juejin.im/post/6844904015528984583

https://blog.csdn.net/ZYC88888/article/details/82729313

https://juejin.im/post/6844903968288538638
————————————————
原文鏈接:https://blog.csdn.net/liuxiao723846/article/details/108313832

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容