Ant Design v5, получивший кодовое название «Непрерывность», нацелен на решение наболевших проблем предыдущих версий: гигантский размер бандла, ограниченные возможности кастомизации и жесткую привязку к LESS. Архитекторам важно понимать, что эти изменения носят структурный характер и затрагивают все уровни стека.
Сердцем v5 стала замена LESS на CSS-in-JS решение собственной разработки — @ant-design/cssinjs. Это не эмоциональный выбор в угоду моде, а техническая необходимость для достижения динамической темизации, поддержки нескольких тем одновременно (например, светлой и темной) и значительного уменьшения runtime. Вместо предварительной компиляции всех возможных стилей, CSS генерируется на лету и инжектится в `` тэги. Это радикально меняет подход к кастомизации.
Ключевое концептуальное изменение — переход на Дизайн-Токены. В v4 кастомизация была болезненной: нужно было переопределять LESS-переменные, что часто приводило к каскадным переопределениям и хрупким стилям. В v5 вся дизайн-система описана через набор токенов — JavaScript-объектов, содержащих ключевые значения: цвета, размеры, отступы, тени, анимации. Например, `colorPrimary`, `borderRadius`, `fontSize`. Теперь кастомизация — это работа с этими токенами через единый API `theme`. Вы можете создать свою тему, просто предоставив объект с новыми значениями токенов, и библиотека автоматически пересчитает все компоненты.
Первым и самым критическим шагом для архитектора является оценка объема работ. Создайте инвентаризацию вашего кодаbase. Используйте статический анализ (например, с помощью `jscodeshift` или простых grep-скриптов), чтобы найти:
- Прямые переопределения стилей LESS (импорты `.less` файлов, использование `modifyVars` в `webpack`/`craco`).
- Использование устаревших API компонентов, которые были удалены или изменены в v5 (например, `visible` проп в `Modal` заменен на `open`).
- Кастомные компоненты, которые сильно зависят от внутренней структуры классов Antd v4.
- Переименовать устаревшие пропсы (например, `visible` -> `open`).
- Обновить импорты иконок (v5 выносит все иконки в отдельный пакет `@ant-design/icons` и использует tree-shakeable импорты).
- Преобразовать некоторые шаблонные переопределения LESS в эквиваленты на токенах.
Теперь разработайте стратегию миграции. Есть три основных подхода:
- Полный и одномоментный переход. Подходит для небольших или новых проектов. Выделите спринт на обновление, протестируйте все сценарии и выпустите новую версию.
- Постепенная миграция с использованием пакета `@ant-design/compatible`. Этот пакет предоставляет обертки для компонентов v4, которые можно использовать внутри приложения на v5. Это позволяет обновлять библиотеку постепенно, компонент за компонентом. Стратегия: обновите `antd` до v5, установите `@ant-design/compatible`, настройте `babel-plugin-import` для обработки обоих пакетов. Затем последовательно заменяйте импорты из `@ant-design/compatible` на нативные из `antd`, рефакторя код под новые API.
- Миграция на уровне модулей/микросервисов. Если у вас микрофронтенд-архитектура, можно обновлять независимые приложения по одному. Это снижает риски, но требует поддержки двух версий библиотеки в течение более длительного времени.
Шаг 1: Откажитесь от LESS. Удалите все импорты `.less` файлов Antd и ваши кастомные LESS-файлы, которые их переопределяют. Отключите `modifyVars` в конфигурации сборщика.
Шаг 2: Определите вашу тему через токены. Проанализируйте, какие переменные LESS вы переопределяли. Сопоставьте их с токенами v5. Создайте объект темы. Базовый пример:
```
import { theme } from 'antd';
const { defaultAlgorithm, darkAlgorithm } = theme;
const customTheme = {
algorithm: defaultAlgorithm, // или darkAlgorithm для темной темы
token: {
colorPrimary: '#1890ff',
borderRadius: 8,
colorBgContainer: '#f6ffed',
},
};
```
Шаг 3: Примените тему. Используйте компонент `ConfigProvider` из `antd` в корне вашего приложения:
```
```
Шаг 4: Для сложных, компонент-специфичных стилей, которые раньше делались через глубокие селекторы LESS, используйте новые возможности. Для точечной стилизации используйте проп `styles` или `className` компонентов, которые теперь поддерживаются стабильно. Для создания производных компонентов с собственной стилизацией используйте хук `useToken()` для доступа к текущим токенам внутри ваших компонентов.
Особое внимание уделите иконкам. В v5 иконки вынесены в отдельный пакет `@ant-design/icons-v5` (в последующих обновлениях — просто `@ant-design/icons`). Это позволяет эффективно tree-shake неиспользуемые иконки. Вам нужно обновить все импорты:
Было: `import { Icon } from 'antd';` или `import { SearchOutlined } from '@ant-design/icons';`
Стало: `import { SearchOutlined } from '@ant-design/icons';`
Убедитесь, что вы импортируете конкретные иконки, а не весь пакет.
Производительность и размер бандла. Обещание v5 — меньший размер. Однако при миграции убедитесь, что вы правильно настроили tree shaking. Удалите `babel-plugin-import` для Antd v5 (он больше не нужен, так как библиотека поддерживает ES modules). Используйте момент обновления для аудита размера бандла с помощью `webpack-bundle-analyzer`. Вы должны увидеть значительное уменьшение размера, связанного со стилями.
Тестирование — критическая фаза. Помимо стандартного unit- и integration-тестирования, уделите особое внимание:
- Визуальному регрессионному тестированию (Visual Regression Testing). Используйте инструменты вроде Percy, Chromatic или даже локальный `jest-image-snapshot`, чтобы убедиться, что кастомизация не сломала внешний вид компонентов.
- Тестированию доступности (a11y). Antd v5 улучшил семантику и ARIA-атрибуты. Проверьте, что ваши кастомные изменения не нарушили доступность. Используйте `axe-core` или `jest-axe`.
- Тестированию темной темы. Если вы ее используете, убедитесь, что все кастомные компоненты правильно реагируют на смену темы.
Комментарии (8)