DO TEXTO À ESTRUTURA
O HTML chega como caracteres; o parser produz e conecta nós.
Depois de receber e decodificar os bytes da resposta, o navegador entrega um fluxo de caracteres ao parser HTML. O tokenizer reconhece construções como tag inicial, tag final, comentário e texto. O tree builder interpreta esses tokens segundo as regras do HTML e modifica progressivamente um objeto Document.
Laboratório visual · Construindo a árvore DOM
Avance pelo documento e observe quais linhas originam elementos, textos e atributos.
Documento e raiz: o parser cria o Document, registra o doctype e insere o elemento html. O atributo lang pertence ao elemento; ele não se torna um filho separado.
- Bytes são decodificados. O charset determina como os bytes viram caracteres. Em HTML moderno, declare
<meta charset="UTF-8">cedo no documento. - O tokenizer reconhece unidades sintáticas.
<main>gera um token de tag inicial; “Livros” gera caracteres;</main>gera uma tag final. - O tree builder mantém contexto. Uma pilha de elementos abertos ajuda a decidir de quem cada novo nó será filho.
- A árvore cresce durante o download. O navegador não precisa esperar o último byte para começar a interpretar, descobrir recursos e preparar uma primeira renderização.
O HTML É SÓ A PRIMEIRA RESPOSTA
Ao encontrar referências, o navegador abre novas buscas por CSS, JavaScript, imagens e fontes.
Enquanto a resposta HTML ainda está chegando, diferentes partes do navegador podem descobrir subrecursos. Cada referência é resolvida como uma URL, recebe um tipo e um iniciador e entra no sistema de fetch. A partir daí, o navegador verifica política de segurança e cache, escolhe uma conexão compatível e agenda a transferência.
<link rel="stylesheet" href="/assets/app.css">
<script defer src="/assets/app.js"></script>
<img src="https://cdn.exemplo.com/capa.webp" alt="Capa">
/* app.css também pode descobrir outro recurso */
@font-face { src: url("/fonts/interface.woff2"); }
// app.js pode iniciar uma busca em tempo de execução
fetch("https://api.exemplo.net/livros");
HTML
Parser e scanner antecipado
link, script, img, picture, mídia e outros elementos revelam URLs. Navegadores também podem usar um scanner antecipado para localizar recursos enquanto o parser principal está ocupado.
CSS
Recursos dentro das regras
url(), @font-face e @import podem revelar imagens, fontes e outras folhas. Esses endereços só ficam conhecidos depois que o CSS correspondente chega e é analisado.
JAVASCRIPT
Buscas decididas pelo programa
fetch(), módulos importados e elementos criados por script podem iniciar requisições mais tarde, de acordo com o estado da aplicação e as ações do usuário.
PRIORIDADE
Nem tudo entra na mesma fila
Tipo, posição, visibilidade, preload, loading="lazy" e fetchpriority ajudam o navegador a priorizar. Os detalhes do agendamento variam entre motores.
Laboratório visual · Da referência à origem correta
Avance pelas etapas para ver descoberta, resolução de URL, agrupamento lógico por origem e reutilização de conexões.
Descoberta: o parser encontra CSS, script e imagem no HTML. Depois, o CSS pode revelar uma fonte e o JavaScript pode iniciar uma chamada de API.
https://app.exemplo.com e http://app.exemplo.com são origens diferentes; já /assets/app.css e /img/capa.webp pertencem à mesma origem quando usam o mesmo esquema, host e porta. Internamente também contam o contexto de segurança, a partição de rede, a prioridade e as conexões disponíveis.A URL relativa ganha contexto
Recebido de https://app.exemplo.com/loja/, o caminho /assets/app.css vira https://app.exemplo.com/assets/app.css. A URL base do documento — que pode ser alterada por <base> — participa dessa resolução.
Uma conexão pode transportar vários recursos
Quando possível, conexões são mantidas e reutilizadas. HTTP/2 e HTTP/3 permitem vários fluxos concorrentes na mesma conexão; isso não significa que todos os recursos tenham a mesma prioridade ou terminem na ordem em que apareceram.
Outra origem exige verificações
Uma imagem pode ser exibida de outra origem, mas ler uma resposta com JavaScript normalmente depende de CORS. CSP, integridade, credenciais, referrer policy e tipo de destino também podem alterar ou bloquear a busca.
CACHE ANTES DE TRANSFERIR NOVAMENTE
A mesma URL não significa automaticamente uma nova descarga completa.
Antes de buscar o corpo pela rede, o processo de fetch procura uma resposta reutilizável. A chave não é apenas “o nome do arquivo”: método, URL, campos indicados por Vary, credenciais e o contexto de particionamento também podem participar da decisão. Depois, frescor e validadores determinam o próximo passo.
Laboratório visual · Qual caminho esta requisição percorre?
Alterne o cenário. As setas e os pacotes mostram quando o corpo vem do cache, quando apenas a validade é consultada e quando a rede fornece uma nova resposta.
Cache fresco: a resposta ainda está dentro do período permitido por Cache-Control. O corpo armazenado pode ser entregue sem consultar o servidor de origem.
Cache-Control: max-age=3600Fresco por um período
Enquanto a resposta estiver fresca e for reutilizável, o navegador pode atender a requisição localmente. Em arquivos versionados, immutable evita revalidações desnecessárias.
Cache-Control: no-cachePode guardar, mas precisa validar
O nome engana: no-cache não significa necessariamente “não armazenar”. Ele exige validação antes de reutilizar a resposta sem nova confirmação.
Cache-Control: no-storeNão armazenar neste cache
Instrui caches a não guardarem a resposta. É diferente de uma resposta guardada que ficou velha e precisa ser revalidada.
ETag: "build-a91"Validador da representação
Na próxima consulta, o cliente pode enviar If-None-Match. Um 304 Not Modified atualiza os metadados e reutiliza o corpo já salvo; um 200 traz uma representação nova.
Last-ModifiedValidador por data
Permite uma requisição condicional com If-Modified-Since. Em geral, ETag expressa mudanças da representação com mais precisão.
Vary: Accept-EncodingMais de uma variante
A resposta comprimida com Brotli não deve ser confundida com outra variante. Vary informa quais campos da requisição precisam corresponder.
Cache HTTP do navegador
É usado automaticamente pelo algoritmo de fetch conforme os cabeçalhos HTTP. Rótulos como “memory cache” e “disk cache” são detalhes de implementação e podem variar.
Cache API do Service Worker
É um armazenamento separado, controlado pela aplicação. O Service Worker intercepta o evento fetch e decide responder do Cache Storage, consultar a rede ou combinar estratégias.
Cache da CDN
Fica fora do dispositivo, próximo aos usuários. Mesmo quando o navegador precisa ir à rede, uma CDN pode responder sem consultar o servidor de origem da aplicação.
app.js e torcer para todos perceberem a mudança, o processo de build pode gerar app.a91f2c.js. O conteúdo novo produz outra URL; a versão antiga pode receber cache longo sem servir código desatualizado para a página nova.NEM TODO NÓ É UMA TAG
Document, elementos e textos ocupam papéis diferentes na árvore.
DOCUMENT
A raiz do documento
document representa o documento carregado. O elemento html é seu document element, não o próprio Document.
DOCUMENTTYPE
O modo do documento
<!doctype html> cria um nó de tipo DocumentType e ajuda o navegador a usar o modo de padrões.
ELEMENT
A estrutura semântica
main, h1 e button viram objetos Element, com propriedades, atributos, filhos e métodos.
TEXT
O conteúdo também é nó
O texto “Livros” não fica dentro do objeto h1 como uma string comum: ele é representado por um nó Text filho.
childNodes. id="abrir" e lang="pt-BR" pertencem à lista de atributos do elemento. DevTools costuma mostrá-los na mesma linha visual da tag para refletir essa relação.FONTE ≠ ÁRVORE ATUAL
“Exibir código-fonte” e “Inspecionar elemento” podem mostrar coisas diferentes.
O código-fonte é a sequência recebida. O painel Elements mostra uma representação serializada do DOM atual: já interpretado, possivelmente corrigido pelo parser e talvez modificado por JavaScript.
<!-- html, head e body foram omitidos -->
<title>Loja</title>
<h1>Produtos</h1>
<p>Confira as ofertasO autor omitiu tags que o HTML permite inferir e não escreveu o fechamento de p.
<html>
<head>
<title>Loja</title>
</head>
<body>
<h1>Produtos</h1>
<p>Confira as ofertas</p>
</body>
</html>O parser cria os elementos implícitos e fecha o parágrafo conforme as regras da linguagem.
A ÁRVORE DOM AINDA NÃO É A TELA
Estrutura e estilo precisam virar caixas, desenhos e camadas.
O DOM descreve conteúdo e relações. O CSS é analisado em estruturas próprias, suas regras são combinadas pela cascata e estilos computados são associados aos elementos. Em seguida, o mecanismo determina quais caixas existem, onde ficam e como devem ser desenhadas.
Laboratório visual · Do DOM aos pixels
Selecione uma fase para separar responsabilidades que costumam ser confundidas.
DOM: registra elementos, textos e relações. Ele diz que existe um botão dentro de main, mas ainda não determina seus pixels finais.
| Estrutura ou fase | Pergunta respondida | Resultado simplificado |
|---|---|---|
| DOM | Quais nós existem e como se relacionam? | Document, elementos, textos e comentários. |
| CSSOM e estilo | Quais regras se aplicam e qual é o valor computado? | Seletores, cascata, herança e estilos computados. |
| Estrutura de renderização | Quais caixas e fragmentos visuais precisam existir? | display: none não gera caixa; pseudoelementos podem gerar conteúdo visual. |
| Layout | Qual é o tamanho e a posição de cada fragmento? | Geometria considerando viewport, fluxo, flex, grid, fontes e conteúdo. |
| Paint e raster | O que desenhar e como converter em pixels? | Ordens de desenho, fundos, bordas, texto, sombras e imagens rasterizadas. |
| Composição | Como combinar superfícies e apresentar o quadro? | Camadas ou tiles são posicionados e combinados para chegar à tela. |
JAVASCRIPT PARTICIPA DA CONSTRUÇÃO
Um script pode esperar o parser, interrompê-lo ou alterar a árvore pronta.
Quando um script executa, ele pode consultar e modificar o DOM que existe naquele instante. A forma de carregar o script muda a relação entre download, parsing e execução.
SCRIPT CLÁSSICO
Sem async ou defer
Encontrado durante o parsing, normalmente interrompe o parser enquanto é buscado, quando externo, e executado. O conteúdo abaixo ainda pode não existir no DOM.
<script src="app.js"></script>DEFER
Baixa em paralelo, executa depois
O download ocorre sem parar o parser. Scripts defer clássicos executam depois que o documento terminou de ser analisado e preservam sua ordem.
<script defer src="app.js"></script>ASYNC
Executa assim que estiver pronto
Baixa em paralelo, mas pode interromper o parsing para executar quando chegar. A ordem entre vários scripts async não é garantida.
<script async src="metricas.js"></script>MODULE
Comportamento adiado por padrão
O módulo e suas dependências são buscados em paralelo e, sem async, avaliados depois do parsing. Módulos também possuem escopo próprio.
<script type="module" src="app.js"></script>DOMContentLoadedParsing concluído e scripts adiados executados.loadO documento e recursos dependentes que bloqueiam esse evento terminaram.A primeira pintura não precisa esperar o evento load. O navegador pode apresentar conteúdo progressivamente. Também não confunda “DOM pronto” com “todas as fontes, imagens e dados assíncronos prontos”. Cada marco responde a uma pergunta diferente.
DOM É MUTÁVEL
JavaScript pode trocar a árvore depois que o HTML terminou de chegar.
Neste laboratório, os botões usam APIs do DOM para criar elementos, alterar atributos e remover filhos. Um MutationObserver descreve a última mudança percebida.
OPERAÇÕES
Modifique a lista
Biblioteca
innerHTML aciona o parser de fragmentos HTML. Não injete conteúdo não confiável dessa maneira. Para texto, prefira textContent; para estruturas, crie elementos e atributos com APIs apropriadas ou use uma política de sanitização adequada ao contexto.MUDAR O DOM PODE INVALIDAR TRABALHO VISUAL
Nem toda alteração percorre todas as fases novamente.
| Alteração | Trabalho provável | Como interpretar |
|---|---|---|
| Adicionar um parágrafo | Style, layout, paint e composição. | A nova caixa pode deslocar conteúdo e precisa ser desenhada. |
| Trocar apenas uma cor | Style e paint; layout pode ser evitado. | A geometria não precisa mudar, mas os pixels sim. |
Animar transform | Pode ficar principalmente na composição. | Se o elemento estiver promovido adequadamente, é possível reutilizar pixels já rasterizados. |
| Ler geometria após escrever estilo | Pode forçar layout síncrono. | Intercalar repetidamente escrita e leitura de medidas causa layout thrashing. |
display: none | Pode reconstruir caixas e refazer layout. | O elemento continua no DOM, mas deixa de gerar caixa visual. |
PARE E PENSE
Um elemento aparece no painel Elements, mas não é visível na página. Isso prova que o parser falhou?
Separe existência no DOM, geração de caixa, posição, recorte, transparência e ordem de pintura.
display: none, ancestral oculto, visibility: hidden, opacidade zero, tamanho zero, posição fora da viewport, recorte ou sobreposição são algumas possibilidades. Inspecione estilos computados, box model, layout e camadas.CONTINUE EXPLORANDO
Referências e itens adicionais de estudo
Referências técnicas
Padrões e documentação de implementação usados nesta aula.
- WHATWG HTML · Parsing HTML documents — tokenização, modos de inserção e construção da árvore.
- WHATWG DOM Standard — nós, árvores, mutações, eventos e APIs.
- WHATWG HTML · The script element — diferenças entre scripts clássicos, defer, async e módulos.
- WHATWG HTML · Fetching a resource from a link — resolução da URL, destino, prioridade, CORS e início do fetch.
- WHATWG Fetch Standard — requisições, origens, partição do cache e reutilização de conexões.
- RFC 9111 · HTTP Caching — frescor, validação, chaves,
Varye respostas 304. - W3C · Service Workers — interceptação de fetch e relação com Cache Storage.
- CSSWG · CSS Object Model — folhas, regras, declarações e APIs de estilo.
- Chromium · RenderingNG architecture — fases reais de style, layout, paint, raster e composição.
Itens adicionais de estudo
Experimentos para consolidar o modelo mental.
- Abra View Source e Elements na mesma página e encontre uma diferença causada pelo parser ou por JavaScript.
- No console, compare
children, que seleciona elementos, comchildNodes, que também pode incluir textos e comentários. - Use breakpoints de subtree modifications no DevTools para descobrir qual código muda um componente.
- Teste scripts normal,
defer,asynce módulo, registrandodocument.readyStatee a ordem de execução. - Abra o painel Network e observe Domain, Initiator, Priority, Protocol, Size e a cascata temporal de cada subrecurso.
- Recarregue uma página três vezes: normalmente, com cache desativado e após limpar o cache. Compare transferências completas, respostas
304e indicações de cache. - No console, execute
performance.getEntriesByType('resource')e comparename,initiatorType, duração e tamanhos transferidos. - Grave uma interação no Performance panel e localize style recalculation, layout, paint e composite.
- Pesquise Shadow DOM e compare light tree, shadow tree e árvore composta.