Derived Modular Arch
Гайды

Миграция на DMA

Как внедрить DMA в существующий проект без big bang переписывания.

Миграция на DMA — не «переписать всё за спринт». Это последовательное уплотнение: сначала границы и проверки, потом promotion и shared — по сигналам графа.

Фаза 0: Зафиксировать цель

Вы хотите:

  • перестать спорить об импортах на ревью;
  • ловить циклы и feature-to-feature в CI;
  • расти через размещение рядом, а не через преждевременный shared/.

Если достаточно style guide на Confluence — DMA может быть избыточен.

Фаза 1: Дерево и инструменты (день 1)

  1. Приведите src/ к базовой форме:
src/
├── app/          # или pages/, routes/
├── features/
└── shared/       # можно почти пустой
  1. Установите CLI:
npm install -D @derived-modular/cli
  1. Добавьте в CI:
npx @derived-modular/cli check . --format json
  1. Подключите линтер (ESLint или Biome).

Первый прогон dma check покажет реальную картину — не пугайтесь длинного списка.

Фаза 2: Корень композиции (неделя 1)

Цель: роуты и layout импортируют только */public/*.

БылоСтало
import { X } from '@/features/foo/internal'import { X } from '@/features/foo/public/foo-page'
Логика в page.tsxТонкая оболочка + монтирование из feature

Не трогайте внутренности модулей, пока не почините точки входа.

Фаза 3: Убрать feature → feature (недели 2–3)

Типичный паттерн до DMA:

features/catalog → features/checkout/internal

Варианты исправления:

  1. Promotion — общий продуктовый код в services/
  2. Lift в shared — переносимый хелпер без продуктовой логики
  3. Связка в app — props, events, providers (склейка модулей)

После каждого рефакторинга — npx @derived-modular/cli check ..

Фаза 4: Public API и barrels (неделя 3–4)

  • Удалите barrel index.ts с реэкспортами внутри модулей
  • Вынесите публичные символы в public/ с прямыми путями
  • Stage-0 файлы (features/profile.tsx) оставьте, если модуль один файл

Фаза 5: Promotion и shared (по сигналам)

Не создавайте services/ заранее. Ждите:

  • feature-has-inbound в check — пора промоутить
  • shared-candidate в doctor — пора подумать о перенос

Запускайте npx @derived-modular/cli doctor . раз в спринт на планировании.

Стратегии для больших кодовых баз

Strangler по фичам

Выберите одну вертикаль (например checkout), разложите по DMA, остальное временно исключите из dma check через отдельный пакет/папку — не через отключение правил глобально.

Monorepo

dma check — один граф на корень; с корня монорепо доступен multi-root discover:

npx @derived-modular/cli check .
npx @derived-modular/cli check apps/web
npx @derived-modular/cli check --roots apps/web,apps/admin

Подробнее — Монорепо.

Legacy utils/ и components/

Не переименовывайте всё сразу. Новый код — по DMA. Старый — трогайте при втором использовании или при касании файла.

Чеклист готовности

  • dma check в CI на каждый PR
  • Корень композиции импортирует только public/
  • Нет feature → feature
  • Нет barrel внутри модулей
  • Линтер в редакторе для быстрой обратной связи
  • Команда знает про Эволюция кода и Куда положить файл

Что дальше

On this page