React项目中antd的按需引入与自定义主题

一.React中使用antd

1.下载antd包

   npm i antd -S

2.按需引入

//App.jsx文件
import {Button} from 'antd' //引入按钮组件 import {WechatOutlined, ShoppingCartOutlined } from '@ant-design/icons'; //icon图标库需要另外引入
import 'antd/dist/antd.css' //引入antd的所有样式

3.使用组件

 1 export default class App extends Component {
 2     state = {
 3         size: 'large',
 4     };
 5 
 6     render() {
 7         return (
 8             <div>
 9                 App...
10                 <Button type="primary">Primary Button</Button>
11                 <button>点我</button>
12                 <Button type="primary" icon="search">
13                     Search
14                 </Button>
15                 <Button icon="search">Search</Button>
16                 <WechatOutlined />
17                 <Button type="primary" icon="download" size={this.state.size}>
18                 Download
19                 </Button>
20                 <ShoppingCartOutlined />
21           </div>
22         )
23     }
24 }

4.效果

React项目中antd的按需引入与自定义主题

 

 

二.修改react默认配置

 打开一个react项目,我们看到的 create-react-app 生成的默认目录结构如下

React项目中antd的按需引入与自定义主题

 

 没有webpack.config.js配置文件,因为项目为了防止我们胡乱修改导致项目崩溃,帮我们隐藏了。如果我们想要修改webpack.config.js文件该如何呢?

方法一:

直接执行 npm run eject

但是这样操作是不可逆的,对于熟悉webpack配置的人来说,可以随意按照自己的需求修改配置,可以这样操作,但是对于不了解webpack的小伙伴建议看第二种方法。

方法二:

1 下载react-app-rewired 和 customize-cra

yarn add react-app-rewired customize-cra
或者
npm i  react-app-rewired customize-cra

其中customize-cra 用于执行 config-overrides.js中的修改规则

 当customize-cra修改config-overrides.js中的规则时,需要react-app-rewired 用于使用新规则(react-app-rewired 替换 react-scripts)启动脚手架,此时需要重新配置package.json文件(见第3步骤)

2.在项目根目录创建一个 config-overrides.js 用于修改默认配置。

 

1 //config-overrides.js
2 module.exports = function override(config, env) {
3   // do stuff with the webpack config...
4   return config;
5 };

 

在这个文件的方法中可以修改webpack配置,又不会破坏react项目的原有配置

3.修改package.json文件

1  "scripts": {
2     "start": "react-app-rewired start",
3     "build": "react-app-rewired build",
4     "test": "react-app-rewired test",
5     "eject": "react-scripts eject"
6   },

4.重新启动项目,配置即可生效

 

三.antd样式的按需引入

1.原因:项目中只是使用了antd中的部分组件,但是却加载了全部的 antd 组件的样式(gzipped 后一共大约 60kb),这样造成的结果是项目打包后体积过大,所以此时我们需要对 create-react-app 的默认配置进行自定义

2.按需引入操作:

说明:在基于上一节使用方法二修改webpack的基础上进行配置

2.1 安装babel-plugin-import :是一个用于按需加载组件代码和样式的 babel 插件(原理),现在我们尝试安装它并修改 config-overrides.js 文件。

yarn add babel-plugin-import
或者
npm i  babel-plugin-import

2.2修改 config-overrides.js 文件

 1 const { override, fixBabelImports } = require('customize-cra');
 2 
 3 
 4  module.exports = override(
 5   fixBabelImports('import', {
 6      libraryName: 'antd',
 7     libraryDirectory: 'es',
 8      style: 'css',
 9    }),
10  );

 

2.3 移除前面在 src/App.jsx 里全量添加的 @import 'antd/dist/antd.css'; 样式代码

2.4 最后重启 yarn start 访问页面,antd 组件的 js 和 css 代码都会按需加载,你在控制台也不会看到这样的警告信息

这时你能发现没有在页面中手动引入样式,但是组件样式依然存在,正常显示。

四.自定义主题

 按照 配置主题 的要求,自定义主题需要用到 less 变量覆盖功能。我们可以引入 customize-cra 中提供的 less 相关的函数 addLessLoader 来帮助加载 less 样式,同时修改 config-overrides.js 文件

1.下载安装less  less-loader

yarn add less less-loader
或者
npm i  less less-loader

2.修改文件

 1 //配置具体的修改规则 
 2 //config-overrides.js
 3  const { override, fixBabelImports, addLessLoader  } = require('customize-cra');
 4  const themeColor = require('./theme-color-config') 
 5 
 6  module.exports = override(
 7     fixBabelImports('import', {
 8      libraryName: 'antd',
 9      libraryDirectory: 'es',
10      style: true,
11    }),
12    addLessLoader({
13     lessOptions:{
14         javascriptEnabled: true,
15         modifyVars: { ...themeColor },
16     }
17    }),
18  );

其中 theme-color-config.js文件也是位于根目录下的,主要用来配置具体的主题样式

1 //主题颜色配置
2 //theme-color-config.js
3 module.exports = {
4     '@primary-color': '#FF0000',
5     '@table-bg': '#FFC0CB',
6 }

可以参考 配置主题 文档配置。

3.最后npm run start重新启动项目即可

React项目中antd的按需引入与自定义主题

 

 

 

 

 

参考:https://3x.ant.design/docs/react/use-with-create-react-app-cn#%E9%AB%98%E7%BA%A7%E9%85%8D%E7%BD%AE

         https://www.cnblogs.com/haimengqingyuan/p/13380508.html  

       

 

上一篇:2021.1.12 新建react项目 设置webstorm代码自动提示


下一篇:antd vue Message 全局提示的使用