🧱 Фундаментальные принципы организации
Прежде чем перейти к папкам, важно понять ключевые идеи, лежащие в основе любой хорошей структуры:
-
Разделение ответственности (Separation of Concerns): Код разбивается на слои с четкими задачами. Например, слой представления (
UI) не должен знать, как работает слой доступа к данным (DB). Это делает систему гибкой и тестируемой. -
Feature-First (Предметно-ориентированная) vs. Type-First (Тип-ориентированная) структура: Вместо группировки файлов по их технической роли (
components/,hooks/,utils/), feature-first подход группирует все файлы, относящиеся к одной бизнес-функции (например,profile/,checkout/), в одном месте. Это значительно упрощает навигацию и поддержку в больших проектах. -
Масштабируемость (Scalability): Структура должна легко позволять добавлять новые функции, не ломая старые, и быть понятной для новых членов команды.
📁 Структура для разных частей стека
1. Backend: Express.js, Hono, Fastify
Для серверной части (API) хорошо зарекомендовала себя многослойная архитектура. Вот как она выглядит на практике.
Общая идея (Layered Architecture):
src/ ├── config/ # Конфигурации (env, БД, логирование) ├── modules/ # Фичи/модули (feature-first подход) │ └── users/ # Пример модуля "Пользователи" │ ├── controllers/ # Обработка HTTP запросов │ ├── services/ # Бизнес-логика │ ├── repositories/ # Работа с БД │ ├── schemas/ # Валидация (Zod, TypeBox) │ ├── types/ # TypeScript типы для модуля │ └── index.ts # Точка входа модуля ├── shared/ # Общие утилиты, middleware, ошибки │ ├── middleware/ │ ├── errors/ │ └── utils/ ├── app.ts # Инициализация приложения (роуты, middleware) └── server.ts # Запуск сервера
-
Express.js: Классический пример —
server/сsrc/, где лежатresolvers/,models/,prisma/. В более продвинутых шаблонах используютcontrollers/,services/,routes/. -
Hono: Так как Hono не навязывает структуру, в сообществе предлагают гибкие подходы. Можно использовать feature-first структуру с папкой
features/, где каждый модуль содержит своиapi/(эндпоинты),services/(бизнес-логику),repositories/(доступ к данным) иvalidation/. Общие части выносятся вcore/иshared/. -
Fastify: Рекомендуется структура с
routes/(группировка по ресурсам),plugins/(для регистрации функциональности),services/иrepositories/.
2. Frontend: React / Next.js
Здесь ключевой выбор — между App Router (рекомендуемый) и Pages Router.
Структура для Next.js (App Router):
my-nextjs-app/ ├── app/ # Маршруты и страницы (App Router) │ ├── (auth)/ # Группа маршрутов для аутентификации │ ├── (dashboard)/ # Группа для защищенных страниц │ ├── api/ # API Routes (serverless функции) │ ├── layout.tsx # Корневой layout │ └── page.tsx # Домашняя страница ├── src/ # Исходный код приложения (опционально) │ ├── components/ # Переиспользуемые UI компоненты │ │ ├── ui/ # Базовые (Button, Input) │ │ └── layout/ # Структурные (Header, Sidebar) │ ├── features/ # Фичи (самодостаточные модули) │ │ └── profile/ # Пример фичи "Профиль" │ │ ├── components/ │ │ ├── hooks/ │ │ ├── services/ # API вызовы для фичи │ │ └── types/ │ ├── lib/ # Утилиты, конфигурация клиентов (API, React Query) │ ├── hooks/ # Кастомные React хуки (глобальные) │ ├── types/ # Общие TypeScript типы │ └── context/ # React Context провайдеры ├── public/ # Статические файлы └── package.json
Ключевые моменты:
-
Используйте
app/для новых проектов. -
Для изоляции кода применяйте Route Groups
(groupName). -
Код, относящийся к одной функции, группируйте в
features/. -
Общие компоненты храните в
components/. -
Серверную логику (работа с БД, сервисы) выносите в папку
server/илиlib/server/.
🏗️ Архитектура на уровне решения (Monorepo)
Если вы разрабатываете фронтенд и бэкенд в одном репозитории, используйте монорепозиторий (monorepo). Это стандарт для полного цикла разработки.
Пример структуры монорепозитория:
my-monorepo/ ├── packages/ или apps/ │ ├── frontend/ # Next.js приложение │ │ ├── app/ │ │ ├── components/ │ │ └── package.json │ └── backend/ # Express / Hono / Fastify приложение │ ├── src/ │ │ ├── modules/ │ │ ├── shared/ │ │ └── server.ts │ └── package.json ├── docker-compose.yml ├── package.json # Корневой package.json с workspaces └── turbo.json или pnpm-workspace.yaml
Инструменты для управления: pnpm workspaces, npm workspaces, или Turborepo для более сложных сценариев.
Комментарии (0)
Чтобы оставить комментарий, пожалуйста, войдите в систему или зарегистрируйтесь.