Browser Internals

Navegadores y Renderizado

Un navegador convierte HTML, CSS y JavaScript en píxeles. Comprender el parsing, el DOM, la ruta de renderizado crítica y los reflows hace que el rendimiento sea mucho menos misterioso.

intermediate15 min readUpdated 15 sept 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>
Motores
Blink, Gecko, WebKit
Parsing
HTML a DOM
Estilos
CSS a CSSOM
Layout
Geometría y posición
Paint
Píxeles a capas
Hilo
El main thread ejecuta JS

Por que importa

Por qué importan los internals del navegador

Un runtime, no un documento

El navegador es un entorno de ejecución con un DOM, APIs, almacenamiento, networking y un motor de JavaScript.

La ruta crítica

El HTML, el CSS y el JavaScript bloqueante deciden cuándo pueden aparecer los primeros píxeles.

El layout es costoso

Recalcular la geometría obliga al navegador a repetir trabajo, por eso es importante agrupar los cambios del DOM.

La imagen completa

Las tres etapas del renderizado

Parsear el marcado, organizar las cajas, y luego pintar y componer los píxeles.

Parse

Construir el árbol

El HTML se convierte en el DOM, el CSS en el CSSOM, y juntos forman el render tree.

Layout

Ubicar

El navegador calcula el tamaño y la posición de cada caja.

Paint

Dibujar

Las cajas se pintan en capas y se componen en el frame final.

El renderizado de un vistazo

Conceptos fundamentales

Parsing de HTML

El parser construye el DOM a medida que recibe el flujo del documento.

CSSOM

Las hojas de estilo se parsean en un árbol de reglas y estilos computados.

Render tree

Solo los elementos visibles con estilos entran en el render tree.

Layout

También llamado reflow: el cálculo de la geometría de cada caja.

Paint y composite

El llenado de píxeles y la combinación de capas en la GPU.

El main thread

JavaScript, layout y paint comparten un solo hilo, por lo que las tareas largas lo bloquean todo.

Una breve historia

De motores individuales a una plataforma compartida

  1. 1993

    Mosaic

    El primer navegador gráfico ampliamente utilizado lleva las imágenes a la web.

    93
  2. 1995

    JavaScript

    El scripting convierte documentos estáticos en aplicaciones.

    95
  3. 2008

    Chrome y V8

    Un motor rápido y una arquitectura de multiproceso reinician las expectativas de rendimiento.

    08
  4. 2013

    Blink

    Chrome hace un fork de WebKit y Blink se convierte en el motor dominante.

    13
  5. Hoy

    Una plataforma de estándares

    Los motores convergen en estándares web y los navegadores se convierten en el runtime universal de aplicaciones.

    Hoy

La guia completa

Navegadores y Renderizado: Todo lo que necesitas saber

¿Qué hace realmente un navegador?

Un navegador es un entorno de ejecución, no solo un visor de documentos. Analiza el HTML y el CSS para convertirlos en árboles, ejecuta JavaScript, expone API para redes y almacenamiento, y renderiza el resultado en píxeles. Comprender este flujo de trabajo transforma el rendimiento: deja de ser una cuestión de adivinanzas para convertirse en ingeniería.

Los proveedores de navegadores distribuyen tres motores principales: Blink (Chrome, Edge, Opera), Gecko (Firefox) y WebKit (Safari). Todos implementan los mismos estándares, por lo que los conceptos expuestos aquí se aplican en todas partes, incluso cuando los detalles varíen.

Parseo de HTML al DOM

Cuando el navegador recibe HTML, lo parsea en el DOM: un árbol de objetos que representa cada elemento, atributo y fragmento de texto. El parser funciona mediante streaming, por lo que puede comenzar a construir el árbol antes de que llegue el documento completo.

El parseo de HTML es resiliente por diseño. Una etiqueta de cierre faltante o un elemento mal ubicado no detienen la página; el parser se recupera y continúa. Es por eso que el marcado mal formado aún se renderiza, y por qué validar tu HTML es importante para garantizar la predictibilidad.

CSS y el CSSOM

Las hojas de estilo se analizan para generar el CSSOM, un árbol de reglas. Luego, el navegador calcula el estilo final de cada elemento combinando la cascada, la herencia y la especificidad.

CSS es render-blocking: el navegador no realizará el renderizado (paint) hasta que tenga los estilos necesarios, ya que pintar con los estilos incorrectos provocaría un parpadeo visible. Es por esto que una hoja de estilos extensa en el head retrasa el primer paint, y por qué ayuda el inlining de CSS crítico.

El render tree

El DOM y el CSSOM se combinan para formar el render tree, el cual contiene únicamente los elementos que se mostrarán realmente, cada uno con sus estilos computados. Los elementos con display: none quedan excluidos; los elementos visibility: hidden se incluyen pero no se pintan.

A partir de aquí, el navegador sabe qué dibujar, pero aún no dónde.

Layout

El Layout, también llamado reflow, calcula el tamaño y la posición de cada caja en el render tree. Recorre el árbol resolviendo anchos, altos, márgenes, padding y posicionamiento, para generar un box model con geometría exacta.

El Layout es costoso porque los cambios pueden propagarse en cascada: cambiar el tamaño de un elemento puede desplazar a sus hermanos, a su padre y a todo lo que esté debajo. Leer propiedades como offsetHeight obliga al navegador a asegurarse de que el layout esté actualizado, por lo que intercalar lecturas y escrituras provoca layouts repetidos.

Pintado y composición

Después del layout, el navegador pinta (paint) los cuadros en capas, rellenando colores, texto, imágenes, bordes y sombras. Luego compone (composite) esas capas, a menudo en la GPU, para generar el frame final.

Algunos cambios son más costosos que otros:

  • Cambiar un color dispara el paint.
  • Cambiar un tamaño dispara el layout y el paint.
  • Cambiar transform o opacity puede ser gestionado por el compositor, omitiendo completamente el layout y el paint.

Es por esto que las animaciones deben limitarse a transforms y opacity. Consulta la guía de CSS Animations y la guía de Web Performance.

La ruta de renderizado crítica

El camino desde el HTML hasta los primeros píxeles es:

  1. Parsear el HTML para crear el DOM.
  2. Parsear el CSS para crear el CSSOM.
  3. Combinarlos en el render tree.
  4. Calcular el Layout de las cajas.
  5. Pintar (Paint) y componer (composite) el frame.

Acortar esta ruta es la base del rendimiento percibido: menos recursos bloqueantes, un CSS más pequeño y un JavaScript que no interfiera en el proceso.

<!-- 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 las solicitudes importantes lo antes posible, el CSS crítico inlined evita un viaje de ida y vuelta (round trip) bloqueante, y defer permite que el parser termine antes de que se ejecute el script.

El hilo principal y JavaScript

El hilo principal ejecuta JavaScript, el layout, el paint y el manejo de eventos. Solo ocurre una cosa a la vez, por lo que una tarea prolongada bloquea la entrada del usuario y hace que la página parezca congelada.

  • Mantén las tareas cortas y divide el trabajo costoso.
  • Mueve los cálculos pesados a un Web Worker, que se ejecuta en un hilo separado.
  • Evita el layout thrashing agrupando las lecturas y escrituras del DOM.
  • Cede el control al navegador entre bloques de trabajo.

Este es el mismo event loop que viste en la guía de JavaScript, ahora con el trabajo de renderizado compitiendo por el mismo hilo.

Almacenamiento y APIs del navegador

Más allá del renderizado, el navegador proporciona APIs de plataforma y almacenamiento: cookies, localStorage y sessionStorage, IndexedDB, la Cache API, service workers, WebSockets, WebRTC, el Clipboard, Notifications y más. Estas son las herramientas que permiten que una página web se comporte como una aplicación. La guía de PWA cubre los service workers y el almacenamiento en caché.

Mejores prácticas

  • Mantén la ruta crítica corta: utiliza CSS crítico inline y difiere los scripts.
  • Usa preload para las fuentes y otros activos críticos para el renderizado.
  • Anima transform y opacity, no las propiedades de diseño (layout).
  • Agrupa las lecturas y escrituras del DOM para evitar el layout thrashing.
  • Mantén las tareas de JavaScript cortas; utiliza Web Workers para el trabajo pesado.
  • Reserva espacio para imágenes y elementos embebidos para evitar el layout shift.
  • Realiza pruebas en múltiples motores, especialmente en Safari y dispositivos móviles.

Errores comunes

  • Asumir que el DOM es el código fuente HTML.
  • Bloquear el renderizado con hojas de estilo extensas o scripts síncronos.
  • Leer propiedades de diseño (layout) dentro de un bucle, forzando reflows repetidos.
  • Animar width o top y provocar jank.
  • Ejecutar cómputos pesados en el hilo principal (main thread).
  • Probar solo en un navegador e ignorar las diferencias entre motores.

Próximos pasos

El funcionamiento interno del navegador explica por qué funcionan los consejos de rendimiento. Ponlo en práctica con la guía de Web Performance, crea animaciones eficientes con CSS Animations y manipula el árbol de forma segura con DOM Manipulation. Después, abre las DevTools y observa el pipeline de renderizado en el panel de rendimiento.

Carga de scripts

Un script clásico en el head bloquea el parsing. defer descarga en paralelo y se ejecuta después de que el documento ha sido parseado.

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>

Actualización del DOM

Agrupa lecturas y escrituras. Intercalarlas obliga al navegador a recalcular el 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";

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender Browsers & Rendering?

Nuestro tutorial interactivo te guia a traves de Browsers & Rendering paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.