Исходники примеров к докладу на митапе Health Samurai
📅 Дата выступления: 23 октября 2025
🔗 Лендинг: health-samurai.ru/clean-arch
🍿 Запись доклада: в процессе подготовки
📚 Презентация: См. файлnode-without-nest.pdfв веткеchapter_2_good
Этот репозиторий демонстрирует практическую реализацию Clean Architecture на Node.js без использования фреймворков типа Nest.js. На примере простого сервиса оформления заказов показано, как структурировать код для достижения максимальной тестируемости, поддерживаемости и независимости от внешних фреймворков.
- ✅ Clean Architecture — полная имплементация на примере сервиса заказов
- 🎯 Use Cases — бизнес-логика, изолированная от деталей реализации
- 🗄️ Repository Pattern — абстракция над источниками данных
- 💉 IoC/DI — инверсия зависимостей с помощью Inversify
- 🎨 Абстракции над Express — Controllers, Exception Filters, Middleware
- 🚨 Доменные ошибки — типизированная обработка ошибок
- 📦 DTO — валидация и трансформация данных
Проект разделён на две ветки для наглядного сравнения подходов:
Типичное Express-приложение из туториалов:
- ❌ Минимальное разделение ответственности
- ❌ Дублирование логики в разных частях
- ❌ Сложность покрытия тестами
- ❌ Тесная связанность компонентов
То же приложение с применением Clean Architecture:
- ✅ Чёткое разделение по слоям
- ✅ Независимость бизнес-логики от фреймворка
- ✅ Высокая тестируемость
- ✅ Гибкость к изменениям
Примечание: Для упрощения примера сделаны некоторые допущения: Express не вынесен за абстракцию, вместо реальной БД используется in-memory хранилище, доменные ошибки собраны в общей директории.
npm installnpm run start:dev
npm run build
npm start
| Команда | Описание |
|---|---|
npm run build |
Полная сборка приложения (clean + compile) |
npm start |
Запуск скомпилированной версии |
npm run start:dev |
Запуск в режиме разработки через ts-node |
npm run lint |
Проверка кода с помощью ESLint |
npm run clean |
Удаление директории dist |
npm run compile |
Компиляция TypeScript в JavaScript |
npm run ts |
Выполнение произвольного TS-скрипта через ts-node |
src/
├── core / # Абстракции, код для работы с фреймворком
├── modules / # Модули приложения
├──── domain/ # Бизнес-логика и сущности
├──── application/ # Use Cases и интерфейсы
├──── infrastructure/ # Реализация репозиториев, БД
└──── presentation/ # Controllers, HTTP-слой
Есть вопросы или предложения? Буду рад обсудить!
- 💬 Telegram: @antonov_i
- 📧 Email: [email protected]
- 📱 Telegram-канал: Про JavaScript и разработку
- 🎥 YouTube: @antonov_i
MIT © [Игорь Антонов](mailto: [email protected]) 2025