Skip to main content

Що робить React Profiler?

Що робить React Profiler

React Profiler - це частина React DevTools (вкладка в Chrome/Firefox DevTools), яка:

  • записує всі рендери компонентів;
  • вимірює час рендера кожного;
  • показує причину ререндера (state, props, context, parent);
  • допомагає знайти "вузькі місця" (bottlenecks) у продуктивності.

Де знайти Profiler

  1. Встанови React Developer Tools (розширення для Chrome/Firefox);
  2. Відкрий DevTools -> вкладка React Developer Tools;
  3. Перейди на під-вкладку "Profiler".

Там є кнопка "Record", яка починає запис усіх рендерів.


Як працює Profiler (концептуально)

Під час профілювання React додає "маячки" (markers) навколо кожного рендера:

javascript
render(<Component />)startTimer() ...рендер... stopTimer()

Потім збирає статистику:

  • скільки мілісекунд зайняв рендер;
  • скільки разів компонент відрисувався;
  • які залежності викликали оновлення;
  • які компоненти "прокинулися" даремно.

Приклад використання Profiler (у DevTools)

1. Натискаєш "Record"

  • React починає відстежувати кожен рендер.

2. Виконуєш дії в застосунку

  • Наприклад, клікаєш кнопку, вводиш текст, переходиш по сторінках.

3. Натискаєш "Stop"

  • React показує дерево компонентів з підсвіткою за "вартістю" рендера:
    • Червоний - рендерився довго (повільний компонент);
    • Жовтий - середній;
    • Зелений - швидкий.

Що показує Profiler

МетрикаОпис
Render durationСкільки часу зайняв рендер компонента
CommitsСкільки разів React оновив DOM за період
Why did this render?Причина ререндера (state, props, context, parent)
FlamegraphВізуальна карта компонентів з часом рендера
Ranked chartСписок компонентів за тривалістю рендера
InteractionsЯкі дії користувача викликали оновлення

Приклад: як виглядає аналіз

Ти клікаєш кнопку "Додати товар", і Profiler показує:

javascript
<ProductsList> - Rendered (state changed) <ProductItem> - Rendered (props changed) <Header> - Skipped (no changes)

А також:

  • Render duration: 7.3ms
  • Commit 1: 15 components updated
  • Commit 2: 2 components updated

Видно, хто і скільки "з'їв" часу.


Приклад використання через код (для замірів вручну)

React також надає компонент <Profiler> для замірів у коді:

javascript
import { Profiler } from 'react'; function onRenderCallback( id, // рядок - ім'я профільованої області phase, // "mount" | "update" actualDuration, // скільки зайняв рендер baseDuration, // без мемоізації startTime, // коли почався рендер commitTime, // коли закінчився ) { console.log(`${id}: ${phase} зайняв ${actualDuration.toFixed(2)}ms`); } export default function App() { return ( <Profiler id="ProductsList" onRender={onRenderCallback}> <ProductsList /> </Profiler> ); }

Це корисно для програмного профілювання - можна логувати в консоль, метрики, Sentry, аналітику тощо.


Як Profiler допомагає оптимізувати

  1. Знаходить "важкі" компоненти -> підсвітка червоним = багато часу на рендер.
  2. Показує зайві ререндери -> можна побачити, що компонент ререндериться без змін props/state -> потрібен React.memo().
  3. Виявляє "протікаючий" контекст -> зміна в Context викликає каскад ререндерів -> варто розділити провайдери.
  4. Порівнює продуктивність до/після оптимізацій -> можна записати "до" і "після" та побачити ефект useMemo, useCallback, мемоізації.

Типові знахідки за допомогою Profiler

ПроблемаРішення
Компонент ререндериться при кожному вводі текстуReact.memo() + useCallback()
Контекст оновлює весь UIРозділити контекст або використати селектори
Важке сортування/фільтрація на кожному рендеріuseMemo()
Багато дрібних setState() поспільОб'єднати / використати batching
Багато ефектів на кожному оновленніУточнити залежності useEffect

Візуальні режими профайлера

  1. Flamegraph
  • Показує ієрархію компонентів і час рендера.
  • Чим ширший блок - тим довший рендер.
  1. Ranked
  • Показує список компонентів, відсортованих за часом рендера.
  1. Commit selector
  • Можна переглядати кожен рендер-цикл ("commit") окремо.

Підсумок

Що робитьЯк допомагає
Вимірює час рендера компонентівЗнаходить повільні ділянки
Показує причини ререндерівДопомагає зрозуміти "хто винен"
Візуалізує навантаженняFlamegraph і ranked view
Використовується з DevTools або <Profiler>Для аналізу в браузері і коді
Покращує продуктивністьДає дані для оптимізації React.memo, useMemo, контексту

Простими словами:

React Profiler - це як "рентген" для твого UI: він показує, які компоненти рендеряться занадто часто і де втрачається продуктивність.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.