Derived Modular Arch
Гайды

Astro

DMA с корнем композиции в pages/ и frontmatter-импортами.

Пример для Astro 5: слои под src/, корень композиции в src/pages/, layout и providers в src/app/.

Исходники: examples/astro-pages.

Два корня: pages и app

ПапкаРоль
src/pages/Роуты — тонкие, только монтирование
src/app/Layout, providers, начальные данные — не роуты

В pages/ — только routable файлы (index.astro). layout.astro и shop-providers.astro живут в app/, чтобы Astro не создавал лишние маршруты.

Тонкий route

---
import CatalogPage from "@/features/catalog/public/catalog-page.astro";
import ShopProviders from "@/app/shop-providers.astro";
import Layout from "@/app/layout.astro";
---

<Layout title="DMA · Astro mini-shop">
  <ShopProviders>
    <CatalogPage />
  </ShopProviders>
</Layout>

Импорты только вниз: features/*/public/*, services/*/public/*, shared/*.

Frontmatter = module script

Блок --- выполняется на build time:

  1. Импортируйте */public/* и стадия-0 модули
  2. Вызывайте service helpers до template
  3. Передавайте данные в child через props

dma check и Biome plugin парсят импорты из .astro frontmatter так же, как из .ts.

Provider pattern

shop-providers.astro биндит порт до рендера features:

---
import { provideCartSeed } from "@/services/cart/public/ports";
import { demoCartSeed } from "@/app/cart-seed";

provideCartSeed(demoCartSeed);
---
<slot />

Порты невидимы для статического графа — используйте для начальных данных / разрыва цикла, не для обхода promotion. Подробнее — Склейка модулей.

State patterns

  1. Размещённый рядом storecatalog.store.ts, импорт relative из public/
  2. Promoted serviceservices/cart/public/cart.ts (catalog + checkout)
  3. Provider portports.ts + привязка в app/

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

ЗадачаПапка
Route shellsrc/pages/*.astro
Layout, providerssrc/app/
Feature screenfeatures/<name>/public/<entry>.astro
Stage-0 modulefeatures/<name>.astro
2+ consumersservices/<name>/public/
Portable UI/libshared/ui/, shared/lib/

Стили

ВидГде
Scoped <style>В том же .astro файле
Feature CSSразмещённый рядом *.css → import из public/
CSS Modulespublic/*.module.css
Globalstyles/global.css → import из app/layout.astro

Global CSS — только из корня композиции.

Инструменты

bun run build       # astro build
bun run dma-check   # dma check .
bun run lint        # biome + @derived-modular/biome-plugin
bun run test

Biome plugin — приблизительный (GritQL). Нет полного разрешения путей и циклов графа. Всегда dma check в CI.

Что дальше

On this page