網(wǎng)站首頁 編程語言 正文
1. 不使用custom-cra的原因
custom-cra,react-app-rewired
與 craco
都是用來無 eject 重寫 CRA 配置
custom-cra上次更新在兩年前,有些配置跟不上新的版本,例如使用webpack5配置less會出錯, 雖說目前有了解決方案引入新包customize-cra-less-loader
,但是隨著webpack5的廣泛使用,越來越多的問題暴露了出來,因此在未來版本中尋找替代方案是非常有必要的
2. craco基本使用
安裝依賴yarn add @craco/craco
修改 pacage.json 中的命令,將react-app-rewired改為craco
{ "scripts":{ "start": "craco start", "build": "craco build", "test": "craco test" } }
在根目錄創(chuàng)建 craco.config.js 配置文件
/* craco.config.js */ module.exports = { webpack: {}, babel: {}, }
craco 更多配置
3. 使用craco修改antd主題
安裝依賴 yarn add craco-less
/* craco.config.js */ const CracoLessPlugin = require('craco-less'); module.exports = { webpack: {}, babel: {}, //配置craco提供的plugin plugins: [ { // 修改antd主題 plugin: CracoLessPlugin, options: { lessLoaderOptions: { lessOptions: { math: 'always', modifyVars: { '@primary-color': '#1890ff', //主題顏色 }, javascriptEnabled: true, }, }, }, }, ], }
4. 別名
在webpack.alias中配置別名
/* craco.config.js */ const path = require('path'); module.exports = { webpack: { alias: { '@': path.resolve(__dirname, '../src'), '@moduleIcon': path.resolve(__dirname, '../src/assets/images/moduleIcon'), '@pages': path.resolve(__dirname, '../src/pages'), }, }, babel: {}, plugins: [], };
5. babel擴(kuò)展
- lodash按需打包
新建addBabelPlugins.js
const addBabelPlugins = () => { const configs = [ ['import', { libraryName: 'lodash', libraryDirectory: '', camel2DashComponentName: false }, 'lodash'], ]; return configs; }; module.exports = addBabelPlugins;
在babel.plugins中配置babel擴(kuò)展
/* craco.config.js */ const addBabelPlugins = require('./addBabelPlugins.js'); module.exports = { webpack: { alias: {}, }, babel: { plugins: addBabelPlugins(), }, plugins: [], };
- 按環(huán)境引入擴(kuò)展
修改addBabelPlugins.js
const addBabelPlugins = () => { const configs = [ ['import', { libraryName: 'lodash', libraryDirectory: '', camel2DashComponentName: false }, 'lodash'], ]; if (process.env.NODE_ENV !== 'development') { configs.push(['babel-plugin-transform-remove-console', { exclude: ['error', 'warn'] }]); } return configs; }; module.exports = addBabelPlugins;
之所以使用函數(shù)的方式引入擴(kuò)展,主要是為了方便在函數(shù)中進(jìn)行環(huán)境的判斷等操作,也可以使用craco自帶的whenDev
等函數(shù)進(jìn)行環(huán)境判斷,比如:
const { whenDev } = require("@craco/craco"); module.exports = { webpack: { //配置webpack的plugin plugins: [ new ConfigWebpackPlugin(), ...whenDev(() => [new CircularDependencyPlugin()], []) ] } };
6. 分包
新建addSplitChunks.js
const addSplitChunks = () => { if (process.env.NODE_ENV !== 'development') { return { chunks: 'all', minSize: 30000, name: false, maxAsyncRequests: 5, maxInitialRequests: 3, cacheGroups: { 'echarts.vendor': { name: 'echarts.vendor', priority: 40, test: /[\\/]node_modules[\\/](echarts|zrender)[\\/]/, chunks: 'all', }, 'async-common': { chunks: 'async', minChunks: 2, name: 'async-commons', priority: 30, }, commons: { name: 'commons', chunks: 'all', minChunks: 2, priority: 20, }, }, }; } return {}; }; module.exports = addSplitChunks;
修改craco.config.js
const addSplitChunks = require('./addSplitChunks.js'); module.exports = { webpack: { configure: (webpackConfig, { env }) => { webpackConfig.optimization.splitChunks = addSplitChunks(); return webpackConfig; }, }, };
在webpack.configure中可以配置任何webpack的配置
7. 配置代理
/* craco.config.js */ module.exports = { devServer: { port: 9000, proxy: { "/juhe": { target: "http://v.juhe.cn", changeOrigin: true, secure: false, pathRewrite: { "^/juhe": "", }, }, }, }, };
secure:默認(rèn)情況下,將不接受在HTTPS上運(yùn)行且證書無效的后端服務(wù)。如有需要將secure設(shè)為false
changeOrigin:默認(rèn)情況下,代理時會保留主機(jī)頭的來源,可以將changeOrigin設(shè)為true覆蓋此行為
8. 最后
如果不清楚webpack5的配置,可參考我的另一篇文章webpack5詳細(xì)教程(5.68.0版本)
原文鏈接:https://juejin.cn/post/7163092138337992741
相關(guān)推薦
- 2022-04-01 Go?加密解密算法小結(jié)_Golang
- 2023-11-13 【云原生】python獲取docker stats 容器cpu使用率
- 2023-12-20 IDEA新建maven項目,使用mybatis操作數(shù)據(jù)庫完整過程
- 2023-01-10 Qt實現(xiàn)可以計算大數(shù)的簡單計算器_C 語言
- 2022-02-23 Eclipse中語句前后都出現(xiàn)奇怪的符號
- 2022-05-06 詳析Python面向?qū)ο笾械睦^承_python
- 2022-11-05 ASP.NET?MVC實現(xiàn)樹形導(dǎo)航菜單_實用技巧
- 2022-04-22 electron設(shè)置最小大小和最大大小
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支