create-react-app配置Antd自定义主题/按需导入
官方定制主题方案
Ant Design 的样式变量
antd 的样式使用了 Less 作为开发语言,并定义了一系列全局/组件的样式变量,你可以根据需求进行相应调整。以下是一些最常用的通用变量,所有样式变量可以在 这里 找到。
@primary-color: #1890ff; // 全局主色
@link-color: #1890ff; // 链接色
@success-color: #52c41a; // 成功色
@warning-color: #faad14; // 警告色
@error-color: #f5222d; // 错误色
@font-size-base: 14px; // 主字号
@heading-color: rgba(0, 0, 0, 0.85); // 标题色
@text-color: rgba(0, 0, 0, 0.65); // 主文本色
@text-color-secondary : rgba(0, 0, 0, .45); // 次文本色
@disabled-color : rgba(0, 0, 0, .25); // 失效色
@border-radius-base: 4px; // 组件/浮层圆角
@border-color-base: #d9d9d9; // 边框色
@box-shadow-base: 0 2px 8px rgba(0, 0, 0, 0.15); // 浮层阴影
自定义主题
按照 配置主题 的要求,自定义主题需要用到 less 变量覆盖功能。
我们可以使用craco(一个对create-react-app进行自定义配置的社区解决方案)。
1、安装craco。
npm i @craco/craco -D
修改 package.json 里的 scripts 属性。
"scripts": {
- "start": "react-scripts start",
- "build": "react-scripts build",
- "test": "react-scripts test",
+ "start": "craco start",
+ "build": "craco build",
+ "test": "craco test",
}
2、安装craco-less
npm i craco-less -D //less处理插件
然后在项目根目录创建一个 craco.config.js 用于修改默认配置。
const CracoLessPlugin = require('craco-less');
module.exports = {
plugins: [
{
plugin: CracoLessPlugin,
options: {
lessLoaderOptions: {
lessOptions: {
modifyVars: {
'@primary-color': 'red', // 全局主色
},
javascriptEnabled: true,
},
}
},
},
],
};
注意还要在文件index.js 顶部引入 antd.css样式
import 'antd/dist/antd.css';
按需导入
使用 babel-plugin-import
注意:antd 默认支持基于 ES module 的 tree shaking,js 代码部分不使用这个插件也会有按需加载的效果。
babel-plugin-import 是一个用于按需加载组件代码和样式的 babel 插件(原理),现在我们尝试安装它并修改 craco.config.js 文件。
npm i babel-plugin-import -D //自动导入antd的css样式
2.2 配置
-
在根目录创建
craco.config.js
文件
const CracoLessPlugin = require('craco-less');
module.exports = {
babel: {//支持装饰器
plugins: [
[
"import",
{
"libraryName": "antd",
"libraryDirectory": "es",
"style": true //设置为true即是less 用css写'css'
}
]
]
},
plugins: [
{
plugin: CracoLessPlugin,
options: {
lessLoaderOptions: {
lessOptions: {
modifyVars: {
'@primary-color': 'red', // 全局主色
},
javascriptEnabled: true,
},
}
},
},
],
};
使用
import React from 'react'
import { Button } from 'antd';
//import 'antd/dist/antd.css';
export default function App() {
return (
<div>
<Button type="primary">按钮1</Button>
<Button type="link">按钮2</Button>
<Button type="success">按钮3</Button>
</div>
)
}