React
Только функциональные компоненты
Всегда используйте функциональные компоненты TSX с именованными экспортами.Свойства
Создайте тип с именем{ComponentName}Props. Используйте деструктуризацию. Не используйте React.FC.
Не используйте спред одного объекта пропсов
Управление состоянием
Атомы Jotai для глобального состояния
- Предпочитайте атомы вместо проброса пропсов
- Не используйте
useRefдля состояния — используйтеuseStateили атомы - Используйте семейства атомов и селекторы для списков
Избегайте лишних повторных рендеров
- Выносите
useEffectи загрузку данных в соседние сайдкар-компоненты - Предпочитайте обработчики событий (
handleClick,handleChange) вместоuseEffect - Не используйте
React.memo()— вместо этого исправьте первопричину - Ограничьте использование
useCallbackилиuseMemo
TypeScript
typeвместоinterface— более гибкий, проще компоновать- Строковые литералы вместо перечислений — за исключением перечислений из GraphQL codegen и внутренних API библиотеки
- Без
any— строгий режим TypeScript обязателен - Без type-импортов — используйте обычные импорты (принудительно через Oxlint
typescript/consistent-type-imports) - Используйте Zod для проверки во время выполнения нетипизированных объектов
JavaScript
Именование
- Переменные: camelCase, информативные (
email, а неvalue,fieldMetadata, а неfm) - Константы: SCREAMING_SNAKE_CASE
- Типы/Классы: PascalCase
- Файлы/директории: kebab-case (
.component.tsx,.service.ts,.entity.ts) - Обработчики событий:
handleClick(неonClickдля функции-обработчика) - Пропсы компонента: используйте префикс имени компонента (
ButtonProps) - Стилизованные компоненты: префикс
Styled(StyledTitle)
Стилизация
Используйте стилизованные компоненты Linaria. Используйте значения темы — избегайте жестко заданныхpx, rem или цветов.
Импорт
Используйте алиасы вместо относительных путей:Структура папок
- Модули могут импортировать из других модулей, но
ui/должен оставаться без зависимостей - Используйте подпапки
internal/для приватного кода модуля - Компоненты — до 300 строк, сервисы — до 500 строк