Все кейсы

Architecture / API Layer / TypeScript

Как уменьшить связанность между frontend и backend

В каталогах и рейтингах я выносил запросы и преобразование ответов в отдельные функции. Компоненты получали данные для отображения, а детали API оставались за пределами шаблонов.

Автор: Ярослав Мусатов Опубликовано: Обновлено:
НаправлениеАрхитектура
Год2025
СрокПроектная практика
РольFullstack Developer

Личная зона ответственности

Мой вклад

Здесь перечислена выполненная мной работа в рамках задачи, а не авторство всего продукта или результат всей команды.

  • Вынес запросы и преобразование backend-ответов из UI-компонентов.
  • Централизовал параметры запросов, пагинацию и обработку nullable-полей.
  • Подготовил типизированные данные и состояния ошибок для интерфейса.

Задача по снижению связанности frontend и backend

В проектах с каталогами, рецептами, товарами и рейтингами frontend постоянно работает с backend: получает списки, страницы по slug, фильтры, ингредиенты и связанные сущности. Если этот обмен не собрать аккуратно, UI быстро начинает зависеть от деталей конкретных endpoint-ов.

Если компоненты сами собирают URL, query parameters и разбирают сырой ответ, они становятся зависимыми от конкретного endpoint. Любое изменение pagination, nullable-поля или структуры ответа начинает расползаться по UI.

Почему нельзя тащить backend-контракты в UI

Компоненту нужны данные для отображения, состояние загрузки и ошибка запроса. Сборка адреса API, параметры пагинации и разбор вложенных полей относятся к функции получения данных. Это правило применимо и к CMS, и к другим серверным API.

Как помогает отдельный API-слой

Функции API принимают параметры, собирают запрос и преобразуют ответ. В них же обрабатываются поля, которые могут быть пустыми. Компонент получает структуру с известными именами и типами.

Я не добавлял сложную архитектуру ради этого разделения. Достаточно было вынести запрос и преобразование ответа из компонента в отдельную функцию.

  • Собирать query parameters и pagination в одном месте
  • Типизировать ответы API и данные для интерфейса
  • Возвращать UI уже подготовленные и безопасные значения

Как это применяется в реальном проекте

Для списков важно единообразно обрабатывать pagination, пустые результаты и ошибки. Для страниц по slug - отделять отсутствие записи от ошибки запроса. Для фильтров - не размазывать сериализацию параметров по компонентам. Для карточек - возвращать уже подготовленные поля, а не заставлять шаблон каждый раз проверять вложенность.

Что требует такой подход

Дополнительный API-слой добавляет место, которое нужно поддерживать. Но он окупается, когда меняется endpoint: правка остаётся в функции запроса или нормализации, а не требует проходить по каждому компоненту, где когда-то прочитали поле напрямую.

Функция API преобразует ответ до передачи данных компоненту.

Что получает проект в итоге

Такой подход снижает связанность между frontend и backend. UI остаётся ближе к задаче отображения, а детали API живут рядом с запросами. Это особенно важно в проектах, где одновременно есть каталоги, рецепты, товары, рейтинги и разные варианты фильтрации.

Стек

Next.js
TypeScript
Strapi
REST API
Zustand

Проекты, где применялся этот опыт

Подробнее о проектах: задача, интерфейс и выполненная работа.

Связанные услуги

Если у вас похожая задача, посмотрите состав работ и порядок оценки.

Техническая SEO-структура WordPress-сайта