Como usar o novo recurso experimental do Profiler no React

Então o React 16.4.0 foi lançado! (Note tradutor - esse recurso foi adicionado na versão 16.4.0, e este post foi escrito). E, nesses momentos, você entende como você é o JavaScript - um geek se você seguir pequenas atualizações da sua estrutura favorita. Ótimo!



Se você ler as notas de versão da versão 16.4 publicadas pela equipe do React, essa atualização deve ter sido considerada um pouco chata. Os eventos de ponteiro parecem atraentes, mas, para ser sincero, já ouvi falar pouco sobre eles antes.

Além disso, há uma correção de getDerivedStateFromProps para um tipo de novo método getDerivedStateFromProps (agora ele será chamado em todas as renderizações). Ainda não usei o suficiente, portanto, para mim, essa atualização não foi muito importante.

Então eu vi o anúncio, enterrado sob os títulos, de que eles haviam adicionado um novo componente experimental, unstable_Profiler . Vendo que minha vida agora é bastante instável ( unstable_ ), decidi ler o RFC e experimentá-lo.

TLDR


As pessoas da equipe React estão tentando tornar a renderização assíncrona . Isso pode dificultar a determinação de quando renderizar componentes ao montar / atualizar. Portanto, eles estão brincando com esse novo e brilhante componente Profiler .

Então, o que você pode usar hoje?

Portanto, se você é um profissional no acompanhamento do desempenho de seus aplicativos de reação, essa será definitivamente outra boa ferramenta em seu arsenal. Se isso não é sobre você, não é mais possível ler e voltar a criar aplicativos interessantes.

Usando <Profiler />


Aviso : talvez você não deva usar isso na produção (bem, na verdade, isso é unstable_ ). Mais tarde, eles concluirão a capacidade de criar perfil e código de produção.

Basicamente, o Profiler é um componente que pode ser extraído do pacote React padrão. Como ele tem um nome sublinhado cauteloso que muitos linters juram, você pode contornar isso da seguinte maneira:

 import React, { unstable_Profiler as Profiler } from 'react'; ... const Profiler = React.unstable_Profiler; 

Agora que você possui o Profiler , vamos criar um perfil dos componentes! Você pode agrupar qualquer parte da sua árvore JSX no Profiler para ver o que acontece com ela. Profiler aceita a função onRender , que captura informações sobre o tempo de renderização. Aqui está um exemplo simples de contador :

 import React, { unstable_Profiler as Profiler } from 'react'; class ComponentWithProfiling extends React.Component { state = { count: 0 }; logProfile = (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}`); }; go = direction => () => this.setState(({ count }) => ({ count: direction === "up" ? count + 1 : count - 1 })); render() { return ( <Profiler id="app" onRender={this.logProfile}> <button onClick={this.go("up")}></button> <div>The count is {this.state.count}</div> <button onClick={this.go("down")}></button> </Profiler> ); } } 

Observe que você deve fornecer um id cada fragmento em seu onRender você pode ver abaixo, o onRender aceita onRender métricas interessantes:


7jroojkv30.codesandbox.io

Primeiro, você pode ver qual foi a fase de renderização ( mount ou update ), que pode ser usada para identificar partes do código que são atualizadas inesperadamente (assim como o excelente pacote por que você atualizou que usei muitas vezes e recomendo).

Em seguida, obtemos actualTime e baseTime . Eles estão relacionados ao tempo real que o React gasta na renderização de cálculos; isto é descobrir o que mudou. Observe que o tempo real (hora inicial) da conexão inicial (montagem) é maior que o tempo de atualização (atualização). Isso ocorre porque, na conexão inicial, tecnicamente tudo é "novo". Durante a atualização, os cálculos devem ser mais simples, porque, espero, os componentes na árvore serão atualizados apenas se realmente tiverem sido alterados (ou seja, quando os valores de prop / states forem alterados).

Em aplicativos grandes / do mundo real, esses dados permitem que você entenda onde o shouldComponentUpdate usado incorretamente ou não, lugares onde objetos com tipos de referência geralmente mudam ou novos objetos são enviados ou apenas lugares onde você não esperava que as atualizações demorassem tanto.

Os últimos valores que obtemos no onRender são commitTime e commitTime . Esses são, de fato, registros de data e hora desde o lançamento inicial. startTime é a hora a partir da qual o componente selecionado começou a executar cálculos para renderização, enquanto commitTime é a hora em que o React realmente commitTime essas alterações durante a renderização.

Se você rastrear outros eventos com registro de data e hora (como cliques ou pressionamentos de teclas), essas métricas poderão ajudar a identificar deltas entre quando os eventos do usuário ocorrem e quando a renderização real ocorre. Se a diferença for grande, esse atraso pode ser palpável para os usuários e deve ser cuidadosamente examinado.

Conclusão


Para mim, pessoalmente, essa ferramenta ainda não é muito útil. Mas é bom saber disso, porque se eu encontrar esses gargalos de desempenho, seria uma boa maneira de medi-los.

É importante primeiro avaliar seus problemas de desempenho; assim, quando você fizer "melhorias", poderá dizer se isso realmente melhora a situação ou apenas piora. Descobri que otimizar o desempenho é uma daquelas coisas nas quais você pode gastar muito tempo. Portanto, antes de otimizar algo., Verifique se é realmente necessário.

Estou ansioso pelo que a equipe do React fará com o Profiler no futuro. Obrigado @bvaughn por adicionar este recurso bacana !

Do tradutor:
No momento (versão atual 16.6.0), o Profiler não funciona com a renderização do servidor. A solicitação de recurso já existe.

Source: https://habr.com/ru/post/pt428998/


All Articles