Первым делом переходим во вкладку network
и смотрим на время получения ответа с сервера, если отклик большой, то передаём таску на бэк, если нет, то анализируем проблему в Profiler
и Performance
.
API React Profiler предназначен для оценки скорости работы рендеринга и помогает выявлять узкие места производительности приложений.
import React, { Fragment, unstable_Profiler as Profiler } from "react"
Компонент Profiler
принимает коллбэк onRender
в виде свойства. Он вызывается каждый раз, когда компонент в профилируемом дереве фиксирует обновление.
const Movies = ({ movies, addToQueue }) => (
<Fragment>
<Profiler id="Movies" onRender={callback}>
Коллбэк onRender
принимает параметры, которые описывают то, что рендерится, и время, необходимое на рендеринг. Сюда входит следующее:
id
: Свойствоid
из дерева компонентаProfiler
, для которого было зафиксировано изменение.phase
: илиmount
(если дерево было смонтировано), илиupdate
(если дерево было повторно отрендерено).actualDuration
: время, затраченное на рендеринг зафиксированного обновления.baseDuration
: предполагаемое время рендеринга всего поддерева без кеширования.startTime
: время, когда React начал рендерить это обновление.commitTime
: время, когда когда React зафиксировал это обновление.interactions
: множество «взаимодействий» для данного обновления.
const callback = (id, phase, actualTime, baseTime, startTime, commitTime) => {
console.log(`${id}'s ${phase} phase:`)
console.log(`Actual time: ${actualTime}`)
console.log(`Base time: ${baseTime}`)
console.log(`Start time: ${startTime}`)
console.log(`Commit time: ${commitTime}`)
}
Загрузим страницу и перейдём в консоль инструментов разработчика Chrome. Там мы должны увидеть следующее.
Мы, кроме того, можем открыть инструменты разработчика React, перейти на закладку Profiler
и визуализировать сведения о времени рендеринга компонентов. Ниже показана визуализация этого времени в виде flame-графика.
Мне, кроме того, нравится использовать тут режим просмотра Ranked
, где приводится упорядоченное представление данных. В результате компоненты, на рендеринг которых уходит больше всего времени, оказываются в верхней части списка.
Кроме того, для проведения измерений в разных частях приложения можно воспользоваться несколькими компонентами Profiler
:
import React, { Fragment, unstable_Profiler as Profiler } from "react"
render(
<App>
<Profiler id="Header" onRender={callback}>
<Header {...props} />
</Profiler>
<Profiler id="Movies" onRender={callback}>
<Movies {...props} />
</Profiler>
</App>,
)
А как проанализировать взаимодействия пользователей с компонентами?