Библиотека Radix UI развивается по принципам строгой модульности и предсказуемости изменений. Пакеты библиотеки распространяются через npm и используют стандарт Semantic Versioning (SemVer), который определяет структуру номера версии и правила совместимости между релизами.
Каждый пакет Radix UI имеет собственную версию и может обновляться независимо. Это связано с архитектурой библиотеки: компоненты распространяются как отдельные npm-пакеты, например:
@radix-ui/react-dialog@radix-ui/react-dropdown-menu@radix-ui/react-tabs@radix-ui/react-tooltipНезависимое версионирование позволяет обновлять только используемые компоненты, не затрагивая остальные зависимости проекта.
Radix UI придерживается стандарта SemVer, где версия имеет формат:
MAJOR.MINOR.PATCH
Увеличение MAJOR-версии означает наличие изменений, нарушающих обратную совместимость.
Примеры таких изменений:
Пример:
@radix-ui/react-dialog 1.x → 2.0
При переходе на новую major-версию требуется проверка кода и возможная адаптация компонентов.
Увеличение MINOR-версии означает добавление новых возможностей без нарушения обратной совместимости.
Типичные изменения:
Пример:
1.2.0 → 1.3.0
Код, написанный для предыдущей версии, продолжает работать без изменений.
Версия PATCH увеличивается при исправлении ошибок без изменения API.
Примеры:
Пример:
1.3.2 → 1.3.3
Такие обновления считаются полностью безопасными.
Radix UI использует independent versioning, то есть разные компоненты могут иметь разные версии.
Пример зависимостей:
{
"dependencies": {
"@radix-ui/react-dialog": "^1.0.5",
"@radix-ui/react-tabs": "^1.0.3",
"@radix-ui/react-tooltip": "^1.1.0"
}
}
Причины такого подхода:
1. Модульная архитектура
Каждый компонент развивается отдельно.
2. Минимизация обновлений
Не требуется обновлять всю библиотеку ради одного компонента.
3. Изолированные изменения
Обновления не распространяются на другие компоненты.
Несмотря на независимое версионирование, большинство пакетов Radix UI используют общие внутренние зависимости:
@radix-ui/react-primitive@radix-ui/react-compose-refs@radix-ui/react-context@radix-ui/react-idЭти пакеты обеспечивают базовую инфраструктуру компонентов.
При обновлении одного компонента npm автоматически разрешает совместимые версии этих внутренних зависимостей.
Некоторые пакеты Radix UI используют peerDependencies, главным образом для React.
Типичный пример:
"peerDependencies": {
"react": "^16.8 || ^17 || ^18",
"react-dom": "^16.8 || ^17 || ^18"
}
Это означает:
Причины использования peerDependencies:
1. предотвращение дублирования React
Несколько копий React в приложении приводят к ошибкам.
2. уменьшение размера node_modules
React используется совместно.
3. гарантированная совместимость контекста React
Контексты должны работать в рамках одной версии React.
Radix UI ориентирован на современную экосистему React.
Минимальные требования обычно включают:
React >= 16.8
Причина — использование React Hooks, которые появились в версии 16.8.
Современные версии библиотек полностью совместимы с:
В React 18 библиотека корректно работает с:
Radix UI полностью написан на TypeScript и поставляется с типами.
Пакеты включают:
*.d.ts
Типы распространяются вместе с библиотекой и не требуют установки
@types.
Совместимость типов зависит от версии TypeScript, используемой в проекте. Обычно поддерживаются версии:
TypeScript >= 4.x
Проблемы совместимости могут возникать при использовании очень старых версий TypeScript, например:
В проектах чаще всего используется диапазон версий:
^1.0.0
Символ ^ означает:
>=1.0.0 <2.0.0
Таким образом автоматически устанавливаются:
Но не устанавливаются major-обновления, которые могут ломать API.
Пример:
"@radix-ui/react-dialog": "^1.0.5"
Допустимые версии:
1.0.6
1.1.0
1.4.2
Недопустимые:
2.0.0
Для стабильности сборки используются lock-файлы:
package-lock.jsonyarn.lockpnpm-lock.yamlОни фиксируют точные версии установленных пакетов.
Это важно для Radix UI, поскольку minor-обновления могут содержать:
Lock-файл гарантирует, что у всех разработчиков используется одинаковая версия.
Обновление выполняется стандартными инструментами npm.
Обновление одного пакета:
npm update @radix-ui/react-dialog
Установка последней версии:
npm install @radix-ui/react-dialog@latest
Для проверки доступных обновлений используется:
npm outdated
Пример результата:
Package Current Wanted Latest
@radix-ui/react-dialog 1.0.2 1.0.5 2.0.0
Значения:
Переход между major-версиями требует анализа изменений.
Основные источники информации:
Типичные изменения:
Старый API:
<Dialog open={isOpen} onOpenCha nge={setIsOpen} />
Новый API может вводить дополнительные параметры или менять поведение.
Некоторые компоненты Radix UI используют compound pattern.
Пример:
<Dialog.Root>
<Dialog.Trigger />
<Dialog.Content />
</Dialog.Root>
В новой версии могут появляться новые элементы:
Dialog.PortalDialog.CloseDialog.DescriptionRadix UI уделяет большое внимание ARIA-совместимости.
Поэтому major-обновления иногда меняют:
Такие изменения улучшают доступность, но могут менять поведение компонентов.
Radix UI корректно работает с популярными фреймворками React.
В частности:
Next.js
Основные требования:
Radix UI реализует компоненты так, чтобы они безопасно работали в среде серверного рендеринга.
Например, порталы создаются только после монтирования компонента.
Radix UI распространяется в формате:
Это обеспечивает совместимость с большинством инструментов сборки:
Пакеты обычно содержат:
dist/index.js
dist/index.mjs
dist/index.d.ts
Это позволяет:
Radix UI проектировался для эффективного tree-shaking.
Это означает:
в итоговый bundle попадают только используемые компоненты.
Пример:
import * as Dialog from "@radix-ui/react-dialog"
Если используется только:
Dialog.Root
Dialog.Trigger
Dialog.Content
то остальные элементы не включаются в финальный bundle.
Minor-обновления иногда улучшают tree-shaking за счёт:
В больших приложениях используются дополнительные стратегии контроля версий.
Жёсткая фиксация версии:
"@radix-ui/react-dialog": "1.0.5"
Обновления происходят только вручную.
Наиболее распространённый вариант:
"^1.0.5"
Автоматически применяются безопасные обновления.
Автоматические системы обновления зависимостей создают pull request при выходе новых версий.
Это позволяет:
Команда Radix UI старается максимально сохранять обратную совместимость.
Основные принципы:
1. стабильный API
breaking-changes происходят редко.
2. предварительные предупреждения
устаревшие функции помечаются как deprecated.
3. подробные changelog
каждое изменение документируется.
Перед обновлением major-версии рекомендуется:
Особенно это важно для компонентов:
Поскольку они активно управляют фокусом и взаимодействием пользователя.