Вопрос или проблема
Мне нужно рассчитать время, затраченное приложением на переход от одного маршрута к другому.
Я использую react-router-dom, поэтому, когда маршрут изменяется на другой, сначала изменяется стек истории.
Поэтому я модифицировал методы history.pushState() и history.replaceState(), чтобы обозначить начало процесса маршрутизации.
(function()
{
const originalpushstate=window.history.pushState;
const originalreplacestate=window.history.replaceState;
window.history.pushState=function(...args)
{
performance.mark("monkeypatchinginitial");
originalpushstate.apply(this,args);
}
window.history.replaceState=function(...args)
{
performance.mark("monkeypatchinginitial");
originalreplacestate.apply(this,args);
}
})();
Затем происходит процесс маршрутизации, и когда соответствующие компоненты монтируются, выполняется их useEffect. Поэтому я отмечаю конец процесса маршрутизации здесь.
useEffect(()=>{
performance.mark("monkeypatchingfinal");
try{
console.log("время рендера компонента:",performance.measure("componentrender","monkeypatchinginitial","monkeypatchingfinal").duration);
}
catch(e)
{
console.error(e);
}
},[]);
Правильный ли мой подход к расчёту времени маршрутизации?
Под термином “Время маршрутизации” я подразумеваю время, затраченное на изменение маршрута и рендеринг новых компонентов.
Если вы нашли какую-либо ошибку или у вас есть предложения, пожалуйста, сообщите об этом.
Ответ или решение
Ваша стратегия для расчета времени маршрутизации в приложении ReactJS выглядит вполне разумной, однако есть некоторые оптимизации и улучшения, которые можно внести для более точного определения времени выполнения перехода между маршрутами.
Анализ вашего подхода
-
Патчинг
history.pushState
иhistory.replaceState
:
Вы правильно сделали, что решили патчить методыpushState
иreplaceState
для начала измерения времени. Это позволяет вам зафиксировать момент перехода по маршруту.Однако, для лучшего отслеживания времени маршрутизации, вам стоит расширить функциональность, добавив более явное время начала измерений.
- Использование
performance.mark
иperformance.measure
:
Ваше использованиеperformance.mark
для начала и завершения измерений корректно. Тем не менее, результатperformance.measure
не показывает время между двумя отметками, если вы не вызываете его до их удаления. Рекомендуется вызыватьperformance.measure
сразу послеperformance.mark
, а не внутриuseEffect
.
Предложенное улучшение
Вот улучшенная версия вашего подхода:
(function() {
const originalPushState = window.history.pushState;
const originalReplaceState = window.history.replaceState;
window.history.pushState = function(...args) {
performance.mark("routingStart");
originalPushState.apply(this, args);
}
window.history.replaceState = function(...args) {
performance.mark("routingStart");
originalReplaceState.apply(this, args);
}
})();
useEffect(() => {
// Это будет вызвано, когда компонент по новому маршруту будет смонтирован
performance.mark("routingEnd");
// Ждем завершения рендера и затем измеряем
performance.measure("routeChange", "routingStart", "routingEnd");
const measure = performance.getEntriesByName("routeChange")[0];
if (measure) {
console.log("Время перехода маршрута:", measure.duration);
performance.clearMeasures("routeChange"); // очищаем после использования
}
// Очищаем метки
performance.clearMarks("routingStart");
performance.clearMarks("routingEnd");
}, []);
Дополнительные рекомендации
-
Обработка асинхронных данных:
Если ваши компоненты загружают данные асинхронно при монтировании (например, через API), вам может понадобиться включить дополнительные метки для отслеживания времени загрузки. -
Использование
React Router
:
Убедитесь, что вы учитываете специфические дляreact-router-dom
методы, такие какuseLocation
илиuseHistory
, если ваш компонент должен реагировать на изменения маршрутного состояния. - Оптимизация производительности:
Старайтесь минимизировать количество ререндеров и нагрузку вuseEffect
, чтобы получить наиболее точные результаты времени.
Заключение
Ваш подход вполне рабочий, однако с применением предложенных улучшений вы сможете значительно повысить точность измерений времени маршрутизации в вашем React приложении. Обязательно протестируйте произвольные сценарии использования, чтобы убедиться, что ваше измерение времени действительно охватывает все аспекты процесса перехода маршрутов.