React Profiling Application Profiling

Hoje, falaremos sobre como medir o desempenho da renderização de componentes do React usando a API do React Profiler. Também avaliaremos as interações com o componente usando a nova API experimental de rastreamento de interação. Além disso, usaremos a API de tempo do usuário para fazer nossas próprias medições.

Usaremos o aplicativo React Movies Queue como uma plataforma para experimentos.


Aplicativo Reagir fila de filmes

API do React Profiler


A API do React Profiler foi projetada para medir o desempenho da renderização e ajuda a identificar gargalos no desempenho do aplicativo.

import React, { Fragment, unstable_Profiler as Profiler} from "react";

O componente Profileraceita um retorno de chamada onRendercomo uma propriedade. É chamado toda vez que um componente na árvore com perfil confirma uma atualização.

const Movies = ({ movies, addToQueue }) => (
  <Fragment>
    <Profiler id="Movies" onRender={callback}>

Vamos, para fins de teste, tentar medir o tempo necessário para renderizar partes de um componente Movies. Aqui está como fica.


O aplicativo Fila de filmes do React e a pesquisa Filmes usando as

ferramentas de retorno de chamada do desenvolvedor do ReactonRender aceitam parâmetros que descrevem o que está sendo renderizado e o tempo necessário para renderizar. Isso inclui o seguinte:

  • id: Propriedade idda árvore de componentes Profilerpara a qual a alteração foi confirmada.
  • phase: ou mount(se a árvore foi montada) ou update(se a árvore foi renderizada novamente).
  • actualDuration: O tempo necessário para renderizar uma atualização fixa.
  • baseDuration: Tempo estimado para renderizar a subárvore inteira sem armazenar em cache.
  • startTime: O momento em que o React começou a renderizar esta atualização.
  • commitTime: o momento em que o React confirmou esta atualização.
  • interactions: Muitas "interações" para esta atualização.

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}`);
}

Carregaremos a página e acessaremos o console das Ferramentas do desenvolvedor do Chrome. Lá devemos ver o seguinte.


Criação de perfil de resultados nas ferramentas do desenvolvedor

Além disso, podemos abrir as ferramentas do desenvolvedor do React, acessar o marcadorProfilere visualizar informações sobre a hora da renderização do componente. Abaixo está uma visualização desse tempo na forma de um gráfico de chama.


Trabalhando com resultados de criação de perfil no React Developer Tools

Também gosto de usar o modo de exibição aquiRanked, que fornece uma exibição ordenada dos dados. Como resultado, os componentes que levam mais tempo para renderizar estão no topo da lista.


Exibindo resultados de criação de perfil no modo Classificado.

Além disso, você pode usar vários componentes para fazer medições em diferentes partes do aplicativoProfiler:

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>
);

E como analisar as interações do usuário com os componentes?

API de rastreamento de interação


Seria bom poder rastrear as interações do usuário com a interface do aplicativo (como cliques nos itens). Isso permitirá que você encontre respostas para perguntas interessantes como esta: "Quanto tempo levou para atualizar o DOM depois de clicar neste botão?". Felizmente, o React tem suporte experimental para analisar as interações do usuário com o aplicativo usando a API de rastreamento de interação do novo pacote do planejador . Você pode ler a documentação aqui .

Informações sobre as interações entre o usuário e o aplicativo são fornecidas com descrições (por exemplo, “O usuário clicou no botão Adicionar ao carrinho”) e carimbos de hora. Além disso, ao configurar a análise de interações, são utilizados retornos de chamada nas quais são executadas ações correspondentes a uma ou outra interação.

Em nossa aplicação, há um botão Add Movie To Queueno qual o ícone é exibido +. Serve para adicionar filmes à fila de exibição.


Botão para adicionar um filme à fila de exibição

Aqui está um exemplo de código que monitora as atualizações de status para essa interação do usuário com o aplicativo:

import { unstable_Profiler as Profiler } from "react";
import { render } from "react-dom";
import { unstable_trace as trace } from "scheduler/tracing";

class MyComponent extends Component {
  addMovieButtonClick = event => {
    trace("Add To Movies Queue click", performance.now(), () => {
      this.setState({ itemAddedToQueue: true });
    });
  };
}

Podemos registrar informações sobre essa interação e aprender sobre sua duração entrando em contato com as ferramentas do desenvolvedor do React.


Análise da interação do usuário com um elemento do aplicativo

Usando a API Interaction Tracing, você também pode coletar informações sobre a primeira renderização de componente:

import { unstable_trace as trace } from "scheduler/tracing";

trace("initial render", performance.now(), () => {
   ReactDom.render(<App />, document.getElementById("app"));
});



Análise da primeira renderização do componente

O autor da API fornece outros exemplos de seu uso. Por exemplo, ilustrando o perfil de tarefas assíncronas.

Marionetista


Para a automação do teste da interação do usuário com os elementos do aplicativo, o uso do Puppeteer pode parecer interessante . Esta é uma biblioteca Node.js. que fornece acesso a uma API de alto nível projetada para controlar um navegador Chrome sem uma interface do usuário usando o protocolo DevTools.

Ao usar o Puppeteer, o desenvolvedor recebe métodos auxiliares tracing.start()e é tracing.stop()projetado para coletar indicadores de desempenho do DevTools. Abaixo está um exemplo do uso desses mecanismos para coletar dados sobre o que acontece quando você clica no botão de seu interesse.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const navigationPromise = page.waitForNavigation();
  await page.goto('https://react-movies-queue.glitch.me/')
  await page.setViewport({ width: 1276, height: 689 });
  await navigationPromise;

  const addMovieToQueueBtn = 'li:nth-child(3) > .card > .card__info > div > .button';
  await page.waitForSelector(addMovieToQueueBtn);

  //  ...
  await page.tracing.start({ path: 'profile.json' });
  //   
  await page.click(addMovieToQueueBtn);
  //  
  await page.tracing.stop();

  await browser.close();
})()

Agora, depois de carregar o arquivo profile.jsonna Performancebarra de ferramentas do desenvolvedor, podemos ver quais chamadas de função foram acionadas com o clique de um botão.


Análise das conseqüências de clicar no botão

Se você estiver interessado no tópico de análise de desempenho de componentes - dê uma olhada neste material.

API de tempo do usuário


A API de tempo do usuário permite que o desenvolvedor crie métricas de desempenho personalizadas usando registros de data e hora altamente precisos. O método window.performance.mark()cria um registro de data e hora ao qual o nome está atribuído. O método window.performance.measure()permite descobrir o tempo decorrido entre duas medições.

//     
performance.mark('Movies:updateStart');
//  

//     
performance.mark('Movies:updateEnd');

//        
performance.measure('moviesRender', 'Movies:updateStart', 'Movies:updateEnd');

Ao criar um perfil de um aplicativo React usando a guia PerformanceFerramentas do desenvolvedor do Chrome, você pode encontrar uma seção Timingpreenchida com métricas temporárias sobre os componentes do React. A reação, durante a renderização, pode publicar essas informações usando a API de tempo do usuário.


Guia Desempenho das ferramentas de desenvolvedor do Chrome

Observe que as APIs de tempos do usuário são removidas dos assemblies do React DEV, substituindo-as pela API do React Profiler, que fornece registros de data e hora mais precisos. Talvez, no futuro, o suporte a essa API seja retornado pelos navegadores que suportam a especificação Nível de tempo do usuário 3. 

Na Internet, você pode encontrar sites do React que usam a API de tempo do usuário para determinar suas próprias métricas. Isso inclui, por exemplo, aTime to first post title visiblemétricaReddite a métrica SpotifyTime to playback ready.


Métricas especiais usadas nos sites do React As

métricas criadas pelas ferramentas da API de tempo do usuário são exibidas convenientementeno painel Farol dasferramentas de desenvolvedordoChrome.


Métricas no painel Farol

Por exemplo, as versões mais recentes do Next.js incluem métricas e mecanismos personalizados para medir muitos eventos diferentes. Incluindo o seguinte:

  • Next.js-hydration: tempo necessário para levar a marcação pré-renderizada à condição de trabalho.
  • Next.js-nav-to-render: A hora desde o início da navegação até o início da renderização.

Todas essas medidas são exibidas na área Timings.


Análise das métricas Next.js.

Ferramentas do desenvolvedor e farol


Lembro que o Lighthouse e a PerformanceBarra de ferramentas do desenvolvedor do Chrome podem ser usados ​​para analisar profundamente o processo de carregamento e o desempenho dos aplicativos React. Aqui você pode encontrar métricas que afetam particularmente a percepção das páginas pelos usuários.


Analisando o desempenho da página

Os que trabalham com o React podem gostar do fato de terem novas métricas à sua disposição - como a métrica TBT ( Tempo Total de Bloqueio ), que fornece informações sobre quanto tempo a página permanece no modo não interativo até pode trabalhar com segurança no modo interativo ( Tempo para interativo ). Aqui estão os indicadores TBT ("antes" e "depois") para um aplicativo que emprega o modo competitivo experimental, cuja utilização ajuda o aplicativo a se adaptar às especificidades do ambiente em que está sendo executado.


Modificando o TBT

Essas ferramentas são úteis na análise de gargalos de desempenho do aplicativo, como tarefas que levam muito tempo para serem concluídas, atrasando a transição on-line do aplicativo. Por exemplo, isso pode estar relacionado a uma análise da velocidade de reação do aplicativo para pressionar os botões.


A análise do aplicativo

Lighthouse, além disso, fornece aos desenvolvedores do React muitas dicas específicas sobre muitos problemas. Abaixo está o resultado da análise no Lighthouse 6.0 . Aqui, a seção Remover JavaScript não utilizado é aberta, que reporta o código JavaScript não utilizado carregado no aplicativo, que pode ser importado usandoReact.lazy().


Analisar um aplicativo no Lighthouse

Applications é sempre útil para testar em hardware, o que provavelmente está disponível para seus usuários finais. Costumo confiar nos dados da Webpagetest e RUM e CrUX nesses assuntos, o que me permite obter informações mais completas sobre o desempenho do aplicativo.

Queridos leitores! Como você pesquisa o desempenho de seus aplicativos React?


All Articles