Начало
Структура проекта
Дерево 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, провайдеры | Корень композиции |
| Экран / пользовательский flow | features/<name>/public/ или стадия-0 файл |
| Состояние одной фичи | Внутри feature, рядом с потребителем |
| Логика, нужная другим модулям (продукт) | services/<name>/public/ |
| Переносимая UI / хелперы | shared/ui/, shared/lib/ |
| Базовый HTTP-клиент, interceptors | shared/api/ |
| Эндпоинты одной фичи | Внутри feature (*.api.ts) |
| Склейка фич / события | Корень композиции — props, providers, ports |
| Unit-тесты | Рядом с файлом (*.test.ts) |
Примеры по фреймворкам
В репозитории DMA — пять чистых примеров с одной продуктовой историей (catalog, checkout, cart):
| Пример | Корень композиции | Стек |
|---|---|---|
| vite-react | src/app/ | Vite + React |
| next-app | src/app/ | Next.js |
| astro-pages | src/pages/ | Astro |
| sveltekit-routes | src/routes/ | SvelteKit |
| vue-vite | src/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 настроены в корне приложения, не монорепо целиком.