1. 程式人生 > 其它 >論與Vue近似等價的React專案架構與配置(React專案優化更多/附帶模板)

論與Vue近似等價的React專案架構與配置(React專案優化更多/附帶模板)

技術標籤:Webreactjsvuewebpackreact-app

前言

之前在 Vue 建立新專案(使用 vue-cli 4 腳手架)後,介紹過更多的優化方案:

《 vue-cli 建立專案後優化更多配置(一)》

《 vue-cli 建立專案後優化更多配置(二)》

《 vue-cli 建立專案後優化更多配置(三)》

假設不做以上大量的優化,使用 vue-cli 預設的配置進行 build 部署上線也不會有很大的問題(很多中小網站都沒有做過任何優化,現在網速都很快即使單 chunk 很大也無所謂)。

如何在 react 中完整復現達到優化一致是最大的問題。

優化方向

基於以上三篇文章在 Vue 專案中的優化可以整理如下優化方向:

方向解決說明
.browserslistrc原生自帶react 專案建立後在 package.json 內配置即可
babel.config.jscracra 侵入修改 babel 配置
jsconfig.json建立檔案建立該檔案即可使用
.editorconfig建立檔案建立該檔案即可使用
postcss.config.js原生自帶react 專案自帶 autoprefix 無需配置
.eslintignore建立檔案建立該檔案即可使用
.eslintrc.js建立檔案建立該檔案即可使用
vue.config.jscra使用 cra 複寫對 react 專案配置
.env.development原生支援建立該檔案即可使用
.env.production原生支援建立該檔案即可使用
svg新 svg 元件復現 svg 複用元件解決

從以上整理我們發現需要解決的有三個問題:

  1. cra 複寫配置解決 babel 和專案配置問題

  2. 復現 Vue 中的 svg 元件對 svg 全域性複用

  3. 建立一些新的配置檔案(比如 .eslintrc.jsjsconfig.json 等 )

cra 配置複寫

對於第一個 cra 配置複寫,使用方法可參見:

《 react 不使用 eject 的配置方法( config-overrides 復現 vue 專案全部配置)》

svg 複用

對於第二個 svg 問題,我們近似復現了 svg 元件,可參見:

《 react 復現 vue 中 svg-sprite-loader 的使用 svg 方法》

建立新檔案

建立新檔案進行配置並非易事,又引發了三類新問題。

一、直接建立就可以使用的

jsconfig.json.editorconfig.eslintignore.env.development.env.production

二、需要額外整合的

在 react 中是沒有配置 prettier 的,有關 prettier 有多重要是人人皆知的,其重要性可參見此文:

《 Vue3 中 eslint 程式碼格式化 prettier 和 standard 規則比較(為什麼推薦使用 prettier )》

所以如何從零整合 prettier 並保持與 eslint 不起衝突是需要額外注意的問題(在 Vue 專案中如果建立時選擇了 prettier ,其解決衝突方案會預設配置好),有關從零配置 prettier 可參見此文:

《 JavaScript 新專案從零開始整合 eslint + prettier 方法(程式碼風格最佳搭配)》

三、在範圍受限的

在 vue-cli 4 中建立的專案,其 script 快速啟動命令是支援任意 env 支援的,什麼是任意 env 支援,就是當你使用如下 script 命令時:

	yarn build --mode modeName

那麼他會自動讀取專案根目錄下 .env.modeName 檔案內的環境變數配置,也就是支援我們配置無數個環境。

但是在 react 中只支援 .env / .env.local / .env.development / .env.production / .env.test ,如果想額外新增環境,請使用不同的命令列注入環境變數或使用 cross-env 啟動專案同時相容多平臺。

優化一覽

由於 cra 部分十分細緻,配置原理大致相同(在上面文章內已經有詳細介紹),這裡只給出已優化的配置一覽:

優化策略說明
打包至 distcra將原來預設打包至 build 下改為常用 dist 位置
生產環境開啟代理伺服器cra生產環境支援代理跨域
webpack-dev-server 配置支援輸出檢視cra明確掌控 devServer 部分配置
路徑支援使用 @ / @c 等別名cra更快捷的匯入目標
@ 等別名路徑支援程式碼提示jsconfig使用別名路徑支援路徑只能識別提示
支援 lesscra + less支援使用 less 樣式檔案
支援 sasssass支援使用 sass 樣式檔案
支援 less 全域性樣式資源cra + less支援匯入全域性 less 樣式資源實現變數和函式隨處使用
svg 元件cra + svg-sprite-loadersvg 只需載入一次隨處複用,支援外部 svg
css-in-jscra + @emotion支援 css props / css props object / styled-components 各種 css-in-js 方案
生產環境 module 快速匯入cra + dynamic-import-node藉助現代瀏覽器支援 module 載入的能力快速切換匯入的模組
生產環境去除 devtoolscra減小打包體積
打包後去除 .chunk 部分檔名cra去除打包後 chunk 自帶的 .chunk 無意義的檔名
生產環境去除 console.logcra縮小程式碼體積,改進使用者體驗
打包去除內聯註釋cra構建後去除原始碼中的 banner 等註釋內容
自動注入 index.html 的預設標題cra動態自動注入打包後的 index.html 內的 title 預設標題
支援手動 splitChunk 分包與命名cra手動配置 splitChunk 分包策略,極大提升載入速度
runtime 內聯策略cra + script-ext-html-webpack-plugin支援抽取 runtime 並內聯至 index.html 且不額外生成多餘的 runtime 檔案
webpack 配置支援輸出檢視cra明確掌控 webpack 配置

注:css module 在 create-react-app 建立的專案中原生支援(使用 name.module.[css|less|scss] 的命名規則即可)

總結

除此之外,一個專案的健壯性仍有待改善,比如:

  1. 支援全域性 script / link 資源的插入配置

  2. 支援各頁面不同的標題配置

  3. 支援非同步業務

  4. 支援全域性狀態管理

  5. axios 請求庫封裝

  6. react 路由(預設建立的新專案無路由配置)

  7. 懶載入策略

  8. 初始樣式 reset

彙總以上一切得到一個真正可以使用的 “初始專案” 模板:fz6m / react-awesome-template

注:需要 Typescript 的請自行整合,一般團隊不大的情況是不需要強加 ts 浪費時間的。