Типичная структура React-приложения

Структура React-приложения определяется инструментом сборки (например, Vite или Create React App), но вы можете организовать файлы как угодно. Однако со временем в сообществе сложились общепринятые практики, которые делают код читаемым, поддерживаемым и масштабируемым.

Вот типичная структура всего проекта:

my-app/
├── node_modules/     # Установленные зависимости (не редактируется вручную)
├── public/           # Статические файлы, которые копируются "как есть" в сборку
│   ├── index.html    # Основной HTML-файл с контейнером для React (<div id="root">)
│   ├── favicon.ico   # Иконка вкладки браузера
│   └── ...           # Другие файлы, доступные напрямую по пути (robots.txt, manifest.json и т.п.)
├── src/              # Исходный код приложения
│   ├── main.jsx      # Точка входа: инициализация React и рендеринг корневого компонента
│   ├── App.jsx       # Корневой компонент приложения
│   ├── components/   # Переиспользуемые UI-элементы: кнопки, карточки, инпуты
│   ├── pages/        # Крупные компоненты, представляющие отдельные экраны или разделы
│   ├── assets/       # Изображения, шрифты, иконки, используемые в компонентах
│   ├── styles/       # Глобальные CSS-файлы, переменные темы, общие стили
│   ├── hooks/        # Кастомные хуки (если используются)
│   └── utils/        # Вспомогательные функции: форматирование, валидация и т.п.
├── .gitignore        # Файлы и папки, исключённые из системы контроля версий
├── package.json      # Зависимости, скрипты запуска и метаданные проекта
├── vite.config.js    # Конфигурация Vite (или webpack.config.js в CRA)
└── ...               # Другие конфигурационные файлы (если есть)

Роль папки public

Файлы из public/ не обрабатываются сборщиком. Они копируются в корень итоговой сборки без изменений. Например, public/favicon.ico будет доступен как /favicon.ico в браузере. Используйте эту папку только для файлов, которые должны сохранять точное имя и путь (например, манифест PWA или файлы для SEO).

Роль папки src

Вся логика приложения живёт в src/. Именно отсюда начинается сборка. Файлы вне src/ (кроме public/) обычно не участвуют в работе приложения напрямую.

Глобальные и локальные стили

В React вы можете использовать два основных подхода к стилям:

Глобальные стили

Хранятся в папке styles/ или подключаются напрямую в main.jsx или index.html. Они применяются ко всему приложению:

/* src/styles/global.css */
body {
  margin: 0;
  font-family: sans-serif;
}

Такие стили полезны для сброса браузерных значений, настройки шрифтов или цветовой палитры.

Локальные (компонентные) стили

Часто каждый компонент имеет свой собственный CSS-файл, размещённый рядом с ним:

components/
├── Button.jsx
└── Button.css

В компоненте стили импортируются как модуль:

// Button.jsx
import './Button.css';

export function Button() {
  return <button className="primary-button">Нажми</button>;
}

Такой подход инкапсулирует стили внутри компонента, но классы всё ещё глобальны — если два компонента используют одинаковое имя класса, они могут конфликтовать.

CSS Modules (рекомендуется для изоляции)

Чтобы избежать конфликтов имён, можно использовать CSS Modules. Для этого файл стилей называют с расширением .module.css:

/* Button.module.css */
.btn {
  background: blue;
  color: white;
}

Импорт происходит как объект:

// Button.jsx
import styles from './Button.module.css';

export function Button() {
  return <button className={styles.btn}>Нажми</button>;
}

Сборщик автоматически генерирует уникальные имена классов (например, Button_btn__abc123), гарантируя изоляцию стилей.

Зачем такая структура

Чёткое разделение упрощает:

  • Поиск нужного файла.
  • Понимание ответственности каждой части кода.
  • Добавление новых экранов или компонентов без хаоса.
  • Совместную работу в команде.

Даже в небольших проектах полезно сразу придерживаться этой структуры — это экономит время при масштабировании.