Введение в проблему
При создании нового проекта, разработчики часто сталкиваются с одной и той же проблемой: настройка окружения и инфраструктуры занимает слишком много времени. После 8 лет опыта в построении API, стало rõ, что решение одних и тех же проблем происходит на каждом новом проекте. Это включает в себя настройку строгого режима TypeScript, реализацию JWT-авторизации с вращением токенов, создание структуры папок, которая масштабируется, и настройку Docker и CI/CD.
Решение проблемы
Чтобы избежать повторения одних и тех же действий на каждом новом проекте, было решено создать готовый шаблон, который включает в себя все необходимые компоненты для быстрого старта разработки. Этот шаблон включает в себя набор технологий, которые были тщательно отобраны для обеспечения максимальной эффективности и производительности.
Технологический стек
Шаблон включает в себя следующий технологический стек:
- Fastify в качестве веб-фреймворка, который предлагает лучшую производительность и поддержку TypeScript по умолчанию, чем Express.
- Prisma в качестве ORM, который обеспечивает отличный опыт разработки и автоматически генерирует типы, экономя время на ручном вводе.
- Zod для валидации, который обеспечивает schema-first валидацию, интегрирующуюся чисто с TypeScript, исключая runtime-сюрпризы.
- Vitest в качестве тестового фреймворка, который быстрее Jest, имеет одинаковый API и требует нулевой конфигурации с TypeScript.
Структура папок
Одной из ключевых особенностей шаблона является хорошо структурированная папка src/, которая включает в себя:
config/для хранения настроек и констант.modules/дляfeature-модулей, включающих маршруты, контроллеры, сервисы и схемы валидации.middlewares/для обработчиков ошибок, охранников и лимитеров скорости.plugins/для плагинов Fastify, включая Prisma и JWT.utils/для общих утилит, таких как классы ошибок, помощники ответов и логгеры.app.tsиserver.tsдля основной логики приложения.
Авторизация в производстве
Шаблон включает в себя готовую систему авторизации, которая работает в производстве и включает в себя:
- Доступный токен (краткосрочный) и токен обновления (долгосрочный).
- Токены обновления хранятся в базе данных и вращаются при каждом использовании.
- Ролевый контроль доступа:
authenticate()иauthorize(ROLES.ADMIN)-охранники.