Фронтенд
TanStack Query
Бібліотека для роботи з серверними даними: запити, кеш, оновлення у фоні та мутації.
Що це
TanStack Query (раніше React Query) створив Таннер Лінслі у 2019 році. Вона розглядає дані з сервера як окремий вид стану: їх треба завантажити, закешувати, оновлювати й синхронізувати, а не зберігати вручну в глобальному сторі.
Ти описуєш query з ключем і функцією запиту, а бібліотека сама кешує результат, дедуплікує однакові запити, повторює невдалі й оновлює застарілі дані у фоні. Для змін є mutations з інвалідацією кешу й оптимістичними оновленнями.
Адаптери є для React, Vue, Svelte, Solid та Angular. Бібліотека скорочує код і прибирає багато useEffect для завантаження даних.
Коли брати
- Застосунок багато звертається до REST чи GraphQL API.
- Потрібні кеш, повторні спроби, пагінація й безкінечний скрол без ручної реалізації.
- Хочеш прибрати серверні дані з Redux чи Context.
Коли не варто
- Лише локальний стан UI (відкрита модалка, значення форми).
- Метафреймворк уже дає власне завантаження даних, і цього досить, наприклад серверні компоненти Next.js для простих випадків.
Ключові поняття
- Query key
- Масив-ідентифікатор запиту. За ним відбувається кешування й інвалідація.
- staleTime and gcTime
- Скільки дані вважаються свіжими і як довго лишаються в кеші без підписників.
- Mutation
- Запит, що змінює дані на сервері; після нього кеш інвалідується.
- Background refetch
- Оновлення при поверненні на вкладку, відновленні мережі чи за інтервалом.
- Optimistic updates
- Миттєво показати результат дії й відкотити, якщо сервер відмовив.
Приклад
Питання на співбесіді
1. Навіщо потрібен queryKey?
Це унікальний ідентифікатор даних у кеші. За ним бібліотека шукає закешований результат, дедуплікує запити й знає, що інвалідувати після мутації. Змінні запиту (id, фільтри) кладуть у ключ.
2. У чому різниця між staleTime і gcTime?
staleTimeвизначає, скільки дані вважаються свіжими без повторного запиту.gcTimeскільки неактивні дані зберігаються в кеші, перш ніж їх видалять.3. Як оновити список після створення елемента?
У
onSuccessмутації викликатиqueryClient.invalidateQueries({ queryKey: ['items'] }), тоді список перезавантажиться. Або оптимістично змінити кеш.4. Чим TanStack Query краще за useEffect + useState?
Він дає кеш, дедуплікацію, повтори, стан завантаження й помилки, фонові оновлення та пагінацію без ручного коду, а також уникає гонок запитів.
Питання з банку співбесід
- Під час завантаження сторінки запит
/api/meіде шість разів: його окремо роблять хедер, сайдбар і чотири віджети, кожен у своємуuseEffect. А після зміни імені в профілі хедер ще показує старе. Як це виправити системно?MiddleReact - Ви отримали застосунок на 200 екранів, де все лежить в одному Redux-сторі: відповіді API з ручними прапорцями
loading, стан форм, відкриті модалки, фільтри. Будь-яка зміна зачіпає пів кодової бази, а дані часто застарілі. Як би ви переробили архітектуру стану і в якому порядку?SeniorReact
Схожі технології
- ReactБібліотека для побудови інтерфейсів із компонентів: UI як функція від стану.
- ReduxПередбачуваний контейнер стану: єдине сховище, зміни лише через дії та редʼюсери.
- GraphQLМова запитів і специфікація API, де клієнт сам вказує, які поля йому потрібні.
- TypeScriptНадмножина JavaScript зі статичними типами, яка компілюється в звичайний JS.
Логотипи належать їхнім власникам і використані лише для ідентифікації. Іконки: Simple Icons (CC0), Devicon (MIT).