react-scripts
套件中打開使用 CRA 建立的 React 專案可以發現,完全找不到 webpack.config.js
的存在。因為 CRA 已經幫你把它封裝起來了。
我們在 npm start
運行的是 react-scripts
這個套件
這個套件其實就包含了,React 專案預設要使用的設定檔及運行時要用的指令。
主要有幾個方式
直接去node_modules
底下,找到react-scripts
中的config
資料夾去下修改。
但缺點就是無法被版控,每次重新拉專案做 npm install 後就要手動調整一次,更不適合專案使用 CICD 的流程運行 DevOps 的狀況下。
CRA 專案在 package.json 的 script 部分有提供了一個指令:
"eject": "react-scripts eject"
使用這個指令後會將原本封裝在 CRA 的一些配置檔案都集中呈現在根目錄的 config 資料夾,就可以從這邊去調整 Webpack。執行後的目錄變化如下圖
但使用此方法的缺點就是無法享受 CRA 升級的好處,因為原本設定檔是放在 react-scripts
套件下,所以新版本升級時只需要升級套件就可以了,但被抽到專案下的話,未來升級就要自行維護設定檔。
react-app-rewired
若不想使用以上兩種方式的話,可以透過 react-app-rewired
套件去針對 CRA 的設定去做改寫,它是 React 社群開源的修改 CRA 配置的工具,這種方式讓開發者既不用eject設定檔至專案,也不用手動調整 react-scripts 套件就可以調整 Webpack 設定。
以下是使用 react-app-rewired
的設置流程
react-app-rewired
npm install react-app-rewired --save-dev
config-overrides.js
檔案/* config-overrides.js */
module.exports = function override(config, env){
// 參數中的config 就是預設的 webpack config
// 對config 進行修改
config.mode = 'development';
...
// do stuff with the webpack config...
// 最後一定要 Return 新的 Config
return config;
}
編譯時,react-app-rewired
會先取到 CRA 預設的 Webpack config,然後使用 override(config) 方法,對 config 進行修改,得到新的 Webpack config。Webpack 最終會使用這個新的config 進行打包。
react-scripts
修改為 react-app-rewired
啟動專案 npm start
建置專案 npm run build
react-app-rewired
的原生寫法,對webpack config 的修改全部寫在 override() 方法中,不夠模組化。customized-cra
提供了一些 helper 方法,可以將每一個獨立的修改放到單獨的函數中,再串接執行這些函數。
customize-cra
依賴於 react-app-rewired
套件,也是通過 config-overrides.js
來修改 CRA 原生的配置設定。
如同使用 react-app-rewired
的設置流程一樣,只是步驟一和二的做法稍微不同
react-app-rewired
及 customize-cra
npm install react-app-rewired customize-cra --save-dev
config-overrides.js
檔案,然後使用 customize-cra
的 helper function 修改 Webpack Config/* config-overrides.js */
const {
override,
addDecoratorsLegacy,
disableEsLint,
} = require("customize-cra");
const path = require("path");
module.exports = override(
// helper function - enable legacy decorators babel plugin
addDecoratorsLegacy(),
// helper function - disable eslint in webpack
disableEsLint(),
...
// 注意這裡的 override 的傳參變成了 helper-fn,且用,做串連
// 這裡也不用 return config
// 因為每個 helper-fn 預設都隱含 return 了 newConfig
);
如果我們想在建置專案時,就指定我們需要的版型,而不需手動做額外的設定。接下來就要來介紹 使用 Create React App 的 Template。
https://github.com/timarney/react-app-rewired
https://github.com/arackaf/customize-cra
https://segmentfault.com/a/1190000039850941
我用ReactJS只是當純前端,且只包含bundle.js(或客製化webpack後的檔名)在Thymeleaf中,後端以Spring Boot提供API,首先試用npm run eject, 這實在是災難,把一切都eject出來,很難保持乾淨,也回不去了,只好把備份回復過來。
應該用react-app-rewired來產生bundle.js吧? 您提到
react-app-rewired 的原生寫法,對webpack config 的修改全部寫在 override() 方法中,不夠模組化。customized-cra 提供了一些 helper 方法,可以將每一個獨立的修改放到單獨的函數中,再串接執行這些函數。
我查了customized-cra, 原來是對react-app-rewired再客製化,問題是,customized-cra最近的更新是2020年,落後今年初更新的react-app-rewired,看起來應該用react-app-rewired即可。 相比版本落後的問題,真實react-app-rewired有多大的模組化效益呢?