Skip to content

Latest commit

 

History

History
40 lines (25 loc) · 5.94 KB

architecture.md

File metadata and controls

40 lines (25 loc) · 5.94 KB

Краткое описание архитектуры

Основные строительные блоки приложения - это модули, фичи и сервисы.

Сервис

Это функциональность часто используемая модулями и фичами, ничего не знает об остальном приложении. Может содержать:

  • класс, инкапсулирующий какую-либо специфичную для конкретного сервиса логику. Инстанс такого класса нужно привязать к DI-контейнеру.
  • редакс-логику (своя ветка в стейте, набор экшен-креэйторов, редьюсеры и, возможно, сага)
  • react-контейнеры
  • React Higher-Order Components (HOC), могут инкапсулировать работу с классом сервиса, прокидывать определенные пропсы в оборачиваемые контейнеры или контролировать отрисовку оборачиваемого контейнера в зависимости от состояния сервиса.

Примеры: сервис i18n содержит: редакс-логику для получения и хранения переводов, изменения текущего языка; класс, который будет отслеживать изменение языка, обновлять функцию перевода и оповещать подписчиков; HOC, который прокидывает в оборачиваемый компонент функцию перевода, и при изменении языка, вызывает forceUpdate, тем самым запуская перерисовку и прокидывая обновленную функцию перевода.

Фича

Главный архитектурный блок, в основном весь проект являет из себя набор фич. Фича - это узконаправленная функциональность, которая может быть реализована с помощью связки React+Redux, имеет свою ветку в redux-сторе. На выход фича отдает react-контейнеры с минимально возможным интерфейсом и набор функций для подключения фичи к redux-стору.

Ничего не знает о раутах, может использовать сервисы и shared-компоненты. Не может обращаться на прямую к другой фиче. Это уменьшает зацепление фич и позволяет выносить фичи в отдельные бандлы, которые будут подгружаться только тогда, когда эта фича реально нужна.

При необходимости использования react-контейнера из другой фичи, может запросить контейнер определенной сигнатуры в пропсах и получить его от клиента или с помощью HOC'а ContainersProvider (ContainersProvider асинхронно подгружает бандл нужной фичи, подключает ее к redux-стору и прокидывает нужные контейнеры в оборачиваемый контейнер).

Вам нужно выделить отдельную фичу, если:

  • эта функциональность используется в нескольких местах (модулях);
  • функционал можно однозначно классифицировать (например, авторизация, загрузка новостей);
  • не имеется раутов и не нужно плотное с ними взаимодействие в процессе работы.

Примеры: фича поиск продуктов содержит: редакс-логику по загрузке, хранению, фильтрации и пагинации списка продуктов; контейнер поисковая строка, контейнер с управлением пагинацией. Клиент может получить результаты поиска, например, с помощью коллбека onLoad контейнера поисковой строки.

Описание принципов работы с фичами

Модуль

Модуль связывет фичи, расширяет их функциональность и распределяет по раутам. Может содержать редакс-логику и react-контейнеры. Обязан предоставить корневой раут, внутри которого возможно будет реализовано дерево раутов модуля, и который будет отрисован в пустом div-контейнере.

Вам нужно выделить модуль, если:

  • будет раутинг, на каждом адресе которого независимый и разнородный функционал, который можно выделить в самостоятельную часть программы;
  • Функционал действительно разнороден и обширнее, чем просто загрузка пользователя и показ его данных;

Примеры: модуль Профиль - содержит фичи: редактирование личной информации, просмотр личной информции, настройки уведомлений, просмотр сообщений.