Архитектура фронтенда
Data fetching: тест с множественным выбором
Шесть вопросов через весь юнит. Каждый отражает решение, которое ты принимаешь на реальном перф-ревью — не определение для пересказа, а компромисс, который надо взвесить против бюджета LCP и риска устаревших данных.
Убедись, что связываешь место fetch, waterfall’ы, RSC streaming, клиентский кэш и многослойную инвалидацию в одно решение: какие round-trip’ы лежат на critical path и что на самом деле покупает каждый фикс.
Страница товара рендерит заголовок (LCP-элемент) из клиентского useEffect-fetch. LCP равен 2.9s. Команда добавляет скелетон загрузки и поднимает TTL CDN-кэша. LCP почти не двигается. Какой фикс настоящий?
Страница профиля грузит user (200ms), posts (300ms) и followers (150ms) — все независимые — через три вложенных useEffect-компонента. Суммарно ~650ms. Почему, и что ограничивает это до ~300ms?
Команда помечает каждый компонент 'use client' в Next.js App Router, а потом жалуется, что RSC не дал выигрыша по бандлу. Что произошло?
RSC-страница грузит данные на сервере, затем клиентский компонент вызывает useQuery за теми же данными при монтировании — каждая загрузка страницы делает два round-trip'а за один датасет. Какой фикс правильный?
Поле search-as-you-type шлёт fetch на каждое нажатие. Пользователь печатает 'react', но видит результаты для 'reac'. Ни один из запросов не падает. Первопричина и лучший фикс?
После мутации, обновляющей товар, сервер ревалидирует свой кэш, но пользователи несколько минут видят старую цену. Server Function корректно вызвала revalidateTag. Что упустили?
Сквозная линия юнита — одна карта critical path. Место fetch решает, сколько round-trip’ов предшествует LCP: server fetch их схлопывает, client fetch после JS их складывает. Waterfall’ы пересериализуют независимые fetch’и через каскад рендера; Promise.all и соседние RSC-компоненты ограничивают их самым медленным. RSC отгружает ноль JS только для компонентов, остающихся на сервере, а Suspense streaming покупает низкий TTFB. Клиентский кэш (SWR-семантика, single-flight, оптимистичные снимки) управляет повторными визитами и взаимодействиями, а AbortController убивает гонки. И каждая мутация должна инвалидировать каждый затронутый слой кэша — одной серверной ревалидации мало, браузер останется устаревшим.