Введение
Проблема
Почти каждое приложение водит один и тот же хоровод вокруг данных: запустить запрос, отследить загрузку, поймать ошибку, показать результат. Дальше вмешивается реальность — пользователь кликает дважды, второй запрос обгоняет первый, ответ уже устарел, хочется ретрай, не хочется перезапрашивать только что полученное, и желательно, чтобы всё это не жило внутри компонента.
Руками это превращается в болото из useState/useEffect, гонок и логики, приваренной к вью. effector прекрасно решает часть про состояние — событиями, сторами и эффектами. effector-refetch берёт на себя часть про получение данных поверх него.
Идея: строимся на реальных эффектах
Ключевое решение простое: ваш эффект — это единица работы.
const fetchUserFx = createEffect((id: number) => api.user(id));
const userQuery = createQuery({ effect: fetchUserFx });userQuery — тонкая реактивная обёртка вокруг fetchUserFx. Она добавляет $data, $error, $status, $pending, события жизненного цикла, retry, cache и concurrency — но эффект под ней остаётся вашим: виден в devtools, композируется через attach, дружит с fork для SSR и тестов. Ничего не спрятано в приватном «исполнителе».
В этом отличие от «чёрного ящика»: вы сохраняете модель мышления effector (события текут через граф правил) и просто получаете удобства запросов декларативно.
Что вы получаете
- Статусы и жизненный цикл —
$data / $error / $status / $pending,finished.{done,fail}. - Конкурентность —
TAKE_LATEST(по умолчанию),TAKE_FIRST,TAKE_EVERY; гонки просто исчезают. - Ретраи — на уровне графа, каждая попытка — реальный вызов эффекта.
- Кэш — staleAfter, SWR, сборка мусора, дедупликация, персист.
- Реальная отмена — прерывание запроса, а не просто игнор результата.
- Мутации и инвалидация —
createMutation,invalidate,update, оптимистичные апдейты. - Валидация — контракты-схемы (zod / Standard Schema) превращают плохой ответ в ошибку.
- Декларативный HTTP —
createJsonQueryповерх глобальногоfetch. - Пагинация —
createInfiniteQuery(двунаправленныеfetchNext/fetchPrevious). - Авто-рефетч и поллинг —
refetchInterval, хелперы на фокус окна / реконнект. - Barrier и офлайн —
createBarrier(401 → обновить токен → повторить) иcreateNetworkBarrier. - Биндинги —
useUnit(query)/useQueryдля React, Vue и Solid, плюсuseSuspenseQuery. - Devtools — визуальные панели для React, Vue и Solid + поток интроспекции.
Философия
- Дружелюбно по умолчанию, мощно внутри. Inline-опции покрывают 90%; те же возможности — отдельные операторы для остального.
- Без магии. Это обычные юниты effector (
createStore/sample/createEffect), которые вы могли бы написать сами — просто собранные за вас. - Честно. Мы говорим, когда это не нужно, и как оно соотносится с farfetched.
Готовы? К быстрому старту →