Derived Modular Arch
Начало

Структура проекта

Дерево src/, корни композиции и куда класть код на разных фреймворках.

DMA не привязан к одному фреймворку. Правила одни; меняется только имя папки корня композиции — места, где роуты и layout монтируют модули.

Базовое дерево

src/
├── app/         # корень композиции (Next.js App Router, Vite+React)
├── features/    # изолированные модули
├── services/    # появляется при promotion — не создавайте заранее
└── shared/
    ├── ui/
    ├── lib/
    ├── api/
    ├── model/
    └── domain/  # опционально

Корни композиции

Под src/ любая из папок — один и тот же слой по правилам DMA:

ПапкаТипичный фреймворк
app/Next.js App Router, Vite + React
pages/Astro, классический Next pages
routes/TanStack Router, SvelteKit

Все они:

  • монтируют модули через */public/*;
  • не импортируются модулями;
  • держат роуты тонкими — импорт из public/, минимум логики.
// src/app/checkout/page.tsx
import { CheckoutPage } from "@/features/checkout/public/checkout-page";

export default function Page() {
  return <CheckoutPage />;
}

Если в проекте несколько roots, предпочитайте app/. Инструменты при конфликте возьмёт app первым.

Куда что класть

У вас есть…Кладите в…
Роут, layout, провайдерыКорень композиции
Экран / пользовательский flowfeatures/<name>/public/ или стадия-0 файл
Состояние одной фичиВнутри feature, рядом с потребителем
Логика, нужная другим модулям (продукт)services/<name>/public/
Переносимая UI / хелперыshared/ui/, shared/lib/
Базовый HTTP-клиент, interceptorsshared/api/
Эндпоинты одной фичиВнутри feature (*.api.ts)
Склейка фич / событияКорень композиции — props, providers, ports
Unit-тестыРядом с файлом (*.test.ts)

Примеры по фреймворкам

В репозитории DMA — пять чистых примеров с одной продуктовой историей (catalog, checkout, cart):

ПримерКорень композицииСтек
vite-reactsrc/app/Vite + React
next-appsrc/app/Next.js
astro-pagessrc/pages/Astro
sveltekit-routessrc/routes/SvelteKit
vue-vitesrc/app/Vue 3 + Vite

Стартовать удобнее с vite-react — запускаемый, с тестами и полной лестницей стадий модулей.

Лестница стадий модуля

Stage 0   features/profile.tsx
Stage 1   features/checkout/public/ + внутренности
Promotion services/cart/public/     ← catalog + checkout импортируют
Lift      shared/lib/format-currency.ts  ← 2+ модуля, без продуктовой логики

Подробнее — Модули и public API и Эволюция кода.

Алиасы путей

CLI и ESLint-плагин резолвят @/src/ из tsconfig.json. Убедитесь, что paths настроены в корне приложения, не монорепо целиком.

Что дальше

On this page