awesome-everything EN
↑ Обратно к восхождению

Архитектура фронтенда

Где происходит data fetching — и почему это решает LCP

Суть Четыре места, где React-приложение может делать fetch, что каждое стоит в round-trip''''ах, и как выбирать между ними.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 8 min

Один блог загружается за 400ms, другой — за 2100ms. Одинаковый CDN, одинаковая база данных, одинаковая версия React. Единственное отличие: где происходит запрос данных.

Critical path от клика до контента

Каждая загрузка страницы имеет critical path — цепочку последовательных round-trip’ов между браузером и сервером, которые должны завершиться до того, как основной контент станет виден. Largest Contentful Paint (LCP) измеряет, когда этот контент появляется. Каждый лишний round-trip добавляет 50–200ms на быстром соединении, 500ms+ на мобильном.

С чистым SPA цепочка выглядит так:

  1. Браузер запрашивает index.html с CDN (~50ms)
  2. Скачивается и парсится JS bundle (~400–600ms)
  3. React монтирует дерево компонентов
  4. useEffect запускает fetch на /api/data (~200ms)
  5. React перерисовывается с данными, LCP срабатывает

Итого: легко 800–2000ms на быстром соединении, 3–5s на медленном.

Client SPA — 4 последовательных trip’а до LCP
1GET /index.html → CDN → 50ms
2GET /bundle.js → CDN → 600ms (parse + eval)
3React.mount() → CPU → 100ms
4GET /api/data → origin server → 200ms
LCP срабатывает на ~950ms (быстрая сеть). Мобильный: 3–5s.

Четыре локации

Современные фреймворки поддерживают четыре места для fetch’а:

Время сборки (SSG — static generation). Данные запекаются в HTML при сборке. Нулевая стоимость fetch’а на запрос. Данные устаревают до следующей сборки. Подходит для контента, который меняется реже раза в час: посты блога, маркетинговые страницы, документация.

Сервер во время запроса (SSR или Server Components). Fetch происходит на сервере при генерации HTML-ответа. Браузер получает HTML с данными внутри. Один эффективный round-trip. Next.js RSC async components, Remix loaders и getServerSideProps — все используют этот паттерн.

Стриминг на сервере. Сервер отправляет HTML чанками до того, как все данные готовы. Шелл лэйаута прилетает за ~100ms; медленные секции стримятся по мере готовности данных. Каждый React Suspense boundary стримится независимо.

Клиент после монтирования (CSR). useEffect, useQuery, useSWR. Страница монтируется пустой; данные приходят после выполнения JS. Необходим для пользовательских интерактивных потоков — фильтры, real-time обновления, всё что зависит от состояния пользователя. Но неверный выбор для LCP-элемента.

Метафора ресторана

Client fetch — это как прийти в ресторан к пустому столу, две минуты изучать меню, потом ждать еду. Server fetch — это позвонить заранее: хост принимает заказ, вы садитесь к уже накрытому столу. Стриминг — это когда закуска приносится мгновенно, пока основное блюдо ещё готовится. Общее время кухни похоже, но воспринимаемое ожидание радикально короче.

Викторина

Почему client-side data fetching медленнее при первой загрузке страницы, чем server-side?

Викторина

Блог публикует 5 новых постов в день. Какая локация fetch'а подходит лучше всего?

Расставь шаги по порядку

Упорядочи шаги сети для типичного client-rendered React приложения, загружающего страницу товара:

  1. 1 Пользователь кликает по ссылке
  2. 2 Браузер запрашивает index.html с CDN
  3. 3 Браузер скачивает и парсит JS bundle
  4. 4 JS выполняется, React монтирует приложение
  5. 5 useEffect срабатывает, вызывает fetch('/api/product/123')
  6. 6 Сервер отвечает JSON с данными товара
  7. 7 React перерисовывается с данными, LCP срабатывает
Вспомните перед уходом
  1. 01
    Назови четыре локации data fetching от build-time до client-only.
  2. 02
    Почему SSG имеет нулевую стоимость fetch'а на запрос?
  3. 03
    Что такое LCP и почему локация fetch'а влияет на него?
Итог

Critical path страницы — это цепочка последовательных round-trip’ов между кликом и видимым контентом. Client-rendered SPA’ы накапливают 4+ trip’а до срабатывания LCP; server-side рендеринг сворачивает это до одного эффективного trip’а. Стриминг идёт ещё дальше: шелл лэйаута приходит за 100ms, каждая секция стримится независимо. Правило: данные LCP-элемента — на сервере, пользовательское интерактивное состояние — на клиенте. Для в основном статического контента (блоги, документация) SSG с CDN-кешированием даёт почти нулевой TTFB при фактически нулевой серверной нагрузке.

Связанные уроки
встречается в202
Продолжить восхождение ↑Fetch waterfall''''ы — диагностика и лечение через Promise.all
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.