Skip to content

Введение

Проблема

Почти каждое приложение водит один и тот же хоровод вокруг данных: запустить запрос, отследить загрузку, поймать ошибку, показать результат. Дальше вмешивается реальность — пользователь кликает дважды, второй запрос обгоняет первый, ответ уже устарел, хочется ретрай, не хочется перезапрашивать только что полученное, и желательно, чтобы всё это не жило внутри компонента.

Руками это превращается в болото из useState/useEffect, гонок и логики, приваренной к вью. effector прекрасно решает часть про состояние — событиями, сторами и эффектами. effector-refetch берёт на себя часть про получение данных поверх него.

Идея: строимся на реальных эффектах

Ключевое решение простое: ваш эффект — это единица работы.

ts
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) превращают плохой ответ в ошибку.
  • Декларативный HTTPcreateJsonQuery поверх глобального 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.

Готовы? К быстрому старту →

Под лицензией MIT