Evite um DOM com um tamanho grande demais

Uma árvore do DOM grande pode diminuir a velocidade da performance da página de várias maneiras:

  • Eficiência da rede e desempenho de carga

    Uma árvore DOM grande geralmente inclui muitos nós que não ficam visíveis quando o usuário carrega a página pela primeira vez, o que aumenta desnecessariamente os custos de dados para os usuários e diminui o tempo de carregamento.

  • Desempenho do ambiente de execução

    À medida que os usuários e scripts interagem com sua página, o navegador precisa recalcular constantemente a posição e o estilo dos nós. Uma árvore do DOM grande combinada com regras de estilo complicadas pode reduzir muito a velocidade de renderização e interatividade.

  • Desempenho da memória

    Se o JavaScript usar seletores de consulta gerais, como document.querySelectorAll('li'), você pode estar armazenando referências a um grande número de nós sem saber, o que pode sobrecarregar a memória dos dispositivos dos usuários.

Como a auditoria de tamanho do DOM do Lighthouse falha

O Lighthouse informa o total de elementos DOM de uma página, a profundidade máxima do DOM da página e o número máximo de elementos filhos:

Evita um tamanho excessivo do DOM. O Lighthouse mostra o total de elementos do DOM, a profundidade máxima do DOM e o número máximo de elementos filhos.
O Lighthouse destaca detalhes sobre o tamanho excessivo do DOM

O Lighthouse sinaliza páginas com árvores DOM que:

  • Avisa quando o elemento body tem mais de 800 nós.
  • Ocorrem erros quando o elemento body tem mais de 1.400 nós.

Como otimizar o tamanho do DOM

Em geral, crie nós de DOM somente quando necessário e elimine-os quando não forem mais necessários.

Se você estiver enviando uma árvore do DOM grande, tente carregar a página e anotar manualmente quais nós são mostrados. Talvez você possa remover os nós não mostrados do documento carregado inicialmente e só criá-los após uma interação relevante do usuário, como uma rolagem ou um clique em um botão.

Se você criar nós DOM durante a execução, os pontos de interrupção de mudança do DOM de modificação de subárvore podem ajudar a identificar quando os nós são criados.

Se não for possível evitar uma árvore do DOM grande, outra abordagem para melhorar a performance de renderização é simplificar os seletores de CSS. Consulte Reduzir o escopo e a complexidade dos cálculos de estilo do Google para mais informações.

Para mais detalhes, consulte o artigo Como tamanhos grandes do DOM afetam a interatividade e o que você pode fazer a respeito.

Orientações específicas para a pilha

Angular

Se você estiver renderizando listas grandes, use a rolagem virtual com o Component Dev Kit (CDK).

Reação

  • Use uma biblioteca "em janelas", como react-window, para minimizar o número de nós DOM criados se você estiver renderizando muitos elementos repetidos na página.
  • Reduza novas renderizações desnecessárias usando shouldComponentUpdate, PureComponent ou React.memo.
  • Pule efeitos somente até que algumas dependências tenham sido mudadas se você estiver usando o hook Effect para melhorar o desempenho durante a execução.

Recursos