Миграция на DMA
Как внедрить DMA в существующий проект без big bang переписывания.
Миграция на DMA — не «переписать всё за спринт». Это последовательное уплотнение: сначала границы и проверки, потом promotion и shared — по сигналам графа.
Фаза 0: Зафиксировать цель
Вы хотите:
- перестать спорить об импортах на ревью;
- ловить циклы и feature-to-feature в CI;
- расти через размещение рядом, а не через преждевременный
shared/.
Если достаточно style guide на Confluence — DMA может быть избыточен.
Фаза 1: Дерево и инструменты (день 1)
- Приведите
src/к базовой форме:
src/
├── app/ # или pages/, routes/
├── features/
└── shared/ # можно почти пустой- Установите CLI:
npm install -D @derived-modular/cli- Добавьте в CI:
npx @derived-modular/cli check . --format jsonПервый прогон 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Варианты исправления:
- Promotion — общий продуктовый код в
services/ - Lift в shared — переносимый хелпер без продуктовой логики
- Связка в 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 внутри модулей
- Линтер в редакторе для быстрой обратной связи
- Команда знает про Эволюция кода и Куда положить файл