Расчет времени маршрутизации в приложении ReactJS

Вопрос или проблема

Мне нужно рассчитать время, затраченное приложением на переход от одного маршрута к другому.

Я использую 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 выглядит вполне разумной, однако есть некоторые оптимизации и улучшения, которые можно внести для более точного определения времени выполнения перехода между маршрутами.

Анализ вашего подхода

  1. Патчинг history.pushState и history.replaceState:
    Вы правильно сделали, что решили патчить методы pushState и replaceState для начала измерения времени. Это позволяет вам зафиксировать момент перехода по маршруту.

    Однако, для лучшего отслеживания времени маршрутизации, вам стоит расширить функциональность, добавив более явное время начала измерений.

  2. Использование 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");
}, []);

Дополнительные рекомендации

  1. Обработка асинхронных данных:
    Если ваши компоненты загружают данные асинхронно при монтировании (например, через API), вам может понадобиться включить дополнительные метки для отслеживания времени загрузки.

  2. Использование React Router:
    Убедитесь, что вы учитываете специфические для react-router-dom методы, такие как useLocation или useHistory, если ваш компонент должен реагировать на изменения маршрутного состояния.

  3. Оптимизация производительности:
    Старайтесь минимизировать количество ререндеров и нагрузку в useEffect, чтобы получить наиболее точные результаты времени.

Заключение

Ваш подход вполне рабочий, однако с применением предложенных улучшений вы сможете значительно повысить точность измерений времени маршрутизации в вашем React приложении. Обязательно протестируйте произвольные сценарии использования, чтобы убедиться, что ваше измерение времени действительно охватывает все аспекты процесса перехода маршрутов.

Оцените материал
Добавить комментарий

Капча загружается...