Frontender notes

Кастомизация темы Ant Design в React приложении

В последнее время я много делал домашних проектов с целью изучить новую технологию. Понятное дело что не хотелось очень сильно заморачиваться с дизайном, ну и тут на помощь приходят UI фреймворки. Среди всех известных мне UI фреймворков, больше всех меня зацепил Ant Design, своей простой и элегантностью. Слегка поработав с ним я понял что его можно использовать не только в пет-проектах , а и в продакшене. В сети есть много примеров крупных и не очень сайтов где он используется. Но все эти сайты объединяет то что они использую кастомизированную тему.

Инициализация приложения

Для инициализации будем использовать Create react app.Создадим проект с именем ant-setup, переходим в корневую папку проекта и устанавливаем Ant Design с помощью команд:

npx create-react-app ant-setup
cd ant-setup
yarn add antd

Ждем пока все установиться, открываем проект в редакторе кода и запускаем приложение:

code .
yarn start

Настройка Webpack

Далее нужно установить пакеты для переопределения webpack конфигурации:

yarn add babel-plugin-import react-app-rewired customize-cra

После этого изменим скрипты в нашем, package.json чтобы использовать react-app-rewired:

"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
}

После всех этих манипуляций нужно создать файл с именем config-overrides.js в корневом каталоге проекта с этим кодом:

const { override, fixBabelImports } = require('customize-cra')
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: 'css'
})
)

Этими строчками мы подключили стили от Ant Design. Хейтер скажет: "Зачем так загоняться, ведь можно просто подключить прописать строчку import 'antd/dist/antd.css' в index.js ?". Если так сделать, то не получиться норм кастомизировать тему, так написано в документации.

Финальные штрихи

После всей проделанной работы мы можем использовать компоненты Ant Design. В файле App.jsx я добавил несколько компонентов, и задал стили для демонстрации:

import React from 'react'
import { Layout, Menu, Breadcrumb, Button } from 'antd'
const { Header, Content, Footer } = Layout
const App = () => (
<Layout style={{ minHeight: '100vh' }}>
<Header>
<Menu theme='dark' mode='horizontal' defaultSelectedKeys={['2']}>
<Menu.Item key='1'>nav 1</Menu.Item>
<Menu.Item key='2'>nav 2</Menu.Item>
<Menu.Item key='3'>nav 3</Menu.Item>
</Menu>
</Header>
<Content style={{ padding: '0 50px' }}>
<Breadcrumb style={{ margin: '16px 0' }}>
<Breadcrumb.Item>Home</Breadcrumb.Item>
<Breadcrumb.Item>List</Breadcrumb.Item>
<Breadcrumb.Item>App</Breadcrumb.Item>
</Breadcrumb>
<div style={contentStyle}>
<Button type='primary'>Primary Button</Button>
<Button style={{ margin: '0 1rem' }}>Default Button</Button>
<Button type='dashed'>Dashed Button</Button>
</div>
</Content>
<Footer style={{ textAlign: 'center' }}>
Ant Design ©2020 Created by Yeroshenko
</Footer>
</Layout>
)
const contentStyle = {
backgroundColor: '#fff',
padding: '24px',
minHeight: '280px',
display: 'flex',
}
export default App

Если ваше приложение уже запущено, вам необходимо перезапустить его, чтобы увидеть эти новые изменения.

Если все делали правильно то вы увидите:

Ant layout before

Допустим, я решил использовать другой основной цвет. Очень просто!

Теперь осталось установить less и less-loader пакеты:

yarn add less less-loader

Затем просто добавить загрузчик LESS в файл config-overrides.js

const { override, fixBabelImports, addLessLoader } = require('customize-cra')
module.exports = override(
fixBabelImports('import', {
libraryName: 'antd',
libraryDirectory: 'es',
style: true,
}),
addLessLoader({
lessOptions: {
javascriptEnabled: true,
modifyVars: {
'@primary-color': '#7546C9', // custom
'@border-radius-base': '8px' // custom
},
},
})
)

Результат:

Ant layout after

Самой приятное то что Ant Design имеет очень много переменных и можно очень сильно все преобразовать. С списком всех переменных можно ознакомиться по ссылке.

Заключение

В конце хочу сказать что это действительно хорошая библиотека она реально простая в использовании и не настолько заезженная как Bootstrap или Material Ui. И если вы с ней ещё не знакомы то советую ознакомиться. Исходный код.

Опубликовано: 10.06.2020