jb

Масштабируемость API

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

const getUser = async () => {
  const res = await fetch(`${BASE_URL}/user`);

  if (!res.ok) {
    throw new Error(`Failed to fetch`);
  }

  const json = await res.json();

  return json.data;
};

Это порождает некоторые ограничения: нельзя прокинуть signal, headers, query, credentials, ошибка теряет контекст (status, url, payload), контракт ответа "сужается" прямо в функции и потом дублируется в других запросах, а логика конкретного endpoint смешивается с транспортной логикой.

Если смотреть на масштабируемость, API - это набор абстрактных утилит, а не коллекция несвязанных функций.

import { fetches } from '@siberiacancode/fetches';

const instance = fetches.create({
  baseUrl: 'https://api.example.com'
});

const getUser = (config) => instance.get('/user', config);
const createUser = (body, config) => instance.post('/user', body, config);

Таким образом мы получаем простые утилиты, которые не привязаны к конкретному проекту, их можно переиспользовать, расширять и масштабировать без хардкода в каждом endpoint. Также рекомендуем использовать apicraft - он автоматически генерирует эту структуру, типы и клиентские функции.

Редактировать на GitHub