Beta Документация для beta‑теста, возможны ошибки и неточности.
Перейти к содержимому

WARNING

Эта статья сгенерирована AI и требует ручной доработки.

Лучшие практики

В этом материале собраны практики, которые помогают держать структуру FEOD чистой, предсказуемой и масштабируемой.

1. Уровни и направление импорта

Базовое правило FEOD: верхние уровни знают о нижних, но не наоборот.

Допустимое направление импорта: app -> pages -> modules -> commonglobal доступен без импорта.

Примеры:

ts
// OK: app импортирует страницы
import { HomePage } from '@/pages/home'

// OK: pages импортируют модули
import { userProfile } from '@/modules/UserProfile'

// OK: модули импортируют common
import { formatDate } from '@/common/utilities/formatDate'

2. Публичный API модулей

Модуль должен быть изолирован. Единственная точка входа — index.ts.

ts
// modules/UserProfile/index.ts
export { useUserProfile } from './composables/useUserProfile'
export type { UserProfile } from './types'

Запрещены импорты внутренних файлов модуля извне:

ts
// Плохо: глубокий импорт
import { useUserProfile } from '@/modules/UserProfile/composables/useUserProfile'

3. Common должен оставаться тонким

Сущности в common:

  • не привязаны к бизнес-фичам;
  • обычно умещаются в один файл;
  • не используют index.ts.

Если сущность разрастается — это сигнал вынести её в modules.

4. Фрактальность вместо новых уровней

Если модуль растёт, не создавайте новые горизонтальные срезы — делите его на подмодули:

modules/
  Billing/
    modules/
      Invoices/
      Payments/

Подмодули следуют тем же правилам, что и верхний уровень.

5. Pages остаются тонкими

Страница — это точка входа в сценарий, а не место для бизнес-логики. Логика живёт в модулях, а страницы их композиционируют.

6. App содержит только запуск и интеграции

В app находятся:

  • точка входа;
  • маршрутизация;
  • интеграции внешних сервисов;
  • глобальные лейауты.

Никакой бизнес-логики, которая должна жить в модулях.

7. Global используйте только при необходимости

global предназначен для сущностей, доступных без импорта:

  • глобальные типы;
  • полифиллы;
  • shim-ы библиотек.

Если сущность требует импорта — это не global.

8. Имена должны говорить о роли

Называйте модули по доменной ответственности, а не по техническим деталям.

modules/
  UserProfile/
  OrderHistory/
  AccessControl/

Избегайте слишком общих имён (User, Data, Utils) и сокращений.