Как вы структурируете React-проект? Какие директории/паттерны используете?
Структура React-проекта — ключ к его масштабируемости, читаемости и удобству сопровождения. Чем крупнее приложение, тем важнее продуманный подход к организации директорий, разделению ответственности, повторному использованию компонентов и управлению зависимостями. Ниже описаны подходы и паттерны, используемые в современных React-проектах, включая модульную структуру, фиче-ориентированный подход, atomic design, слой архитектуры, доменные и UI-компоненты, хуки, сервисы и стили.
1. Базовая структура
Стартовая структура проекта может выглядеть так:
src/
├── assets/ # картинки, шрифты, svg
├── components/ # переиспользуемые UI-компоненты
├── features/ # фичи или модули
├── entities/ # бизнес-сущности (пользователь, пост, продукт и т.д.)
├── pages/ # маршруты / страницы
├── app/ # глобальные настройки и инициализация (роутинг, store, theming)
├── shared/ # утилиты, константы, переиспользуемые хуки и UI
└── widgets/ # композиционные UI-блоки
Этот подход популярен в feature-sliced design и хорошо масштабируется.
2. Feature-Sliced Design
Это архитектурный подход, при котором проект делится на фичи, сущности, виджеты, страницы, шаред и ядро приложения.
Структура слоёв:
src/
├── app/ # глобальные настройки, entry point
├── processes/ # бизнес-процессы (регистрация, checkout)
├── pages/ # конечные страницы (маршруты)
├── widgets/ # самостоятельные блоки UI (header, sidebar)
├── features/ # логически завершённые функции (auth, cart)
├── entities/ # бизнес-сущности (user, product, article)
├── shared/ # атомарные UI-компоненты, утилиты, api, config
└── assets/
Пример features/auth:
features/
└── auth/
├── ui/
│ └── LoginForm.tsx
├── model/
│ ├── useAuth.ts
│ └── store.ts
├── lib/
│ └── validators.ts
└── api/
└── login.ts
Пример entities/user:
entities/
└── user/
├── ui/
│ └── Avatar.tsx
├── model/
│ └── useUser.ts
└── types/
└── user.ts
3. Подход Atomic Design
Деление компонентов по уровню абстракции:
-
atoms/ – кнопки, иконки, инпуты
-
molecules/ – группы атомов (инпут + лейбл)
-
organisms/ – сложные блоки (форма входа, карточка товара)
-
templates/ – страницы без данных
-
pages/ – готовые страницы с данными
Пример:
components/
├── atoms/
│ └── Button.tsx
├── molecules/
│ └── InputWithLabel.tsx
├── organisms/
│ └── LoginForm.tsx
└── templates/
└── MainLayout.tsx
4. Разделение компонентов по типам
UI-компоненты:
-
Не знают про бизнес-логику
-
Только отображают данные
-
Чаще всего в shared/ui/
Container/Smart-компоненты:
-
Владеют логикой, состоянием, запросами
-
Обычно внутри features, widgets или pages
5. Папка app/
Содержит глобальные зависимости и настройки:
app/
├── App.tsx
├── index.tsx
├── router.tsx
├── store.ts
├── providers/ # провайдеры: redux, i18n, theme
└── styles/ # глобальные стили, темы
6. Хуки
Все кастомные хуки хранятся отдельно, чаще всего:
shared/hooks/
└── useDebounce.ts
└── useModal.ts
Или хуки для конкретной фичи:
features/auth/model/useAuth.ts
7. API
Если используется RTK Query, Axios или другой подход, часто выделяется директория:
shared/api/
└── base.ts
features/auth/api/login.ts
entities/user/api/getUser.ts
8. Стили
Разделяют глобальные и модульные стили:
app/styles/
└── variables.css
shared/ui/Button/
└── Button.module.scss
Можно использовать Tailwind, CSS Modules, styled-components, Emotion — в зависимости от проекта.
9. Константы, утилиты, types
shared/
├── config/ # конфиги окружения
│ └── env.ts
├── lib/ # утилиты
│ └── formatDate.ts
├── constants/ # статичные данные
│ └── routes.ts
├── types/ # глобальные типы
│ └── index.ts
10. Пример реальной структуры проекта
src/
├── app/
│ ├── App.tsx
│ ├── index.tsx
│ └── router.tsx
├── pages/
│ ├── Home/
│ │ └── HomePage.tsx
│ └── Profile/
│ └── ProfilePage.tsx
├── features/
│ └── auth/
│ ├── ui/
│ │ └── LoginForm.tsx
│ ├── model/
│ │ └── useAuth.ts
│ └── api/
│ └── login.ts
├── entities/
│ └── user/
│ ├── ui/
│ │ └── Avatar.tsx
│ └── model/
│ └── useUser.ts
├── widgets/
│ └── Header/
│ ├── Header.tsx
│ └── Logo.tsx
├── shared/
│ ├── ui/
│ │ └── Button.tsx
│ ├── hooks/
│ │ └── useWindowSize.ts
│ ├── lib/
│ │ └── formatDate.ts
│ ├── types/
│ └── config/
└── assets/
└── logo.svg
11. Интеграция с монорепозиториями (если есть)
Если проект большой и используется Monorepo (Turborepo, Nx), структура может быть:
packages/
├── ui-kit/
├── auth-feature/
├── user-entity/
├── app/
└── shared/
Каждый пакет публикуется или используется внутри проекта как зависимость.
12. Папка tests/, storybook и документация
Если используется Storybook или Unit-тесты:
src/
├── components/
│ └── Button/
│ ├── Button.tsx
│ ├── Button.test.tsx
│ └── Button.stories.tsx
Такой подход к структуре React-проекта помогает избежать путаницы, улучшает читаемость кода, упрощает масштабирование и onboarding новых разработчиков. Он также способствует лучшей изоляции ответственности между слоями (UI, логика, данные, роутинг) и позволяет более эффективно работать в команде.