Next.js-before-hydration, Next.js-hydration и FCP

Мне было интересно, может ли кто-нибудь объяснить, что означают временные метрики Next.js-before-hydration и Next.js-hydration и как они соотносятся с FCP. Это для приложения NextJS, которое рендерит на стороне сервера и использует хуки на стороне клиента.

Вот снимок экрана с измерением вкладки «Производительность», на котором показана свежая загрузка страницы, которая попадет на реагирующий сервер и SSR. Эта конкретная страница имеет компоненты, которые также несколько раз повторно визуализируются на стороне клиента, прежде чем страница завершится. Я увеличил масштаб до области, начиная с первоначального запроса и включая начальные основные веб-приложения, такие как FCP и LCP. (TTI и TTFB выводятся гораздо позже за пределы экрана.)

введите описание изображения здесь

Похоже, что Next.js-before-hydration запускается именно тогда, когда начинается запрос сервера. (На диафильме отображаются миниатюры со страницы, которая ранее была в браузере, что похоже на ошибку инструментов разработчика, поэтому не обращайте на это внимания.)

Next.js-before-hydration длится 1,48 с в этом примере, но для этого запроса TTFB составлял всего 120 мс, поэтому я знаю, что он включает больше, чем время ответа сервера.

Я знаю, что FCP - это TTFB + время загрузки контента + время рендеринга, поэтому я подумал, что Next.js-before-hydration должно быть подмножеством этого, но я видел примеры других сайтов (например, ticketmaster.com), где конец Next.js-before-hydration простирается далеко за пределами FP / FCP и где Next.js-hydration заканчивается даже позже - иногда непосредственно перед событием onLoad (красный L).

Проходя мимо кинопленки, контент начинает постепенно отображаться прежде, чем мы дойдем до Next.js-hydration (помечено как Next.js...dration на изображении), что заставляет меня думать, что он уже начинает запускать хуки и повторный рендеринг.

Итак, что это значит, когда NextJS переходит с Next.js-before-hydration на Next.js-hydration? Связано ли это с окончанием первого рендеринга (имеется в виду, когда каждый компонент загружается в первый раз, как первый рендер в React Profiler) и когда начинают выполняться хуки?

Наконец, что означает конец Next.js-hydration и какое отношение эти два показателя имеют к FCP?


person tunesmith    schedule 28.03.2021    source источник


Ответы (1)


После еще нескольких недель изучения и исследования я думаю, что в основном ответ -

FCP практически не имеет прямого отношения к Next.js-hydration или Next.js-before-hydration.

Частично это смешение определений слова «рендеринг».

Это правда, что FCP - это TTFB + время загрузки контента + время рендеринга. Но в этом контексте рендеринг не имеет ничего общего с определениями рендеринга в React. В этом контексте рендеринг - это скорее этап рендеринга HTML, который происходит перед рисованием. И многие браузеры могут пытаться рисовать элементы на экране даже до того, как контент Dom завершит загрузку (и, возможно, даже до domInteractive, я не уверен в этом).

Таким образом, иногда FCP может произойти до завершения Next.js-before-hydration, а в других случаях это может произойти не раньше. В примере с вопросом измерение производительности находится в режиме разработки, что может задерживать FCP.

Что касается разницы между Next.js-before-hydration и Next.js-hydration, следует помнить, что гидратация невозможна даже до тех пор, пока не будут загружены все необходимые библиотеки реагирования.

Это означает, что Next.js-before-hydration по определению включает:

  • Время, затраченное на загрузку исходного html (включая TTFB)
  • Время, затраченное на синтаксический анализ исходного html с помощью необходимых тегов скрипта, загружающих реагирующие библиотеки.
  • Время, потраченное на загрузку этих важных файлов фрагментов javascript.
  • Время, потраченное на оценку / выполнение этих файлов фрагментов javascript и загрузку среды реакции.

Только в этот момент может начаться процесс гидратации. Я считаю, что процесс гидратации реакции заключается в обработке React render # 1 и присоединении модели событий реакции ко всем компонентам, которые являются частью этого первого рендера.

Согласование (дополнительные коммиты / рендеры) становится возможным только после завершения Next.js-hydration.

person tunesmith    schedule 28.04.2021