План
Общий обзор структуры проекта
Единицей структурирования основной массы исходников приложения является бандл (можно называть и модуль, но специальное название более чётко отделяет это понятие от обычного js-файла, который тоже называют модулем) — определённым образом структурированная директория исходников, “решающая” определённую общую задачу.
Структура бандла не диктуется фреймворком и является исключительно конвенциональной, но от этого не менее обязательной. Бандлы могут быть вложенными и составлять некую произвольную иерархию, которая, как правило, отражает иерархию интерфейса приложения.
Следующие имена поддиректорий бандла являются “зарезервированными”:
actions/
— содержит экшн-креаторы (action-creators) для redux. Модули и классы в этой папке должны содержать
суффикс Actions
(например, actions/photoActions.ts
).actionTypes/
(deprecated) — директория для объявления глобальных констант и типов для redux-actions. Ввиду
очень узкого назначения, решено отказаться от таких папок в пользу types
.api/
— сервисы по низкоуровневому взаимодействию с бекендом. Слой, реализующий непосредственно REST-API запросы
к нужным энд-поинтам с нужными параметрами.components/
— в этой папке должны располагаться все компоненты, которые занимаются представлением (view-слой).
Эти компоненты не должны заниматься бизнес-логикой, а лишь отображением текущего состояния, полученного
из redux и relay плюс пробросом пользовательских событий.containers/
— higher-order-компоненты, которые не занимаются отображением, а являются прослойкой для подготовки
данных и колбеков, реализующих бизнес-логику, для view-компонентов. Зачастую, располагаются в корневом бандле
common
и являются общими для web- и мобильного приложения.models/
— описания типов и различных валидаций моделей данных, получаемых от бекенда.mutations/
— классы relay-мутаций.reducers/
— описание типов для глобального redux-состояния и redux-редьюсеров.services/
— классы сервисов общего назначения.types/
— содержит файлы с описанием общих констант и типов для каких-либо задач в рамках бандла (далёкий аналог
.h
-файлов в C++), включая описание actionTypes для redux. Названия файлов в этой директории должны содержать
суффикс Types
(например, types/photoTypes.ts
).utils/
— вспомогательные функции (утилиты) локального значения для бандла. Утилиты должны быть stateless.В корневой папке бандла также могут располагаются различные файлы конфигурации/документации, например:
routes.tsx
— конфигурация роутов для react-router
.configSchema.ts
— схема для конфиграционного файла convict
.*Module.ts
— модули с описанием сервисов для нашей DI-библиотеки ts-guice
.README.md
— общее описание предназначения бандла.Примечание
В простых случаях подпапки с зарезервированными названиями models
, reducers
, types
и utils
могут быть представленны в виде одиночного файла в корне бандла с таким же названием, например types.ts
.
Подпапки бандла с другими названиями должны восприниматься как вложенные бандлы и иметь аналогичную структуру.