WARNING
Эта статья сгенерирована AI и требует ручной доработки.
Паттерны FEOD
В этой статье собраны практические паттерны, которые опираются на правила FEOD и помогают держать модули изолированными, а структуру — предсказуемой.
1. Публичный API модуля
Идея: любой доступ к модулю идёт через index.ts. Это защищает внутренности и упрощает рефакторинг.
modules/
Billing/
index.ts
api/
composables/
types/// modules/Billing/index.ts
export { createInvoice } from './api/createInvoice'
export { useBilling } from './composables/useBilling'
export type { Invoice } from './types'2. Фрактальный разрез
Идея: когда модуль становится слишком большим, выделяйте подмодуль без смены правил.
modules/
Billing/
modules/
Invoices/
Payments/Подмодуль сам изолирован и экспортирует свой API через index.ts.
3. Композиция на уровне Pages
Идея: страницы не содержат бизнес-логики, они собирают модули в сценарий.
pages/
dashboard/
index.ts// pages/dashboard/index.ts
import { userSummary } from '@/modules/UserSummary'
import { billingOverview } from '@/modules/Billing'
export const dashboardData = {
userSummary,
billingOverview
}4. Интеграции живут в App
Идея: внешние сервисы подключаются в app, а модули остаются независимыми.
app/
integrations/
analytics.ts
modules/
Analytics/
index.ts// app/integrations/analytics.ts
import { analyticsClient } from './clients/analyticsClient'
import { Analytics } from '@/modules/Analytics'
Analytics.configure(analyticsClient)5. Вынос в Common только при универсальности
Идея: в common попадают только универсальные, одиночные сущности. Если требуется несколько файлов или появляется бизнес-смысл, это уже modules.
common/
utilities/
formatDate.ts
modules/
Orders/
utilities/
calculateTotals.ts6. Приватный модуль страницы
Идея: если странице нужна локальная логика, используйте приватный модуль с префиксом _.
pages/
orders/
index.ts
_orders/
index.ts
components/Приватный модуль не используется вне своей страницы.
7. Зигзагообразные импорты запрещены
Идея: подмодуль не должен импортировать внешний уровень своего модуля или соседний подмодуль другого модуля.
modules/
A/
modules/
A1/
B/
modules/
B1/A1 не импортирует B1 напрямую — только публичный API B.