BMAP — Base Multi Application Platform
Архитектура приложения целиком: репозиторий, в котором живут фронты (BMFP) и бэки (BMBP), и способ их сборки в один продукт. BMAP описывает только корни репозитория и границы между ними; внутреннее устройство — в BMFP, BMBP, BMGP.
4 минутыАрхитектура приложения целиком: репозиторий, в котором живут фронты (BMFP) и бэки (BMBP), и способ их сборки в один продукт. BMAP описывает только корни репозитория и границы между ними; внутреннее устройство — в BMFP, BMBP, BMGP.
Структура репозитория
<product>/
├── frontend/
│ ├── apps/<app>/ # продуктовые фронты (BMFP)
│ ├── microfrontends/<mfe>/ # микрофронтенды (BMFP), монтируются в shell
│ └── modules/<module>/ # source-first frontend-модули (BMFP/REUSE, опц.)
├── backend/
│ ├── services/<service>/ # бэки (BMBP)
│ └── gateways/<frontend>_gateway/ # шлюзы (BMGP, опц.), по одному на фронт
├── documentation/ # дока продукта
├── tools/ # автоматизация репозитория
└── tests/ # репо-уровневые / E2E (юнит-тесты — рядом со своим пакетом)| Корень | Что внутри |
|---|---|
frontend/apps/, frontend/microfrontends/ | фронты по BMFP |
frontend/modules/ | переиспользуемые source-first frontend-модули по BMFP и REUSE |
backend/services/ | бэки по BMBP; или нативная оболочка, если API не нужен |
backend/gateways/ | шлюзы по BMGP |
documentation/, tools/, tests/ | дока, автоматизация репо, репо-уровневые тесты |
Каждый фронт/бэк/шлюз — самостоятельный пакет со своей обвязкой (контейнер, зависимости, секреты). BMAP отвечает только за корни и границы; имена файлов внутри пакета — по правилам его архитектуры.
Новый фронт → пакет в frontend/apps/ (и при необходимости свой шлюз в backend/gateways/).
Новый бэк → пакет в backend/services/.
frontend/modules/ — локальные checkout переиспользуемых frontend-единиц. Логически такой модуль
остаётся независимым соседним репозиторием, а не собственностью продукта; продукт лишь закрепляет
его версию. Встроенный модуль собирается вместе с приложением. Независимо поставляемый UI с
собственной точкой монтирования относится к frontend/microfrontends/.
Связь фронта и бэка
Фронт и бэк связаны только контрактом — формой данных, не общим кодом. Контракт — конверт:
- успех:
{ status, data, details? } - ошибка:
{ status, error_code, details }
Поменять реализацию любой стороны можно, не трогая другую, пока конверт не меняется.
Слои фронта и бэка зеркальны по ролям:
| BMFP | BMBP | роль |
|---|---|---|
boundary | api | граница с внешним миром |
domain | core | бизнес-логика |
infrastructure | infrastructure | внешний мир (клиенты, хранилища) |
shared | shared | межслойный код |
Клиент в infrastructure фронта смотрит ровно в api бэка. Если есть шлюз — смотрит в шлюз,
шлюз проксирует в бэки.
Поток запроса:
действие пользователя в boundary
→ domain.service (BMFP)
→ infrastructure.client ──конверт──▶ api (BMBP)
→ core.solution/service
→ infrastructure.repository → БД
◀── конверт ───
◀── DTO в store ── валидация ──┘
boundary перерисовываетсяВарианты поставки
- Десктоп. Фронт (BMFP) в WebView + бэк как нативная оболочка (окно, IPC-вызовы, доступ к ОС). Отдельного API нет; «серверные» заботы свёрнуты в оболочку, BMBP остаётся ментальной картой.
- Контейнерный стек. БД → бэк (BMBP) → веб со статикой фронта, прокси отдаёт
/apiна бэк. - Несколько бэков + шлюзы. Несколько BMBP-бэков, шина событий, шлюзы (по одному на каждый фронт, агрегируют ручки из нужных бэков), несколько BMFP-фронтов и MFE.
Граница (конверт) одинакова во всех вариантах.
Нативная оболочка вместо BMBP
Когда отдельного API нет, бэкенд — это нативная оболочка. Понятия BMBP проецируются так:
| BMBP | В оболочке |
|---|---|
| api | IPC-вызовы + события (тонкие хендлеры) |
| core | чистая логика на языке оболочки или domain фронта |
| infrastructure | доступ к ОС/ФС за обёртками; на фронте — обёртки IPC |
Когда появляется настоящий BMBP-бэк — он добавляется отдельным пакетом в backend/services/.
Заведение нового продукта
- Создать корни:
frontend/,backend/,documentation/,tools/,tests/. - Согласовать контракт: конверт
{ status, data, details? }и DTO ключевых сущностей. - Поднять бэк по BMBP (или нативную оболочку, если API не нужен).
- Поднять фронт по BMFP, клиент
infrastructureнацелить на бэк (или шлюз). - Выбрать упаковку (десктоп / контейнерный стек / несколько бэков + шлюзы), описать в
documentation/.
Порядок: сначала контракт, потом независимое наполнение частей, потом сборка в поставку.
Откройте исходник документа по ссылке «Предложить правку» — там же видно, что и когда в нём менялось.