<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Melissa de Almeida de Souza - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Melissa de Almeida de Souza - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 19 Jun 2026 05:19:26 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/melissa/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como configurar o monitoramento de usuários e performance em React com o Google Analytics ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Mohammad Iqbal O monitoramento de usuários e a performance de apps é uma parte crucial do desenvolvimento para a web moderno. Talvez você já tenha visto empresas que aumentaram sua renda, simplesmente, ao diminuir o tempo de carregamento de seu app em algumas centenas de milissegundos. Monitorar o ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-configurar-o-monitoramento-de-usuarios-e-performance-em-react-com-o-google-analytics/</link>
                <guid isPermaLink="false">663adff50e369603f905eb97</guid>
                
                    <category>
                        <![CDATA[ Google Analytics ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Melissa de Almeida de Souza ]]>
                </dc:creator>
                <pubDate>Sun, 06 Oct 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/guillaume-fischer--JPCZcxeqzM-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/performance-and-user-tracking-in-react-with-google-analytics/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to set up performance and user tracking in React with Google Analytics</a>
      </p><p>Escrito por: Mohammad Iqbal</p><p>O monitoramento de usuários e a performance de apps é uma parte crucial do desenvolvimento para a web moderno. Talvez você já tenha visto empresas que aumentaram sua renda, simplesmente, ao diminuir o tempo de carregamento de seu app em algumas centenas de milissegundos.</p><p>Monitorar o comportamento de usuários também é crucial. Permitirá modificar e criar seu app de acordo com as preferências de interação dos usuários, resultando em usuários felizes e mais tráfego para o seu site.<br><br>Neste guia, vou dar a você noções fundamentais e completas para o monitoramento de performance e de comportamento dos usuários. Ao fim desse tutorial, você terá tudo o que é necessário para criar configurações complexas de monitoramento de usuários e performance.</p><h2 id="-ndice">Índice</h2><ol><li>Introdução</li><li>Google Analytics</li><li>Monitoramento pelas Page Views (Visualização de Páginas)</li><li>Monitoramento pela performance de carregamento </li><li>Monitoramento pela performance de renderização </li><li>Monitoramento a performance de <em>paint</em></li><li>Monitoramento por rolagem </li><li>Monitoramento por eventos</li><li>Dicas rápidas sobre performance e heurísticas &nbsp;</li></ol><h2 id="introdu-o">Introdução</h2><p>Vou mostrar para você algumas métricas de performance para o desenvolvimento em React e tentarei manter este tutorial conciso. Em uma situação da vida real, porém, <strong>não use a versão do Desenvolvedor</strong>, porque ela contém muitos erros nos códigos de manipulação e não possui tantas otimizações, o que pode levar a resultados altamente distorcidos.</p><p>Por essa razão, é melhor testar na <em>build</em> de produção e, assim, estabelecer algumas métricas na linha de base. </p><p>Por simplicidade, vou me referir ao Google Analytics como "GA".</p><p>O GA não funciona com <em>local host</em>. Então, para ter acesso a uma simulação do que provavelmente será enviado para o GA — sem realmente enviar e acabar por estragar seus <em>analytics </em>— você pode simplesmente substituir o <strong>console.log </strong>em qualquer lugar que você pretenda colocar seus <em>hits</em> do GA.</p><p>&lt;ReactGA&gt; é uma função global e é conhecida como um comando de fila, porque não executa comandos imediatamente. Ela. porém, adiciona comandos a uma fila, e aí, os envia assincronamente. Isso não está conectado com a <em>main thread </em>e o seu <em>tracking code </em>não prejudicará a performance de seu app. &nbsp; </p><p>Um "hit" é quando o <em>GA tracker</em> envia dados para o Google Analytics.</p><p>Vamos focar no tutorial de códigos em React, pois há outros tutoriais muito melhores para aprender a como usar o GA. </p><p>Existem três principais funções usados para enviar <em>hits </em>ao GA. Na verdade, há mais funções. Neste tutorial, contudo, vamos focar apenas em três.</p><p><code>GAReact.pageview()</code>: vai passar por uma <em>string </em>que contém a <em>route</em>. </p><p><code>GAReact.timing()</code>: vai pegar um objeto como parâmetro. E irá conter informações relacionadas às métricas de performance, as quais veremos logo abaixo. Os campos serão <code>category</code>, <code>variable</code>, <code>value</code> e <code>label</code>. Note que apenas a propriedade <code>value</code> virá pelo nosso app, o restante das propriedades serão definidas pelo <em>user</em>.</p><p><code>GAReact.event()</code>: vai pegar um objeto como parâmetro. Ela conterá dados sobre eventos que aocntecem no app (submissões de formulário, cliques etc). Também possuirá campos como <code>category</code>, <code>action</code>, <code>label</code> e <code>value</code>. Note que apenas a propriedade <code>value</code> virá pelo nosso app, o restante das propriedades serão definidas pelo <em>user</em>.</p><p><strong>Testes Sintéticos x RUM</strong></p><p>Você deve estar se perguntando o porquê de fazer tudo isso para a configuração das métricas do Performance Observer, se é possível usar ferramentas como Lighthouse ou Webpage, rodar um teste rápido e coletar essas métricas apenas entrando no URL.</p><p>Ferramentas como essas são importantes, mas elas são conhecidas como "testes sintéticos": o teste será feito em seu dispositivo e não refletirá o que os seus usuários estão experienciando. Você pode tentar limitar a quantidade de dados transmitidos pela CPU ou pela rede quando fizer esses testes. No entanto, eles ainda serão simulações. &nbsp; </p><p> Ao usar o GA com as métricas do <em>Performance Observer</em>, teremos números realistas com usuários finais, dispositivos e redes também reais. Isso é conhecido como RUM ou <em>Real User Monitoring</em> (em português, monitoramento do usuário real).</p><p>Para rodar testes sintéticos em ferramentas, simplesmente, insira o URL do seu app.</p><ul><li><a href="https://www.webpagetest.org/">https://www.webpagetest.org/</a></li><li><a href="https://www.thinkwithgoogle.com/feature/testmysite">https://www.thinkwithgoogle.com/feature/testmysite</a></li><li><a href="https://developers.google.com/speed/pagespeed/insights/">https://developers.google.com/speed/pagespeed/insights/</a></li><li><a href="https://www.uptrends.com/tools/website-speed-test">https://www.uptrends.com/tools/website-speed-test</a></li><li><a href="https://tools.pingdom.com/">https://tools.pingdom.com/</a></li></ul><h2 id="google-analytics"><strong>Google Analytics</strong></h2><p><strong>Configuração</strong></p><p>Se você já tiver a configuração do Google Analytics na sua aplicação, fique à vontade para pular esta seção, pois não há nada de novo aqui. </p><p>Para fazer a configuração do GA, vá até o <em>dashboard </em>e clique na janela de administrador, ao lado. Depois, clique em "<em>add property</em>". Preencha os campos obrigatórios.</p><p>Se está lendo este tutorial, vou entender que você consegue fazer a configuração do Google Analytics usando apenas os passos simples acima. Em caso negativo, use <a href="https://support.google.com/analytics/answer/1042508?hl=en">este guia rápido do Google</a> (em inglês).</p><p>Depois de finalizar a configuração, note que um "<em>tracking ID</em>" aparece no topo da página, Vamos usar isso no nosso React App.</p><h2 id="configura-o-no-react">Configuração no React</h2><p>Não precisamos inventar a roda aqui. Podemos usar uma biblioteca feita pela Mozilla Foundation para nos ajudar com a configuração no React.</p><p>Para instalar a biblioteca, basta rodar este código: <code>npm install react-ga</code></p><p>Depois, para usar o ReactGA, importe-o para qualquer lugar de sua escolha:</p><pre><code class="language-javascript">import ReactGA from 'react-ga';</code></pre><p>Você também precisará inicializar a o componente raíz com o <em>Tracking ID</em> do Google Analytics:</p><pre><code class="language-javascript">...
ReactGA.initialize('UA-00000-1');
...</code></pre><h2 id="observers">Observers</h2><p>O <strong>ReactGA</strong> não faz nada além de enviar dados para o site do Google Analytics. Para fazer com que as métricas de performance sejam enviadas, vamos usar a API "Performance Observer". Essa API não tem nada a ver com o GA nem com o React. É uma API de navegador disponível nos navegadores mais modernos.</p><p>O funcionamento do PerformanceObserver e APIs similares é um tema muito profundo e está fora de escopo deste tutorial. Caso queira ler sobre conteúdos relacionados a esses tópicos, dê uma olhada na seção "Leia mais" para maiores informações e links de tutoriais.</p><p>Em termos gerais, eles "observam" alguma coisa, e aí, enviam esses dados assincronamente, no momento configurado pelo navegador. &nbsp;Isso mantém a <em>thread </em>principal livre para funcionalidades críticas do app e tasks relacionadas, portanto, rastrear eventos não afeta a performance do app.</p><p>Antes dos "Observers", você teria de adicionar uma "escuta de eventos" e dispará-la sincronamente, todas às vezes que alguma coisa acontecesse — isso resultaria em problemas de performance evidentes, caso muitos eventos fossem disparados de uma vez só. &nbsp;Esse é o problema que os "observers" procuram resolver.</p><h2 id="monitoramento-das-page-views-visualiza-o-de-p-ginas-">Monitoramento das Page Views (Visualização de Páginas)</h2><p>Monitorar visualizações de páginas em uma página de app única, como no caso do React, pode parecer complicado. É, porém, relativamente simples, graças ao React-router e ao histórico de bibliotecas. </p><pre><code class="language-javascript">history.listen((location) =&gt; {
    ReactGA.set({ page: location.pathname });
    ReactGA.pageview(location.pathname)
  }
);</code></pre><p>O <code>history.listen()</code> &nbsp;permite que você dispare uma função de <em>callback</em>, nas mudanças de <em>route</em>, que, no nosso caso, são os <em>hits</em> do GA. A <em>route</em> está contida na propriedade <code>pathname</code> de &nbsp;<code>location</code>. Algumas coisas, no entanto, precisam ser observadas.</p><h3 id="lidando-com-o-carregamento-inicial">Lidando com o carregamento inicial</h3><p>O histórico está "escutando" por mudanças de páginas, mas não gera um <em>hit </em>no carregamento inicial da página.</p><p>Existem algumas maneiras de lidar com o carregamento inicial. Eu encontrei um caminho simples para se fazer isso e considero que exija pouquíssimo código e complexidade: eu apenas salve a variável de carregamento inicial na declaração global. Na Home Page, use uma condicional para checar se é falsa. Em caso positivo, configure-a para verdadeira depois do <em>hit</em>.</p><p>Variável de contexto no componente pai:</p><pre><code class="language-javascript">... 

const [initialLoad, setInitialLoad] = useState(false)

...
      &lt;Context.Provider
            //Initial Load
            initialLoadProp: initialLoad,
            setInitialLoadProp: () =&gt; setInitialLoad(true),
       &gt;
      &lt;/Context.Provider&gt;</code></pre><p>Em seguida, o <code>useEffect()</code> na home do componente filho: </p><pre><code class="language-javascript">...   
useEffect(() =&gt; {
    if(!context.initialLoadProp) {
      ReactGA.pageview(props.location.pathname);  
      context.setInitialLoadProp(true)
    }
  }, [])
...</code></pre><p>Há outras implementações e discussões que você encontrará <a href="https://github.com/react-ga/react-ga/wiki/React-Router-v4-withTracker">aqui</a>.</p><h3 id="monitoramento-de-p-ginas-com-user-ids">Monitoramento de páginas com User IDs</h3><p>Uma outra coisa que você talvez queira saber é quantos usuários visitam seus perfis de páginas privadas. O PageViews apenas daria um URL único para cada <em>hit </em>e não funcionaria. </p><p>Por exemplo, suponha que você tenha os seguintes URLs com user IDs:</p><p>user/4543456/messages<br>user/4543456/account<br>user/3543564/messages<br>user/3543564/replytomessage<br>user/3543564/account</p><p>Todos eles dariam um <em>hit </em>único. Um ajuste simples seria apenas checar com uma condicional e remover o ID único. Você também pode usar uma condicional para ter certeza de que não enviará essas páginas para o Google Analytics. Veja:</p><pre><code class="language-javascript">...

 history.listen((location) =&gt; {
   if(location.pathname.includes('/user')) {
     let rootURL = location.pathname.split('/')[1]
     let userPage = location.pathname.split('/')[3]

     let pageHit = `/${rootURL}/${userPage}`
     ReactGA.pageview(pageHit)
   } else {
     ReactGA.set({ page: location.pathname });
     ReactGA.pageview(location.pathname)
   }
});

...</code></pre><p>Estamos simplesmente desmembrando o User ID e concatenando a <em>route</em> de novo, antes de enviar o hit.</p><p>No entanto, isso, provavelmente, não seria verdade para posts em fóruns. Ter um URL único para cada post seria o correto, considerando que você gostaria de saber quantas pessoas acessaram cada post.</p><h2 id="monitoramento-de-performance-de-carregamento">Monitoramento de performance de carregamento</h2><p>Acessar a performance de carregamento é relativamente fácil. Todos os dados de carregamento de performance estão na entrada de <code>navigation</code> e essa, por sua vez, faz parte da <a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API">API navigation timing</a>.</p><p>O Performance Observer pode ser configurado na raiz do componente pai, como mostra o exemplo abaixo:</p><pre><code class="language-javascript">const callback = list =&gt; {
    list.getEntries().forEach(entry =&gt; {
      ReactGA.timing({
        category: "Load Performace",
        variable: "Some metric",  
	value: "Value of Metric"
      })
  })
}

var observer = new PerformanceObserver(callback);
observer.observe({entryTypes: ['navigation'] })</code></pre><p>Primeiro, definimos a função que será chamada para cada <em>entry. </em>Depois, passamos essa função de <em>callback </em>para o nosso <code>PerformanceObserver</code> e, finalmente, chamamos o método <code>.observe()</code> &nbsp;para o nosso observador e passamos para <code>navigation</code> como uma função de <strong>entryType</strong>. </p><p>Assim, nós teremos a seguinte função de <em>entry</em>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-10.png" class="kg-image" alt="image-10" width="593" height="679" loading="lazy"></figure><p>É um volume bem alto de informação, mas precisamos apenas de três propriedades para monitorar<em> </em>a performance de carregamento principal:</p><p><code>requestStart</code>: quando o navegador emite uma solicitação para obter a página da web do servidor;</p><p><code>responsesStart</code>: quando o <strong>primeiro</strong> <em>byte </em>do site chega; </p><p><code>responseEnd</code>: quando o <strong>último</strong> <em>byte </em>do site chega.</p><p>Há algumas coisas que acontecem antes da <code>requestStart</code>, como: a consulta DNS e o <em>handshake</em> TLS<em>. </em>Use esses dados e veja se consegue combiná-los com outras propriedades para fazer novas métricas.</p><p>Com as três propriedades acima, conseguimos criar três métricas importantes. Simplesmente, substitua as propriedades <code>variable</code> e <code>value</code> pelas respectivas métricas.</p><pre><code>const callback = list =&gt; {
    list.getEntries().forEach(entry =&gt; {
      ReactGA.timing({
        category: "Load Performace",
        variable: 'Server Latency',
        value: entry.responseStart - entry.requestStart 
      })
  })
}</code></pre><p>Latência do servidor:<br><code>entry.responseStart - entry.requestStart</code></p><p>Tempo de download:<br><code>entry.responseEnd - entry.responseStart</code></p><p>Tempo total de carregamento do app:<br><code>entry.responseEnd - entry.requestStart</code></p><p><strong>Tempo para interatividade</strong><br>Basicamente, essa métrica considera o tempo que usuários levam para interagir com o seu site.</p><p>Até que uma métrica do tipo <em>native TTI </em>esteja disponível pela API do navegador, podemos usar esse módulo de <em>polyfill do npm</em>. Esse módulo foi criado pelo Google.</p><p><code>npm install tti-polyfill</code></p><p>Depois, conseguimos usar o <code>polyfill</code> como no exemplo abaixo: </p><pre><code class="language-javascript">... 

import ttiPolyfill from 'tti-polyfill';


ttiPolyfill.getFirstConsistentlyInteractive().then((tti) =&gt; {
  ReactGA.timing({
    category: "Load Performace",
    variable: 'Time to Interactive',
    value: tti 
  })
});

...</code></pre><p>Estamos, simplesmente, enviando um <em>hit </em>dentro da nossa função encadeada com a declaração <code>.then()</code>, visto que vamos obter os dados dessa métrica assincronamente.</p><h2 id="monitorando-a-performance-de-renderiza-o"><strong>Monitorando a performance de renderização</strong></h2><p>Agora, conseguiremos nos aprofundar na performance de renderização: o tempo que o React leva para construir a árvore de nós do DOM. Podemos monitorar a performance de renderização com as entradas <code>mark</code> e <code>measure</code>.</p><p><code>mark</code> é usado para marcar o ponto no tempo que você queira monitorar. Apenas passe-o em uma <em>string </em>como o nome da marca na linha exata onde você deseja marcar para rastreamento. </p><pre><code class="language-javascript">performance.mark("nome da marca")</code></pre><p><code>measure</code> é a diferença entre as duas marcas. Apenas configure no nome da <code>measure</code> e passe nas marcas de começo e fim; isso trará a diferença entre marcas, em milissegundos.</p><pre><code class="language-javascript">performance.measure.("name of mark", startingMark, EndingMark)</code></pre><p>Felizmente, o React vem com marcas e métricas pré-compiladas, o que nos poupa de ter que abrir o React Source e nós mesmos escrevê-los. Apenas, mude a <code>mark</code> e a <code>measure</code> para "entry types" e pronto!</p><pre><code class="language-javascript">...

var observer = new PerformanceObserver(callback);
observer.observe({entryTypes: ['mark', 'measure'] })

...</code></pre><p>Isso vai dar a você o tempo que as raízes dos componentes "pai" e todos os componentes "filhos" levam para renderizar em milissegundos. Você terá entradas que se parecem com estas:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-14.png" class="kg-image" alt="image-14" width="578" height="354" loading="lazy"></figure><p>Você também terá o tempo de execução dos métodos de ciclo de vida. Há uma riqueza de informações aqui, escolha apenas a que você quer rastrear e a envie para a GA; para isso, procure pelo nome em uma declaração condicional. </p><pre><code class="language-javascript">...
const callback = list =&gt; {
    list.getEntries().forEach(entry =&gt; {
      if(entry.name.includes('App') ) {
        ReactGA.timing({
          category: "App Render Performace",
          variable: entry.name,
          value: entry.duration
        })
      }
  })
}
...</code></pre><h2 id="monitorando-a-performance-de-paint"><strong>Monitorando a performance de <em>paint</em></strong></h2><p>Agora, podemos rastrear o <em>paint</em>; o momento que os pixels são desenhados (ou "pintados") na tela, depois que a árvore do DOM é renderizada. </p><p>O rastreamento de "<em>Paint Performance</em>" inclui três métricas: <em>First Paint</em> (FP), <em>First Contentful Paint</em> (FCP) e <em>First Meaningful Paint</em> (FMP).</p><p><strong><strong>First Paint</strong></strong>: primeira vez que qualquer coisa ao lado de uma página branca é apresentada na tela.</p><p><strong><strong>First Contentful Paint:</strong></strong> quando o primeiro elemento do DOM está presente. Texto, imagem etc.</p><p><strong>First Paint</strong> e <strong>First Contentful Paint</strong> serão dados automaticamente pela API. Apenas, faça o seguinte:</p><pre><code>...

const callback = list =&gt; {
    list.getEntries().forEach(entry =&gt; {
       ReactGA.timing({
          category: "Paint",
          variable: entry.name,
          value: entry.startTime
     })
  })
}

var observer = new PerformanceObserver(callback);
observer.observe({entryTypes: ['paint'] })</code></pre><p>As entradas serão similares a estas: </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-15.png" class="kg-image" alt="image-15" width="560" height="323" loading="lazy"></figure><p>É completamente possível que as métricas sejam exatamente as mesmas, por conta dos milissegundos. Ainda que não sejam as mesmas, é provável que haja uma diferença irrelevante entre elas. Em razão disso, há uma outra métrica mais usada, chamada:</p><p><strong><strong>First Meaningful Paint</strong></strong>: quando alguma coisa "significativa" é pintada na tela. "Significativa" é escrito aqui com aspas, pois esse termo é intencionalmente considerado vago, o que permite a pessoa desenvolvedora decidir o que ela deseja testar.</p><p>De acordo com o Google, o <strong>First Paint</strong> e o <strong>First Contentful Paint </strong>respondem a questão "Está acontecendo?" e o <strong>First Meaningful Paint </strong>responde a pergunta "Isso é útil?". Já questão "Isso é usável?" é respondida pelo "<strong>Tempo para interatividade</strong>".</p><p>É comum usar o <strong>First Meaningful Paint </strong>para testar o elemento "Hero", que, por sua vez, é o elemento principal da página.</p><p>Um exemplo disso, no YouTube, seria o <em>player</em> do vídeo. Vídeos e comentários sugeridos seriam elementos secundários, não <em>heroes</em>. Monitorar quando o reprodutor de vídeo acaba de "pintar", seria o <em>First Meaningful Paint</em>, nesse caso.</p><p>Um elemento <em>hero </em>comum em <em>homepages</em> é a imagem de plano de fundo, próximo ao <em>header</em>, o que constitui a proposta de valor ou o tema do site. Sabendo disso, podemos usar o recurso de tempo da API para metrificar o momento que a imagem acaba de carregar e fazemos da <em>First Meaningful Paint</em> (FMP), a nossa métrica.</p><p>Se o seu elemento <em>hero </em>é uma imagem, você pode apenas considerar o recurso de tempo da API e a propriedade <code>responseEnd</code> como seu FMP.</p><pre><code class="language-javascript">...
const callback = list =&gt; {
    list.getEntries().forEach(entry =&gt; {
        ReactGA.timing({
          category: "First Meaningful Paint",
          variable: entry.name,
          value: entry.responseEnd
        })
  })
}

var observer = new PerformanceObserver(callback);
observer.observe({entryTypes: ['resource'] })
...</code></pre><p>Recurso inteiro do <em>timing</em> de resposta: </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-16.png" class="kg-image" alt="image-16" width="542" height="527" loading="lazy"></figure><p>Dado que, tecnicamente, a imagem carregada <strong>não </strong>significa que está pintada, você também pode tentar configurar as marcas, manualmente.</p><pre><code>//jsx 

{performance.mark('start') 
&lt;img /&gt;
{performance.mark('end')
{performance.measure('diff', 'start', 'end')
</code></pre><p>De novo: há muitas possibilidades nessa métrica, realmente considere o seu contexto e o que você está tentando metrificar.</p><h3 id="monitoramento-de-rolagem">Monitoramento de rolagem</h3><p>Rastrear a posição de rolagem de seus usuários é uma métrica realmente muito importante de <em>analytics</em>. Você pode, por exemplo, ver quantos usuários passaram rapidamente uma certa imagem ou seção do texto. Tendo essa informação, você pode dar uma mexida no seu conteúdo e aumentar conversões.</p><p>Você já deve ter visto implementações antigas que usam <strong><strong>getBoundingClientRect()</strong></strong>, mas isso bloquearia a <em>thread </em>principal e, então, o monitoramento de rolagem diminuiria a performance. Você pode executar os eventos de rolagem assincronamente com o <code>IntersectionObserver</code>.</p><p>O <code>IntersectionObserver</code> necessita de dois argumentos, uma função de <em>callback</em> e um objeto de opções. O objeto de opções terá três propriedades: </p><p><code>root</code>: &nbsp;é o elemento em que você está tentando testar a intersecção. Na maioria dos caso, esse será o <em>viewport</em>, que será o valor de <code>null</code>. </p><p><code>rootMargin</code>: são as margens ao redor do elemento raiz. Exemplo: "10px"</p><p><code>threshold</code>: quanto do elemento é visível antes que a propriedade <code>isIntersecting</code> é verdadeira. Exemplo: 0.5 significa que <code>isIntersecting</code> é verdadeira, quando 50% do elemento é visível. "Zero" significa o topo do elemento e 1.0 significa o elemento inteiro.</p><p>A entrada retornará um objeto como este:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/09/image-17.png" class="kg-image" alt="image-17" width="558" height="301" loading="lazy"></figure><p><code>isIntersecting</code>: essencialmente, usado para determinar se o elemento é visível, o que seria verdadeiro, quando o limite é alcançado. Vamos ao código:</p><pre><code class="language-javascript">//Get the element you want to track with useRef
const intersectTarget = useRef(null)

//Use the observer inside the component you want to track scroll
  useEffect(() =&gt; {
    const opts = {
            root: null,
            rootMargin: '0px',
            threshold: 0
    }
    const callback = list =&gt; {
      list.forEach(entry =&gt; {
        if(entry.isIntersecting) {
            ReactGA.event({
              category: 'Scroll',
              action: 'Scrolled to heading 2',
              value: entry.intersectionRatio
            })
          }
       })
    }
    const observerScroll = new IntersectionObserver(callback, opts)

    observerScroll.observe(intersectTarget.current)
  }, [])

//jsx
  &lt;h1 ref={intersectTarget}
      id="heading2"
		&gt;
     Second Heading
  &lt;/h1&gt;</code></pre><p>A principal ideia aqui, é inicializar o <em>hook</em> <code>useRef</code> . Depois, usamos a <em>ref </em>no elemento do qual você quer monitorar a rolagem. A função de <em>callback </em>e a <em>observer </em>serão chamadas pelo <em>hook</em> <code>useEffect</code> . Enquanto que o elemento será passado para o método <code>.observe()</code> com o nome da <em>ref </em>e a propriedade <code>.current</code>.</p><blockquote><strong>Observação 1:</strong> a intersecção do "observer" será acionada na página de carregamento inicial, mesmo que o elemento não esteja visível. Isso é normal, você também verá que a propriedade <code>isIntersecting</code> é falsa.</blockquote><p><strong>Observação 2: </strong>nesse momento do código, também há a propriedade <code>isVisible</code> na entrada, mas ela não funciona como o nome sugere. Ela se mantém falsa, ainda que o elemento esteja visível. Não há documentações sobre isso, então não consigo comentar sobre o seu propósito. Recomendo substituir pela propriedade <code>isIntersecting</code>.</p><h2 id="monitoramento-de-eventos"><strong>Monitoramento de eventos</strong></h2><p>A ideia básica do monitoramento de eventos é enviar <em>hits </em>para o GA, dentro da função de <em>callback</em>, anexados a um manipulador de eventos. Realmente, não há muito o que fazer além disso. </p><p>Um ponto a considerar é se o seu usuário está enviando um formulário, você consegue especificar com a propriedade <code>transport: beacon</code> &nbsp;no <em>hit </em>do evento, o qual vai deixar você enviar o <em>hit</em>, mesmo que a página seja recarregada para uma outra página. Isso não é considerado um grande problema, em uma página de app única como o React, mas, se você quisesse fazer isso, saiba que essa opção está disponível. </p><p>Consulte o <a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon">sendBeacon</a> do navegador para ver mais informações. </p><p>Vou mostrar como monitorar envios de formulário. Este padrão funciona, basicamente, com qualquer evento, Novamente, você está apenas enviando o <em>hit </em>em uma função anexada a um manipulador de eventos. </p><pre><code class="language-javascript"> ...
  const handleSubmit = (event) =&gt; {
    event.preventDefault();
    ReactGA.event({
     category: 'Form',
     action: 'Form Submit',
     transport: 'beacon'
   });
    apiCall('/apicall', event.target.value)
  };
  
  ...
  
  &lt;form onSubmit={handleSubmit}&gt;
  ...
  &lt;/form&gt;
  
  ...</code></pre><h3 id="dicas-r-pidas-sobre-performance-e-heur-sticas">Dicas rápidas sobre performance e heurísticas</h3><p>A maior área de melhoria para desenvolvedores, que eu vejo, é programar do zero ao invés de usar bibliotecas. &nbsp;O "Tree Shaking" reduz um pouco o excesso de código, mas ainda há um "inchaço" considerável quando comparado a códigos feitos por você. Isso vai permitir que você escreva apenas os códigos que necessita. Tente o usar o mínimo de bibliotecas possível. Ao invés de usar bibliotecas para algumas poucas funções, consulte só o código-fonte da biblioteca e tente, você mesmo, implementar essas funções. Além disso, mantenha em mente que a maioria das bibliotecas têm de priorizar facilidade de uso e personalização, em detrimento da performance.</p><p>Mais algumas dicas:</p><ul><li>Para acionar eventos como rolagem, você definitivamente precisará desacoplar. Não é necessário fazer isso para <em>observers</em>.</li><li>Apenas importe funções e variáveis que você usará e deixe que o "Tree Shaking" descarte códigos que não foram usados.</li><li>Não passe funções anônimas para eventos.</li><li>Transforme seu app em React em uma PWA. Assim, os usuários conseguirão baixar e instalar o seu app, localmente, em seus aparelhos.</li><li>Reduza os "<em>payloads</em>" com "<em>code splitting</em>" e "<em>lazy loading</em>".</li><li>Diminua o tamanho do arquivo usando "gzip" ou compressões similares.</li><li>Sirva imagens a partir de um CDN.</li><li>Habilite o cache por meio do título "http" nas respostas do servidor.</li><li>Otimize imagens. Confira o guia de fundamentos do Google para saber como fazer isso.</li><li>Use o novo <em>layout</em> do CSS Flexbox. Evite o <a href="https://web.dev/articles/avoid-large-complex-layouts-and-layout-thrashing?hl=pt-br"><em>Layout Thrashing</em></a>.</li><li>Use somente transformadores e opacidade para mudanças de CSS. Ou seja, ao invés de alterar altura e largura, use a escala X e a escala Y.</li></ul><p>Felizmente, muitas dessas otimizações, como minificação e "gzip", são realizadas automaticamente, quando o comando "npm build" é executado em um projeto do React.</p><p>Agradeço a leitura! 😀</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
