Как я перестал мучиться с fetch и почему Ky — это не просто очередная обертка
Каждый раз, когда я начинаю новый проект на JavaScript, передо мной встает одна и та же дилемма: использовать нативный fetch или тащить в зависимости тяжеловесный Axios. С fetch вечно одна и та же история. Ты пишешь запрос, потом проверяешь response.ok, потом обрабатываешь JSON, потом ловишь ошибки сети. В итоге десять строк кода там, где могла быть одна.
Недавно я наткнулся на библиотеку Ky от Синдре Сорхуса. Если вы следите за миром Open Source, то знаете, что этот парень выпускает пакеты, которые становятся стандартом де-факто. Ky — это крошечный HTTP-клиент, который весит копейки, не имеет зависимостей и при этом делает работу с запросами человеческой.
Что не так с обычным fetch
Давайте будем честны: fetch — это низкоуровневое API. Он спроектирован так, чтобы быть гибким, но неудобным для повседневной разработки. Например, fetch не считает ошибкой статус 404 или 500. Для него это успешный ответ, и вам нужно вручную проверять свойство ok.
Другая головная боль — таймауты. В нативном API их просто нет «из коробки», приходится возиться с AbortController. Ky решает эти проблемы элегантно, оставаясь при этом максимально близким к стандартам браузера.
Чем Ky подкупает на практике
Я выделил несколько моментов, которые заставили меня пересмотреть подход к сетевым запросам в моих проектах.
Обработка ошибок без лишних проверок
В Ky любой статус ответа, не входящий в диапазон 2xx, автоматически выбрасывает ошибку. Это именно то поведение, которое мы ожидаем в 99% случаев. Больше никаких if (!response.ok).
import ky from 'ky';
try {
const user = await ky.get('https://api.example.com/user/1').json();
console.log(user.name);
} catch (error) {
// Если сервер ответил 404 или 500, мы попадем сюда
console.error('Что-то пошло не так:', error.response.status);
}
Умные повторы запросов
Это киллер-фича. Если у пользователя моргнул интернет или сервер временно отдал 502, Ky сам попробует отправить запрос еще раз. По умолчанию он делает два повтора для безопасных методов (GET, PUT, DELETE), используя экспоненциальную задержку. Вам не нужно писать свою логику ретраев — всё уже работает.
Таймауты и JSON
Отправить JSON с помощью fetch — это отдельный вид пытки: нужно вручную сериализовать объект и выставлять заголовки. В Ky есть опция json, которая делает всё за вас. А таймаут выставляется одной цифрой.
const response = await ky.post('https://example.com/api', {
json: { foo: true },
timeout: 5000 // 5 секунд и запрос прервется сам
}).json();
Поддержка TypeScript и валидация
Если вы пишете на TS, вам понравится, что метод .json() принимает дженерик. Но что еще круче — Ky поддерживает интеграцию со схемами (Zod, Valibot). Вы можете не просто получить данные, а сразу проверить, соответствуют ли они вашим ожиданиям.
import { z } from 'zod';
const userSchema = z.object({ name: z.string() });
const user = await ky('api/user').json(userSchema);
// Если API пришлет не то, вылетит SchemaValidationError
Как это устроено внутри
Библиотека написана на TypeScript и нацелена на современные среды: актуальные браузеры, Node.js 22+, Bun и Deno. В отличие от Axios, который тянет за собой старый XMLHttpRequest для совместимости, Ky полностью построен на Fetch API.
Интересная деталь: Ky умеет отслеживать прогресс загрузки и выгрузки файлов. Раньше для этого приходилось использовать тяжелые библиотеки, а теперь это доступно в легковесном пакете без зависимостей.
Когда стоит переходить на Ky
Я часто слышу вопрос: «Зачем мне еще одна библиотека, если есть Axios?». Ответ простой: вес и современность. Ky в разы меньше Axios и лучше вписывается в современную экосистему JS.
Кому это пригодится:
- Вы пишете фронтенд и хотите минимизировать размер бандла.
- Вы устали от многословности нативного
fetch. - Вам нужна надежная обработка ретраев и таймаутов без написания велосипедов.
- Вы используете Server-Side Rendering (SSR) — Ky отлично работает и в браузере, и на сервере.
Кстати, если вы привыкли к prefixUrl или общим заголовкам для всех запросов, у Ky есть метод .create() и .extend(). Можно создать один экземпляр клиента для вашего API и переиспользовать его везде.
Ky — это тот случай, когда маленькая библиотека решает большие проблемы. Она не пытается переизобрести колесо, а просто делает стандартное API удобным. Если вы до сих пор пишете обертки над fetch в каждом проекте, просто попробуйте Ky. Скорее всего, возвращаться назад уже не захочется.
Посмотреть исходники и почитать полную документацию можно в официальном репозитории sindresorhus/ky. Там еще много интересного про хуки и кастомные инстансы.
