Ant Design использует систему стилей на основе CSS-in-JS, что позволяет динамически управлять темами и изменять визуальное оформление компонентов на лету. Гидратация стилей — процесс, при котором стили, сгенерированные на сервере или при первоначальной загрузке страницы, синхронизируются с клиентской частью, чтобы избежать конфликтов и лишнего рендеринга.
Гидратация особенно критична для серверного рендеринга (SSR) в приложениях на React, где Ant Design используется вместе с библиотеками вроде Next.js. Без правильной гидратации стили могут мигрировать, дублироваться или полностью исчезать при первом рендере на клиенте.
Ant Design использует @ant-design/cssinjs для управления
стилями компонентов. Каждый компонент поставляется с собственной
системой генерации CSS, которая привязана к уникальному идентификатору.
Это предотвращает коллизии классов и обеспечивает корректное применение
тем.
Принципы работы гидратации стилей:
В Ant Design для этого используется компонент
<StyleProvider> и API useCacheToken.
<ConfigProvider> и
<StyleProvider><ConfigProvider> отвечает за глобальные настройки
Ant Design, включая локализацию, тему и управление форматом компонентов.
Для корректной гидратации стилей важно обернуть приложение в
<StyleProvider> с указанием свойства
ssrInline или cache:
import React from 'react';
import { ConfigProvider, theme, StyleProvider } from 'antd';
import { createCache } from '@emotion/cache';
const cache = createCache({ key: 'antd' });
function App({ children }) {
return (
<StyleProvider cache={cache}>
<ConfigProvider theme={theme.defaultAlgorithm}>
{children}
</ConfigProvider>
</StyleProvider>
);
}
Здесь createCache создает единый контейнер для всех
стилей, что обеспечивает их правильную гидратацию и предотвращает
дублирование CSS.
Ant Design 5 использует систему токенов для темы, позволяя управлять
цветами, отступами, типографикой и другими визуальными параметрами
динамически. Токены можно настраивать глобально или на уровне компонента
через useToken:
import { theme } from 'antd';
const { useToken } = theme;
function ButtonExample() {
const { token } = useToken();
return (
<button style={{ backgroundColor: token.colorPrimary, padding: token.padding }}>
Кнопка с токенами
</button>
);
}
Гидратация токенов обеспечивает, что при SSR сервер передает уже рассчитанные значения токенов клиенту, и кнопка отображается с правильными цветами и отступами без миграции стилей.
В больших проектах с множеством компонентов важно контролировать порядок и количество вставки стилей. Несколько рекомендаций:
StyleProvider для
всего приложения.<head>, полагаясь на встроенные
механизмы Ant Design.Наиболее частые ошибки при гидратации стилей:
StyleProvider.Для отладки рекомендуется использовать DevTools и проверять:
<head>,data-cache-key) у стилей,Для Next.js процесс гидратации включает:
renderToString или
renderToStaticMarkup.getInitialProps.Пример для _document.js:
import Document, { Html, Head, Main, NextScript } from 'next/document';
import { extractStyle } from '@ant-design/cssinjs';
export default class MyDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx);
const styles = extractStyle();
return { ...initialProps, styles };
}
render() {
return (
<Html>
<Head>{this.props.styles}</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}
Это гарантирует, что стили компонентов Ant Design рендерятся на сервере и правильно гидратируются на клиенте.
<StyleProvider> с единым кэшем
является обязательным для больших приложений.