Melhorias nas Principais métricas da Web na página inicial do Mail.ru resultaram em um aumento médio de 10% nas taxas de conversão

Vários meses de trabalho para melhorar as Core Web Vitals na página inicial do Mail.ru resultaram em um aumento de 60% na 75ª percentil no deslocamento cumulativo do layout (CLS, na sigla em inglês), aumentando o tempo médio de sessão em 2,7% e as taxas de conversão das seções principais em mais de 10%.

Denis Stasyev
Denis Stasyev
Sven May
Sven May

Onde começamos

O Mail.ru é um dos principais serviços de e-mail na Internet em russo e está entre os cinco sites mais acessados da Rússia. O Mail.ru é um recurso importante para muitas pessoas. Ele recebe centenas de milhões de visitas por mês e é um portal em que as pessoas podem acessar e-mail, notícias, mídias sociais, pesquisas na Internet e muito mais.

O Mail.ru queria oferecer aos visitantes uma experiência de usuário de alta qualidade. Por isso, começou a trabalhar para melhorar as Core Web Vitals. Antes de discutir nossa estratégia de otimização, é preciso observar alguns detalhes técnicos da página inicial do Mail.ru.

Embora o projeto tenha sido desenvolvido há muito tempo usando nosso mecanismo de modelagem interno Fest, começamos a migrar para o Svelte 3 em 2019.

O Svelte implementa a reatividade de uma forma que não usa o DOM virtual, o que reduz o uso de recursos. A abordagem do Svelte remove funções não utilizadas dos pacotes de produção porque o código que as implementa não é gerado pelo compilador se as funções não forem usadas. O código não utilizado é removido durante a compilação, resultando em pacotes menores. Isso pode ajudar a reduzir o tempo total de bloqueio (TBT) durante a inicialização da página.

Acompanhar métricas de performance

Antes de otimizar as Core Web Vitals, é útil avaliar a performance no campo. Antes dos Core Web Vitals, rastreamos outras métricas, como a First Contentful Paint (FCP), no nosso painel de desempenho interno.

Nosso script de coleta de métricas foi modificado para coletar as Core Web Vitals e transmiti-las ao nosso painel de performance para visualização. De acordo com as recomendações do Google, nosso script usa a API PerformanceObserver para coletar métricas, que fazem parte da plataforma de front-end universal no Mail.ru.

O painel exibiu as seguintes métricas para os usuários (valores médios da semana de 15 a 21 de março de 2021):

Nome do grupo de métricas Core Web Vitals Outras Métricas da Web
Nome da métrica LCP FID CLS First Contentful Paint (FCP) TBT TTI
Porcentagem de usuários de acordo com os limites das Core Web Vitals bom 52% 92% 33% 35% 42% 43%
needs-improvement 19% 5% 23% 38% 16% 25%
ruim 29% 3% 44% 27% 42% 32%
Métricas da semana de 15 a 21 de março de 2021
As Core Web Vitals antes da otimização mostram aproximadamente 1/3 dos usuários no bucket "Ruim".
Valores das Métricas da Web antes das melhorias.

Como melhorar as Core Web Vitals

Embora existam muitas orientações para melhorar as Core Web Vitals, cada projeto tem desafios únicos. Para a página inicial do Mail.ru, as seguintes oportunidades foram identificadas:

Esqueletos para melhoria da CLS

A CLS foi uma das métricas de campo com pior desempenho na página inicial do Mail.ru. O perfil subsequente dessa página no painel Performance do Chrome DevTools revelou que os anúncios eram a origem do problema. Para melhorar a estabilidade do layout, nossa equipe decidiu usar marcadores de posição para reservar espaço para anúncios antes do carregamento.

Ao implementar marcadores de posição, a primeira etapa é determinar as dimensões do conteúdo que vai substituí-los. Felizmente, a versão para computador da página inicial do Mail.ru tem tamanhos de anúncios estritamente documentados. Depois de conversar com a equipe de design, esqueletos de interface animados em SVG foram usados como marcadores de posição, porque eles reduzem o tempo de carregamento percebido do conteúdo.

O retorno do SSR

Para facilitar a transição do Fest para o Svelte, reescrevi o projeto atual de forma incremental em vez de começar de novo. Em março de 2021, migramos a maior parte do front-end para o Svelte e, depois de resolver os problemas de desempenho do back-end, trouxemos o SSR para nosso aplicativo de produção.

Depois de implementar o SSR, a equipe descobriu a causa da regressão do CLS que inicialmente passou despercebida: a seção de notícias não foi inserida no momento da renderização do primeiro conteúdo na página. Houve um atraso entre a pintura inicial da marcação da página fornecida pelo servidor e a inserção da seção de notícias no cliente. Esse comportamento resultou em uma mudança no esqueleto do anúncio, o que piorou a CLS.

Embora as ferramentas do desenvolvedor do Chrome mostrassem eventos de Layout Shift, não conseguimos encontrar o motivo disso no início. Embora o SSR não fosse o problema, ele ajudou a descobrir a solução mais tarde. A correção do código responsável pelo atraso de pintura melhorou a estabilidade do layout do componente de notícias.

O JavaScript ativo mostra apenas uma página vazia na seção de notícias, ocultando os saltos de layout.
Encontrar o problema de pintura de notícias com o JavaScript desativado.
A desativação do JavaScript revelou mudanças de layout que antes estavam ocultas.
Correção do problema de pintura de notícias com o JavaScript desativado.

Outro efeito que o SSR pode ter na CLS é o movimento de componentes antes e depois da hidratação, o que pode levar a mais mudanças de layout. Encontramos esse problema na versão para dispositivos móveis e foi necessário prestar atenção especial ao markup do componente hidratado. Uma boa solução para esse problema foi transferir o máximo possível da lógica de exibição do JavaScript para o CSS quando possível.

Divisão de código e polyfills não usados

Para melhorar a velocidade de carregamento percebida da página, foi necessário trabalhar para diminuir os valores de LCP e FID. Uma maneira de fazer isso é com a divisão de código. Além da página inicial do Mail.ru, nossa equipe está desenvolvendo um widget para navegação no portal. Atualmente, ele está integrado a muitos dos projetos da nossa empresa.

Por motivos históricos, o widget é inserido no início da página como um script de carregamento síncrono. A participação de polyfills nesse script aumentou com o tempo. Para limitar os efeitos negativos de desempenho do carregamento desses polyfills, implementamos a divisão de código para navegadores modernos e legados.

Decidimos não usar o padrão module/nomodule para carregar pacotes JavaScript em navegadores modernos ou legados, porque o atributo type="module" do elemento <script> não era direcionado a navegadores modernos o suficiente para nossas necessidades. Para resolver esse problema, o Mail.ru usa uma ferramenta interna para identificar versões modernas de navegadores no back-end e pode se adaptar a esses navegadores.

Depois que os navegadores puderam ser identificados no back-end, implementamos a divisão de código para navegadores modernos e legados. O resultado foi uma redução de 43,3% no tamanho do widget JavaScript carregado de forma síncrona para navegadores modernos. Essa prática também foi aplicada a alguns outros scripts do portal.

Além da redução do tamanho do pacote e dos efeitos positivos nas Core Web Vitals, a divisão de código também melhora a experiência do desenvolvedor. Apenas 3,5% dos nossos usuários usam navegadores legados, e essa porcentagem está em declínio.Portanto, a implementação da divisão de código permitiu que nossos desenvolvedores usassem as APIs de navegador mais recentes sem introduzir o aumento de tamanho de polyfill necessário para navegadores legados a todos os usuários.

Resultados

Após o esforço de otimização, observamos os valores médios da semana de 24 a 30 de maio de 2021 nos nossos dados de campo:

Nome do grupo de métricas Core Web Vitals Outras Métricas da Web
Nome da métrica LCP FID CLS First Contentful Paint (FCP) TBT TTI
Porcentagem de usuários de acordo com os limites das Core Web Vitals bom 58% (+6%) 93% (+1%) 93% (+60%) 43% (+8%) 49% (+7%) 51% (+8%)
needs-improvement 18% 4% 3% 34% 17% 24%
ruim 24% 3% 4% 23% 34% 25%
Métricas da semana de 24 a 30 de março de 2021
Todas as métricas no bucket bom melhoraram pelo menos 1%. CLS de 60%.
Comparação das Core Web Vitals antes e depois (a mudança no grupo "bom" é mostrada entre parênteses).

Os gráficos abaixo mostram mudanças nos valores das métricas de desempenho da página da Web de acordo com a "Plataforma". Observe as duas datas importantes nos gráficos:

  • 23 de março de 2021: lançamento da iteração com as seções da última página migradas para o Svelte.
  • 19 de abril de 2021: lançamento da iteração com SSR retornado e layout modificado para corrigir regressões de CLS.

A diminuição dos valores de 1 a 10 de maio se deve aos feriados de maio na Rússia.

LCP de março a 1º de junho de 2021 mostrando pequenas melhorias ao longo do tempo.
Gráfico de LCP em "Plataforma": 16 de março a 1º de junho de 2021.
FID de 16 de março a 1º de junho de 2021 mostrando pequenas melhorias em um nível alto.
Gráfico de FID em "Plataforma": 16 de março a 1º de junho de 2021.
CLS de 16 de março a 1º de junho de 2021, mostrando grandes melhorias a partir de 23 de abril.
Gráfico de CLS em "Plataforma": 16 de março a 1º de junho de 2021.

Os resultados obtidos com a opção "Plataforma" estão alinhados com o crescimento dos valores de métrica no Relatório de UX do Chrome (CrUX).

Métrica de LCP do CrUX mostrando aumento de 51% para 58% no bucket &quot;bom&quot;.
Mudança na métrica LCP no CrUX em 2021.
Métrica FID do CrUX mostrando uma ligeira melhora no FID, de 91% para 93% no bucket &quot;bom&quot;.
Mudança na métrica FID no CrUX em 2021.
Métrica CLS no CrUX mostrando melhorias significativas de 46% para 98% no bucket &quot;bom&quot;.
Mudança na métrica CLS no CrUX em 2021.

Uma comparação dos valores médios da duração da sessão do usuário uma semana antes do lançamento das melhorias iniciais e uma semana depois do lançamento mostra um crescimento de 2,7%. Além disso, há um aumento significativo na conversão na maioria das seções da página. Em particular, as conversões para o app de e-mail Mail.ru aumentaram 11,6%, e a conversão da seção de notícias aumentou 13,5%.

181%

Aumento da porcentagem de bom limiar de CLS

2,7%

Duração média da sessão mais alta

13,5%

Aumento da taxa de conversão da seção de notícias

O resultado mais inesperado foi um aumento de 17,4% na taxa de cliques (CTR) do banner de marketing.O tempo de renderização dele foi reduzido significativamente com a introdução de SSR e tags de pré-carregamento.

Depois de analisar o restante das seções da página, notamos uma melhora significativa no desempenho da maioria delas. Mesmo em seções como "Clima" e "Coronavírus", que não são importantes na nossa página, observamos um aumento de 9,6% e 9,5%, respectivamente.

Conclusão

Melhorar a performance é um desafio porque o trabalho envolvido pode ser prolongado. Monitore regularmente as mudanças nas métricas ao longo do tempo e verifique se todos os novos recursos do produto não causam regressões nas Core Web Vitals. Para isso, monitoramos as mudanças nas Core Web Vitals no nosso orçamento de performance.

O mais importante é que enfatizamos a importância das Core Web Vitals para todos os membros da nossa equipe de produtos, de gerentes e designers a testadores e controle de qualidade. Cada membro da equipe precisa conhecer as métricas de performance e ter autonomia para melhorá-las. Também incorporamos os objetivos de otimização de performance aos nossos processos de negócios em uma cadência regular. Oferecer uma experiência do usuário de alta qualidade só é possível com o esforço conjunto de todos os membros da equipe.