Как часто обновляются данные в таблицах
Что проверяют
Умеете ли вы выбрать способ обновления под задачу, а не ставите по привычке setInterval на пять секунд. Интервьюер хочет услышать, откуда берётся частота и что происходит с таблицей, в которой пользователь в этот момент листает, выделяет строки или редактирует ячейку. Следом часто просят сравнить polling, SSE и WebSocket.
Как отвечать
Частоту задаёт продукт: котировки на бирже меняются каждую секунду, статусы заявок раз в несколько минут, отчёт раз в сутки. От этого зависит механизм:
- polling: периодический запрос. В TanStack Query это
refetchInterval, в SWRrefreshInterval. Хватает для большинства админок и дашбордов; - обновление по событиям браузера: в TanStack Query по умолчанию
staleTimeравен нулю и включёнrefetchOnWindowFocus, данные перезапрашиваются при возврате на вкладку без всякого таймера; - SSE:
EventSource, поток от сервера к клиенту поверх обычного HTTP с автоматическим переподключением. Подходит, когда данные только приходят; - WebSocket: двусторонний канал, если клиент тоже шлёт события или нужна минимальная задержка. Переподключение и heartbeat пишете сами.
Затем про саму таблицу. Изменения применяются к строкам по стабильному ключу (getRowId в TanStack Table), а не заменой массива целиком, иначе сбиваются выделение и фокус. Строку в режиме редактирования молча не перезаписывают. Большие таблицы виртуализируют (TanStack Virtual, react-window), чтобы обновление не перерисовывало тысячи узлов. Трафик экономят ETag с ответом 304 и запрос только изменений с последней метки времени.
Где спотыкаются
Опрашивают сервер и из фоновой вкладки. В TanStack Query refetchIntervalInBackground по умолчанию выключен не просто так: сотня забытых вкладок превращается в лишнюю нагрузку. Самописный таймер стоит останавливать по document.visibilityState.
Берут WebSocket для таблицы, которая меняется раз в пять минут. Постоянные соединения, переподключение и балансировка стоят дороже простого запроса раз в минуту.
Перерисовывают всю таблицу на каждое обновление. Пользователь теряет прокрутку, раскрытые строки и введённый текст, а на тысяче строк интерфейс заметно подтормаживает.