Структура React REST API приложения + TypeScript + Styled-Components
Предисловие
Когда я только начал знакомиться с React, мне приходилось искать, и искать довольно-таки долго, информацию, которая помогла бы мне грамотно организовать структуру моих будущих проектов, но дельной информации было мало.
Кто-то советовал делать плоскую структуру, в том числе и для папки, в которой находятся компоненты. Кто-то же советовал просто разделять компоненты на «Молекулы», «Организмы» и т.д., но при этом мало внимания уделялось хранению логики приложения (сервисы, хуки, и т.д.).
НО, были и хорошие, одной из которых я вдохновился, от которой и почерпнул идею хранения всей логики в папке «Core».
(!) Прошу вас, на время прочтения этой статьи, держать в голове мысль, что то, что тут предлагаю — это всего-лишь одна из идей того, как можно организовать структуру своего приложения. Не стоит воспринимать мои слова, как догму (это относится к тем, кто только начал свое знакомство с React), ведь я и сам новичок.Буду очень рад, если вы оставите предложения по улучшению данной структуры, как и вашей конструктивной критике.
Components
Компоненты, в данной структуре, разделяются на:
- Умные (Smart)
- Обычные (Ordinary)
- Простые (Simple)
- UI (UI, как ни странно)
- Контейнеры (Containers)
- Страницы (Pages)
Первые четыре группы (Smart, Ordinary, Simple и UI) хранятся в папке Components.
Поговорим немного о них:
UI компоненты
UI компоненты — это те компоненты, которые заменяют нативные (стандартные) компоненты по типу: button, input, textarea, select и т.п.
- Не могут использовать свое локальное хранилище и обращаться к глобальному
Simple компоненты
Simple компоненты — это те компоненты, которые являются простыми, иначе говоря компоненты, в которых нет какой-либо логики, которые просто что-то рендерят.
- Не могут использовать локальное хранилище и обращаться к глобальному
- Не могут использовать хуки, кроме тех, что изначально поставляются с React (за исключением useState)
- Могут использовать в своей реализации UI компоненты
Ordinary компоненты
Ordinary компоненты — это те компоненты, которые могут иметь какую-то логику, для отображения чего-либо
- Не могу использовать локальное хранилище, как и обращаться к глобальному
- Не могут использовать хуки, кроме тех, что изначально поставляются с React (за исключением useState)
- Могут использовать в своей реализации Simple и UI компоненты
Smart компоненты
Smart компоненты — это те компоненты, которые могут использовать относительно серьезную логику, для отображения чего-либо
- Могут использовать локальное хранилище, как и обращаться к глобальному, не изменяя его
- Могут использовать все доступные хуки, кроме тех, что взаимодействуют с сетью
- Могут использовать в своей реализации Ordinary, Simple и UI компоненты
Структура папки Componets:
Оставшиеся две группы (Containers и Pages) имеют отдельные папки в корне приложения (папка src).
- Containers — это те компоненты, которые формируют некие контейнеры, которые, в дальнейшем, используются для формирования страниц, которые, к тому же, содержать в своей реализации компоненты остальных четырех групп и при этом взаимодействовать, каким-либо образом, с сервисами или сетью, если говорить обобщенно.
- Pages — это те компоненты, которые формируются благодаря контейнерам и компонентам из папки Components, если в этом есть необходимость. Могут, как и контейнеры, взаимодействовать с сервисами.
Структура корневой папки:
Сами компоненты должны иметь отдельные папки, есть 2 (это число не является константой) файла:
- index.tsx — файл, в котором находится сам компонент
- styled.ts — файл, в котором находятся стилизованные компоненты (его спокойно можно заменить на styles.sсss, либо же styles.css, в зависимости от того, чем вы пользуетесь для стилизации своих компонентов)
Пример компонента Align. Хотелось бы сказать, что этот компонент попадает под группу «Simple», так как он является глупым (не имеет нужды в локальном хранилище) и не заменяет никакой нативный, браузерный, UI компонент.
Теперь, поговорим о самом сладком: )
Core
Данная папка является «ядром» вашего приложения. В ней хранится все, для взаимодействия с сервером, глобальное хранилище, тема вашего приложения и т.д.
Эта папка содержит:
- Config — в данной папке хранятся конфигурационные файлы приложения (например в ней можно хранить данные, необходимы для взаимодействия с бэкендом)
- Constants — в данной папке находятся все константы, что используются в приложении (например сообщения об ошибках и предупреждениях)
- Hooks — в данной папке хранятся все хуки кастомные хуки (хуки, что были сделаны вами).
- Models — в данной папке хранятся модели, что приходят с бэкенда.
- Schemes — в данной папке хранятся схемы форм, таблиц и т.д.
- Services — в данной папке хранятся сами сервисы, благодаря которым и происходит общение с бэкендом.
- Store — в данной папке хранятся схемы глобального хранилища (если Вы используете MobX), если же вы отдаете предпочтение Redux, то в данной папке могут хранится экшены, редьюсеры и т.д.
- Theme (для Styled-Components) — в данной папке хранятся темы приложения.
- Types — в данной папке хранятся вспомогательные типы, а также декларации модулей.
- Utils — в данной папке хранятся вспомогательные, простые, функции, которые могут использоваться в хуках, либо же компонентах.
- api.ts — в данном файле находится экземпляр HTTP клиента (например axios), который используют сервисы и который какой-то мутирует данные запросы (для передачи каких-либо заголовков, например).
Примеры содержимого папок:
Довольно-таки удобно хранить все роуты в одном файле. Если вдруг со стороны бэкенда изменятся роуты, то их легко можно будет изменить в одном файле, не проходясь, при этом, по всему проекту.
Ух ты! Как же много получилось.
И напоследок…
Есть еще несколько, немаловажных папок, которые также следует упомянуть:
- Assets — в данной папке хранятся все статичные файлы, такие как: иконки, изображения, шрифты и т.д. (их, конечно же, также стоит группировать и разделять на папки)
- Routes — в данной папке (либо же файле, кому как больше нравится) хранятся все роуты приложения (пример будет ниже)
- Styles — в данной папке хранятся все глобальные стили, которые применяются ко всем элементам и документу, в том числе
Остается еще 2 файла:
- app.tsx — компонент приложения
Примерно так он может выглядеть:
- index.tsx — входной файл вашего приложения
Он же может выглядеть примерно так:
И на этом, я думаю, стоит закончить.
Итоговая структура выглядит вот так:
Заключение
Если вам понравилась эта статья и вы узнали что-то интересное для себя, то я очень этому рад.
Ссылка на репозиторий (прошу прощения за такой скудный ридми, мне еще не по силам разговорный английский).
Всем удачи и огромное спасибо за внимание.