Browser Internals

Browsers & Rendering

Um navegador transforma HTML, CSS e JavaScript em pixels. Compreender o parsing, o DOM, o caminho crítico de renderização (critical rendering path) e os reflows torna a performance muito menos misteriosa.

intermediate15 min readUpdated 15 de set. de 2026
index.html
html
<!-- index.html -->
<link rel="preload" href="/fonts/inter.woff2"
      as="font" type="font/woff2" crossorigin />
<link rel="stylesheet" href="/styles.css" />
<script src="/app.js" defer></script>
Engines
Blink, Gecko, WebKit
Parsing
HTML para DOM
Styles
CSS para CSSOM
Layout
Geometria e posição
Paint
Pixels para layers
Thread
Main thread executa JS

Por que importa

Por que os internals do navegador importam

Um runtime, não um documento

O navegador é um ambiente de execução com um DOM, APIs, storage, networking e uma engine de JavaScript.

O caminho crítico

HTML, CSS e JavaScript bloqueante decidem quando os primeiros pixels podem aparecer.

Layout é caro

Recalcular a geometria força o navegador a refazer o trabalho, e é por isso que agrupar mudanças no DOM é importante.

O panorama completo

As três etapas da renderização

Faça o parse da marcação, organize o layout das boxes, então pinte e componha os pixels.

Parse

Construir a árvore

HTML torna-se o DOM, CSS torna-se o CSSOM e, juntos, eles formam a render tree.

Layout

Posicionar

O navegador calcula o tamanho e a posição de cada box.

Paint

Desenhar

As boxes são pintadas em layers e compostas no frame final.

Renderização em resumo

Os conceitos fundamentais

Parsing de HTML

O parser constrói o DOM enquanto processa o stream do documento.

CSSOM

As folhas de estilo são processadas em uma árvore de regras e estilos computados.

Render tree

Apenas elementos visíveis com estilos entram na render tree.

Layout

Também chamado de reflow — a computação da geometria de cada box.

Paint e composite

Preenchimento de pixels e combinação de layers na GPU.

A main thread

JavaScript, layout e paint compartilham a mesma thread, então tarefas longas travam tudo.

Uma breve historia

De engines únicas a uma plataforma compartilhada

  1. 1993

    Mosaic

    O primeiro navegador gráfico amplamente utilizado traz imagens para a web.

    93
  2. 1995

    JavaScript

    O scripting transforma documentos estáticos em aplicações.

    95
  3. 2008

    Chrome e V8

    Uma engine rápida e arquitetura multi-processo resetam as expectativas de performance.

    08
  4. 2013

    Blink

    O Chrome faz um fork do WebKit, e o Blink torna-se a engine dominante.

    13
  5. Hoje

    Uma plataforma de padrões

    As engines convergem para padrões web, e os navegadores tornam-se o runtime universal de apps.

    Hoje

O guia completo

Browsers & Rendering: Tudo que voce precisa saber

O que um navegador realmente faz?

Um navegador é um ambiente de execução, não apenas um visualizador de documentos. Ele analisa HTML e CSS transformando-os em árvores, executa JavaScript, expõe APIs para rede e armazenamento e renderiza o resultado em pixels. Compreender esse pipeline transforma a performance de mera adivinhação em engenharia.

Os fornecedores de navegadores entregam três engines principais: Blink (Chrome, Edge, Opera), Gecko (Firefox) e WebKit (Safari). Elas implementam os mesmos padrões, portanto, os conceitos aqui aplicam-se a todos, mesmo quando os detalhes diferem.

Analisando HTML no DOM

Quando o navegador recebe o HTML, ele o analisa (faz o parsing) para transformá-lo no DOM: uma árvore de objetos que representa cada elemento, atributo e trecho de texto. O parser funciona via streaming, portanto, ele pode começar a construir a árvore antes mesmo que todo o documento chegue.

O parsing de HTML é resiliente por design. Uma tag de fechamento ausente ou um elemento mal posicionado não interrompem a página; o parser se recupera e continua o processamento. É por isso que marcações malformadas ainda são renderizadas, e por que validar seu HTML é fundamental para garantir a previsibilidade.

CSS e o CSSOM

As folhas de estilo são analisadas e transformadas no CSSOM, uma árvore de regras. O navegador então calcula o estilo final de cada elemento combinando a cascata, a herança e a especificidade.

O CSS é render-blocking: o navegador não fará a pintura (paint) até ter os estilos necessários, pois pintar com os estilos errados causaria um flash visual. É por isso que uma folha de estilo grande no head atrasa a primeira pintura, e por que fazer o inlining de CSS crítico ajuda.

A render tree

O DOM e o CSSOM se combinam na render tree, que contém apenas os elementos que serão efetivamente exibidos, cada um com seus estilos computados. Elementos com display: none são excluídos; elementos visibility: hidden são incluídos, mas não são pintados.

A partir daqui, o navegador sabe o que desenhar, mas ainda não sabe onde.

Layout

Layout, também chamado de reflow, calcula o tamanho e a posição de cada box na render tree. Ele percorre a árvore, resolvendo larguras, alturas, margens, padding e posicionamento, produzindo um box model com geometria exata.

O Layout é custoso porque as alterações podem cascatear: redimensionar um elemento pode mover seus siblings, seu pai e tudo o que estiver abaixo. Ler propriedades como offsetHeight força o navegador a garantir que o layout esteja atualizado, portanto, intercalar leituras e escritas dispara layouts repetidamente.

Pintura e composição

Após o layout, o navegador pinta (paint) as caixas em camadas, preenchendo cores, textos, imagens, bordas e sombras. Em seguida, ele compõe (composite) essas camadas, geralmente na GPU, para gerar o frame final.

Algumas alterações são mais “baratas” que outras:

  • Alterar uma cor dispara a pintura (paint).
  • Alterar um tamanho dispara o layout e a pintura.
  • Alterar transform ou opacity pode ser processado pelo compositor, pulando completamente as etapas de layout e pintura.

É por isso que animações devem se limitar a transforms e opacity. Consulte o guia de CSS Animations e o guia de Web Performance.

O caminho de renderização crítica (critical rendering path)

O caminho do HTML até os primeiros pixels é:

  1. Parse do HTML para o DOM.
  2. Parse do CSS para o CSSOM.
  3. Combinação de ambos na render tree.
  4. Layout das boxes.
  5. Paint e composite do frame.

Encurtar esse caminho é a essência da performance percebida: menos recursos bloqueantes, CSS menor e JavaScript que não atrapalhe o processo.

<!-- fast.html -->
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin />
<style>/* critical, above-the-fold CSS */</style>
<script src="/app.js" defer></script>

preload inicia requisições importantes precocemente, CSS crítico inlined evita um round trip bloqueante, e defer permite que o parser termine antes que o script seja executado.

A thread principal e JavaScript

A thread principal executa JavaScript, layout, paint e o tratamento de eventos. Apenas uma coisa acontece por vez, portanto, uma tarefa longa bloqueia a entrada de dados e faz com que a página pareça travada.

  • Mantenha as tarefas curtas e fragmente trabalhos pesados.
  • Mova computações intensas para um Web Worker, que roda em uma thread separada.
  • Evite o layout thrashing agrupando leituras e escritas no DOM.
  • Ceda o controle ao navegador entre blocos de trabalho.

Este é o mesmo event loop que você conheceu no guia de JavaScript, agora com o trabalho de renderização competindo pela mesma thread.

Storage e APIs do navegador

Além da renderização, o navegador fornece APIs de plataforma e armazenamento: cookies, localStorage e sessionStorage, IndexedDB, a Cache API, service workers, WebSockets, WebRTC, Clipboard, Notifications e mais. É isso que permite que uma página web se comporte como um aplicativo. O guia de PWA aborda service workers e cache.

Melhores práticas

  • Mantenha o caminho crítico curto: utilize CSS crítico inline e adie a execução de scripts.
  • Use preload para fontes e outros assets críticos para a renderização.
  • Anime transform e opacity, e não propriedades de layout.
  • Agrupe leituras e escritas no DOM para evitar o layout thrashing.
  • Mantenha as tarefas de JavaScript curtas; use Web Workers para processamentos pesados.
  • Reserve espaço para imagens e embeds para evitar o layout shift.
  • Teste em múltiplos engines, especialmente Safari e dispositivos móveis.

Erros comuns

  • Assumir que o DOM é a fonte do HTML.
  • Bloquear a renderização com stylesheets volumosos ou scripts síncronos.
  • Ler propriedades de layout dentro de um loop, forçando reflows repetidos.
  • Animar width ou top e causar jank.
  • Executar computações pesadas na main thread.
  • Testar em apenas um navegador e ignorar as diferenças entre engines.

Próximos passos

O funcionamento interno do navegador explica por que as dicas de performance funcionam. Coloque isso em prática com o guia de Web Performance, crie animações eficientes com CSS Animations e manipule a árvore de forma segura com DOM Manipulation. Depois, abra o DevTools e observe o pipeline de renderização no painel de performance.

Carregamento de scripts

Um script clássico no head bloqueia o parsing. O defer baixa em paralelo e executa após o documento ser processado.

Preferir
<head>
  <link rel="stylesheet" href="/styles.css" />
  <script src="/app.js" defer></script>
</head>
Evitar
<head>
  <script src="/app.js"></script>
  <!-- parser blocks until
       it downloads and runs -->
</head>

Atualizando o DOM

Agrupe leituras e escritas. Intercalá-las força o navegador a recalcular o layout repetidamente.

Preferir
// read all, then write all
const height = el.offsetHeight;
const width = el.offsetWidth;

el.style.height = height + "px";
el.style.width = width + "px";
Evitar
// forces layout on every line
el.style.height = el.offsetHeight + "px";
el.style.width = el.offsetWidth + "px";

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender Browsers & Rendering?

Nosso tutorial interativo te guia por Browsers & Rendering passo a passo — com quizzes e codigo real que voce pode executar no navegador.