Fetch API и Axios

↑ 5.4 Работа с API: REST, GraphQL, WebSocket · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Сравнение нативного fetch и Axios: что даёт библиотека и когда можно без неё.

Объяснение

// fetch
const res = await fetch("/api/orders", {
  method: "POST",
  headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` },
  body: JSON.stringify(dto),
  credentials: "include", signal: ctrl.signal, cache: "no-store",
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);          // fetch НЕ бросает на 4xx/5xx
const data = await res.json();                                // stream: res.body?.getReader()
 
// axios
const { data } = await axios.post<Order>("/api/orders", dto, { params: { dryRun: true }, timeout: 10_000, signal: ctrl.signal });
ВозможностьfetchAxios
Исключение при 4xx/5xxнетда (validateStatus)
JSONвручную JSON.stringify/res.json()автоматически
Таймаутчерез AbortSignal.timeout()timeout
Интерсепторынет (обёртка)да
Прогресс загрузки/скачиваниястримыonUploadProgress/onDownloadProgress
ОтменаAbortControllerAbortController (и устаревший CancelToken)
Инстансы и базовые настройкиобёрткаaxios.create
XSRF, сериализация параметроввручнуюиз коробки
Размер0 (нативный)~13 КБ
Средабраузер, Node 18+браузер, Node
Стримы, streaming responsesдаограниченно (нативно: adapter: "fetch")

Оба подхода нужно оборачивать в слой API (см. Слой API в приложении: сервисы и типизация).

Вспомогательное: URLSearchParams, FormData (загрузка файлов, не задавайте Content-Type вручную), Headers, Request/Response, AbortSignal.any/timeout. Альтернативы: ky, ofetch ($fetch Nuxt), wretch.

Нюансы и подводные камни

  • Забытая проверка res.ok — ошибки проходят незамеченными.
  • res.json() можно прочитать один раз (клонирование res.clone()).
  • fetch по умолчанию не отправляет cookie на другие origin: credentials.
  • Таймаута нет по умолчанию у fetch.
  • FormData с заголовком Content-Type: multipart вручную ломает boundary.

Практика

  1. Напишите обёртку над fetch с проверкой статуса, JSON и таймаутом.
  2. Реализуйте загрузку файла с прогрессом через Axios.
  3. Сравните размер бандла и функциональность.

Вопросы с ответами

Связанные темы