mirror of
https://github.com/gromlab-ru/slm-design.git
synced 2026-08-22 07:30:16 +03:00
60 lines
3.4 KiB
Markdown
60 lines
3.4 KiB
Markdown
# Зависимости Level 1
|
||
|
||
> Пояснение нормативной модели зависимостей Level 1.
|
||
|
||
Матрица слоёв задаёт допустимые связи, а модули образуют граф зависимостей.
|
||
|
||
## Что считается зависимостью
|
||
|
||
- Обычный импорт, импорт типа и реэкспорт одинаково создают архитектурную зависимость.
|
||
- Импорт между файлами одного модуля не пересекает модульную границу и не создаёт отдельный узел графа.
|
||
- Импорт любого внутреннего файла, сегмента или компонента считается зависимостью ближайшего модуля-владельца.
|
||
- Вложенный модуль является обычным самостоятельным узлом графа.
|
||
- Группы, сегменты и компоненты не являются самостоятельными узлами графа.
|
||
|
||
Точка входа фреймворка не является модулем. Её импорты участвуют в проверке направления слоёв, но не образуют исходящий узел графа модулей.
|
||
|
||
Ресурс `shared` также не является модулем. Его прямой импорт участвует в проверке направления слоёв, но не нарушает требование о публичном API модуля.
|
||
|
||
## Допустимые связи
|
||
|
||
- Модуль может импортировать модули своего слоя и слоёв, разрешённых нормативной матрицей.
|
||
- Модули одного слоя могут импортировать друг друга.
|
||
- Промежуточный слой не является обязательным посредником.
|
||
- `infra` и `ui` не импортируют друг друга; их связывает владелец из `domains`, `compositions` или `app`.
|
||
|
||
Доменный модуль Level 1 может импортировать публичный API другого доменного модуля. Runtime- и type-only импорты одинаково создают ребро графа, поэтому общий граф обязан оставаться ацикличным.
|
||
|
||
```ts
|
||
// domains/orders
|
||
import type { Product } from '@/domains/catalog'
|
||
```
|
||
|
||
Level 1 не требует отдельного механизма междоменной инъекции. Более строгая модель cross-domain зависимостей задаётся Level 2.
|
||
|
||
Матрица слоёв определена в [Слоях](./layers.md).
|
||
|
||
## Связанные правила
|
||
|
||
- [`SLM-L1-LAYER-A002`](../rules/level-1.md#slm-l1-layer-a002)
|
||
- [`SLM-L1-MODULE-A004`](../rules/level-1.md#slm-l1-module-a004)
|
||
- [`SLM-L1-DEPENDENCY-A005`](../rules/level-1.md#slm-l1-dependency-a005)
|
||
- [`SLM-L1-NESTED_MODULE-A010`](../rules/level-1.md#slm-l1-nested_module-a010)
|
||
|
||
## Публичный API
|
||
|
||
```ts
|
||
// Допустимо
|
||
import { Button } from '@/ui/button'
|
||
|
||
// Недопустимо
|
||
import { Button } from '@/ui/button/button'
|
||
```
|
||
|
||
## Циклы
|
||
|
||
```text
|
||
ui/modal → ui/button → ui/icon
|
||
ui/icon -/→ ui/modal
|
||
```
|