refactor(architecture): декомпозировать раздел на 4 файла
All checks were successful
CI/CD Pipeline / docker (push) Successful in 39s
CI/CD Pipeline / deploy (push) Successful in 7s

- architecture.md разбит на architecture/index.md + reference/layers.md, modules.md, segments.md
- добавлена вложенность в сайдбар (Слои, Модули, Сегменты)
- обновлён fileOrder в concat-md.js для 4 файлов
- исправлены dead links на /basics/architecture (добавлен слеш)
- перегенерированы RULES.md и README
This commit is contained in:
2026-04-20 11:40:49 +03:00
parent 36304c14f0
commit f5732904f4
12 changed files with 740 additions and 721 deletions

View File

@@ -155,7 +155,7 @@
- `Next.js` — для продуктовых сайтов.
#### Архитектура
- `SLM Design` — собственная модульная архитектура проекта. Подробнее в разделе [Архитектура](/basics/architecture).
- `SLM Design` — собственная модульная архитектура проекта. Подробнее в разделе [Архитектура](/basics/architecture/).
#### UI компоненты
- `Mantine UI` — базовые UI-компоненты.
@@ -319,7 +319,7 @@ const usersMap = [];
const users = {} as Record<string, User>;
```
<!-- /basics/architecture -->
<!-- /basics/architecture/index -->
## SLM Design
Scoped Layered Module Design — модульная архитектура фронтенд-приложений. Код организован по слоям ответственности, а модуль содержит всё, что ему нужно: компоненты, хуки, сторы, типы, стили.
@@ -329,6 +329,10 @@ Scoped Layered Module Design — модульная архитектура фр
Бизнес-домен не разбивается по техническим слоям — сценарии, сущности, типы и UI живут в одном модуле. Это сокращает время навигации и упрощает сопровождение: все изменения домена локализованы.
#### Dependency Injection без фреймворков
Cross-domain зависимости в бизнес-слое реализуются через фабрики — модуль декларирует что ему нужно, а точка использования предоставляет зависимости. Домены изолированы без DI-контейнеров, провайдеров и шин событий.
#### Разделение ответственности без перегрузки слоёв
Сервисы приложения (`infrastructure/`), UI-кит (`ui/`) и общие ресурсы (`shared/`) — три разных слоя с разной природой. Ни один слой не превращается в свалку разнородного кода.
@@ -349,10 +353,6 @@ Scoped Layered Module Design — модульная архитектура фр
При росте проекта слои не теряют структуру — модули группируются по естественным признакам: бизнес-домены по субдоменам, страницы по разделам, UI-компоненты по уровню абстракции (примитивы и композиции).
#### Dependency Injection без фреймворков
Cross-domain зависимости в бизнес-слое реализуются через фабрики — модуль декларирует что ему нужно, а точка использования предоставляет зависимости. Домены изолированы без DI-контейнеров, провайдеров и шин событий.
### Происхождение
SLM Design вырос на основе:
@@ -415,15 +415,16 @@ src/
- **Зависимости однонаправлены.** Импорты только сверху вниз, только через публичный API.
- **Архитектура — каркас, не клетка.** Правила фиксируют направление зависимостей и структуру модуля, остальное определяет команда.
### Слои
<!-- /basics/architecture/reference/layers -->
## Слои
Раздел описывает слои SLM: что такое слой, какие бывают, как между ними направлены зависимости и какие правила действуют на каждом.
#### Определение
### Определение
**Слой — уровень организации кода внутри `src/`. Каждый слой отвечает за свою область (каркас страницы, бизнес-логика, UI-кит) и задаёт правила для кода внутри: направление импортов, именование, допустимые связи между модулями.**
#### Группы слоёв
### Группы слоёв
Слои делятся на три группы:
@@ -433,7 +434,7 @@ src/
| Ядро | `business`, `infrastructure`, `ui` | Реализация продукта: бизнес-домены, техсервисы, UI-кит |
| Фундамент | `shared` | Общие ресурсы: утилиты, хелперы, стили, конфиги |
#### Направление зависимостей
### Направление зависимостей
Любой импорт между модулями — только через публичный API.
@@ -448,13 +449,13 @@ app → [ layouts | screens ] → widgets → business → infrastructure → ui
- Импорт типов (`import type`) в «Ядре» разрешён в обоих направлениях
#### Слой App
### Слой App
Точка входа приложения. Отвечает за запуск, роутинг и композицию маршрутов из layout и screen.
В отличие от остальных слоёв, `app/` не содержит модулей SLM. Здесь живут только инфраструктурные файлы, которые не могут быть никаким другим слоем: файлы фреймворка роутинга, точка запуска и код инициализации.
##### Требования
#### Требования
- Не содержит модулей SLM — только файлы фреймворка, роутинг, инициализация
- Содержит: файлы маршрутов, bootstrap, обработку ошибок верхнего уровня (404, error boundary), подключение глобальных стилей и ассетов
@@ -462,7 +463,7 @@ app → [ layouts | screens ] → widgets → business → infrastructure → ui
- Не содержит бизнес-логику, UI-компоненты, хуки, сторы, сервисы
- Никем не импортируется
#### Слой Layouts
### Слой Layouts
Каркас страницы: общие элементы, одинаковые для группы маршрутов (header, footer, sidebar).
@@ -473,13 +474,13 @@ src/layouts/
└── auth/
```
##### Требования
#### Требования
- Содержит только модули
- Не содержит бизнес-логику
- Контекстно-зависимые блоки принимает через пропсы от `app`, не импортирует напрямую
#### Слой Screens
### Слой Screens
Контент конкретной страницы: собирает её из модулей нижних слоёв.
@@ -511,13 +512,13 @@ src/screens/
└── faq/
```
##### Требования
#### Требования
- Содержит только модули
- Не содержит бизнес-логику
- Локальные одноразовые секции живут внутри screen-модуля, не выносятся в `widgets`/`business`
#### Слой Widgets
### Слой Widgets
Составной блок интерфейса, который компонует модули ядра, но не принадлежит конкретному бизнес-домену. Widget появляется когда блок используется в нескольких screens или layouts.
@@ -532,12 +533,12 @@ src/widgets/
└── error-boundary/
```
##### Требования
#### Требования
- Не принадлежит конкретному бизнес-домену. Если блок доменный — он живёт в `business/`
- Используется в нескольких screens или layouts
#### Слой Business
### Слой Business
Бизнес-домены приложения: auth, catalog, orders, checkout, chat. Каждый домен — отдельный модуль со своими типами, логикой, UI и сервисами.
@@ -568,14 +569,14 @@ src/business/
└── notifications/
```
##### Требования
#### Требования
- Один модуль = один бизнес-домен
- Циклические зависимости между доменами запрещены
- Импорт кода между доменами — через фабрику. `import type` — напрямую
- Доменные типы (`User`, `Product`) живут здесь, не в `shared/`
#### Слой Infrastructure
### Слой Infrastructure
Техсервисы приложения: theme, i18n, API-адаптеры, logger, realtime. Каждый сервис — отдельный модуль.
@@ -594,12 +595,12 @@ src/infrastructure/
└── realtime/
```
##### Требования
#### Требования
- Один модуль = один техсервис
- Импортирует `infrastructure/`, `ui/`, `shared/`
#### Слой UI
### Слой UI
UI-кит без бизнес-логики: button, carousel, toast, modal.
@@ -637,12 +638,12 @@ src/ui/
└── tooltip/
```
##### Требования
#### Требования
- Не содержит бизнес-логику
- Импортирует только `ui/` и `shared/`
#### Слой Shared
### Слой Shared
Общие ресурсы: утилиты, хелперы, стили, конфиги. Не знает о бизнес-домене.
@@ -660,19 +661,20 @@ src/shared/
└── sprites/
```
##### Требования
#### Требования
- Не имеет runtime-состояния
### Модули
<!-- /basics/architecture/reference/modules -->
## Модули
Раздел описывает модули SLM: что такое модуль, из чего он состоит и как взаимодействует с остальным кодом.
#### Определение
### Определение
**Модуль — универсальный строительный блок архитектуры. Живёт на слое и содержит всё необходимое для своей работы: компоненты, хуки, сторы, сервисы, типы, стили. Набор содержимого не фиксирован — включаются только нужные части.**
#### Модуль vs компонент
### Модуль vs компонент
**Компонент** — один `.tsx` файл. Не имеет своих сегментов, использует сегменты родительского модуля. Живёт в корне или `ui/` сегменте модуля.
@@ -694,7 +696,7 @@ auth/
└── index.ts
```
#### Структура
### Структура
Модуль состоит из сегментов. Ни один сегмент не обязателен — модуль может состоять даже из одного `index.ts` с реэкспортом типов.
@@ -714,9 +716,9 @@ auth/
└── index.ts # публичный API
```
Подробное описание каждого сегмента — в разделе [Сегменты](/reference/segments).
Подробное описание каждого сегмента — в разделе [Сегменты](/basics/architecture/reference/segments).
#### Публичный API
### Публичный API
Модуль экспортирует наружу только то, что нужно другим. Всё остальное — внутреннее.
@@ -737,13 +739,13 @@ import { validateToken } from '@/business/auth/lib/tokens'
import { useAuth } from '@/business/auth'
```
#### Фабрика
### Фабрика
Если модуль зависит от кода другого бизнес-домена — он экспортирует фабрику. Фабрика декларирует необходимые зависимости и возвращает API модуля. Точка использования (screen, widget, layout) предоставляет зависимости при вызове.
Модуль без cross-domain зависимостей экспортирует API напрямую. Типы всегда экспортируются напрямую — `import type` не является runtime-зависимостью.
##### Модуль без зависимостей — прямой экспорт:
#### Модуль без зависимостей — прямой экспорт:
```ts
// business/auth/index.ts
@@ -752,7 +754,7 @@ export { useCurrentUser } from './hooks/use-current-user'
export type { User, Session } from './types'
```
##### Модуль с зависимостями — фабрика:
#### Модуль с зависимостями — фабрика:
```ts
// business/chat/types/deps.ts
@@ -789,7 +791,7 @@ export type { Message, ChatRoom } from './types'
export type { ChatDeps } from './types/deps'
```
##### Использование на странице:
#### Использование на странице:
```tsx
// screens/support/support.tsx
@@ -813,7 +815,7 @@ export function SupportScreen() {
}
```
#### Жизненный цикл
### Жизненный цикл
Модуль рождается на самом низком уровне использования и поднимается выше только при реальной потребности.
@@ -825,15 +827,16 @@ export function SupportScreen() {
Подъём — обычный рефакторинг в рамках задачи, а не отдельная активность.
### Сегменты
<!-- /basics/architecture/reference/segments -->
## Сегменты
Раздел описывает сегменты SLM: что такое сегмент, какие бывают и что в каждом из них лежит.
#### Определение
### Определение
**Сегмент — папка внутри модуля, которая группирует файлы по назначению. Набор сегментов не фиксирован — модуль включает только те, которые ему нужны. Команда сама определяет какие сегменты используются в проекте — архитектура даёт рекомендацию.**
#### Обзор
### Обзор
| Сегмент | Содержимое |
|---------|------------|
@@ -848,7 +851,7 @@ export function SupportScreen() {
| `lib/` | Утилиты и хелперы модуля |
| `config/` | Константы и конфигурация |
#### Сегмент ui/
### Сегмент ui/
Компоненты, принадлежащие модулю. Содержит только `.tsx` файлы — без своих сегментов, стилей, типов, хуков. Использует сегменты родительского модуля.
@@ -865,7 +868,7 @@ auth/
Если компоненту нужны собственные сегменты — это уже не `ui/`, а `parts/`.
#### Сегмент parts/
### Сегмент parts/
Вложенные модули со своими сегментами. Каждый элемент `parts/` — полноценный модуль: папка с компонентом, хуками, стилями, типами и т.д.
@@ -891,7 +894,7 @@ home/
Если вложенный модуль обрастает своими `parts/` — это сигнал, что он достаточно самостоятельный для подъёма на уровень выше.
#### Сегмент hooks/
### Сегмент hooks/
React-хуки модуля. Инкапсулируют логику, состояние, подписки, побочные эффекты.
@@ -902,7 +905,7 @@ hooks/
└── use-permissions.hook.ts
```
#### Сегмент stores/
### Сегмент stores/
Сторы состояния модуля. Конкретная реализация зависит от выбранного стейт-менеджера (Zustand, MobX, Redux и т.д.).
@@ -912,7 +915,7 @@ stores/
└── session.store.ts
```
#### Сегмент services/
### Сегмент services/
Работа с внешними источниками данных: API-вызовы, запросы, подписки.
@@ -922,7 +925,7 @@ services/
└── token.service.ts
```
#### Сегмент mappers/
### Сегмент mappers/
Функции трансформации данных из одного формата в другой: DTO в доменный тип, доменный тип в DTO, доменный тип в ViewModel.
@@ -933,7 +936,7 @@ mappers/
└── map-order-to-dto.ts
```
#### Сегмент types/
### Сегмент types/
TypeScript-типы и интерфейсы модуля. Доменные типы, DTO, пропсы компонентов.
@@ -943,7 +946,7 @@ types/
└── session.type.ts
```
#### Сегмент styles/
### Сегмент styles/
Стили модуля. Формат зависит от выбранного подхода (CSS Modules, SCSS, CSS-in-JS и т.д.).
@@ -953,7 +956,7 @@ styles/
└── login-form.module.css
```
#### Сегмент lib/
### Сегмент lib/
Утилиты и хелперы, специфичные для модуля. Чистые функции без побочных эффектов.
@@ -965,7 +968,7 @@ lib/
Отличие от `shared/lib/`: здесь лежат утилиты, нужные только этому модулю. Общие утилиты — в `shared/lib/`.
#### Сегмент config/
### Сегмент config/
Константы и конфигурация модуля: маршруты, лимиты, дефолтные значения.
@@ -1360,7 +1363,7 @@ src/
└── shared/ # Общие ресурсы (утилиты, типы, стили)
```
Принципы организации слоёв описаны в разделе [Архитектура](../basics/architecture).
Принципы организации слоёв описаны в разделе [Архитектура](../basics/architecture/).
#### Папка `app/`
@@ -1413,7 +1416,7 @@ src/app/
Правила написания React-компонентов: файловая структура модуля, типизация пропсов, документирование и реализация. Раздел охватывает компоненты всех слоёв — от `shared/ui` до `screens`.
Архитектурные слои и их назначение описаны в разделе [Архитектура](/basics/architecture).
Архитектурные слои и их назначение описаны в разделе [Архитектура](/basics/architecture/).
### Правила организации