Типичная структура 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), гарантируя изоляцию стилей.
Зачем такая структура
Чёткое разделение упрощает:
- Поиск нужного файла.
- Понимание ответственности каждой части кода.
- Добавление новых экранов или компонентов без хаоса.
- Совместную работу в команде.
Даже в небольших проектах полезно сразу придерживаться этой структуры — это экономит время при масштабировании.