Web Performance

Rendimiento Web

El rendimiento es una funcionalidad. Los Core Web Vitals, el lazy loading, bundles más pequeños y un almacenamiento en caché inteligente deciden si los usuarios se quedan o se van antes incluso de que tu página se renderice.

intermediate15 min readUpdated 15 sept 2026
vitals.js
js
// vitals.js
new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log("LCP:", Math.round(entry.startTime));
  }
}).observe({
  type: "largest-contentful-paint",
  buffered: true,
});
Métricas principales
LCP, CLS, INP
Datos de campo
Monitoreo de usuarios reales
Datos de laboratorio
Lighthouse y DevTools
Mayor palanca
Enviar menos JavaScript
Imágenes
Usualmente el recurso más pesado
Presupuesto
Establece un límite y hazlo cumplir

Por que importa

Por qué el rendimiento es una funcionalidad

Mejores métricas

Las páginas más rápidas obtienen mejores puntuaciones en los Core Web Vitals, lo que afecta tanto a la experiencia del usuario como al posicionamiento en buscadores.

Usuarios más felices

Cada 100ms de retraso reduce mediblemente el engagement y la conversión. La velocidad no es algo cosmético.

Infraestructura más económica

Payloads más pequeños y un almacenamiento en caché más inteligente reducen el ancho de banda y la carga del servidor a medida que crece el tráfico.

La imagen completa

Los tres pilares del rendimiento

Cargar menos, cargarlo más tarde y hacer que el trabajo del navegador sea ligero. Casi cualquier optimización entra en una de estas categorías.

Carga

Llevarlo allí

Reduce los bytes, divide los bundles, aplica lazy-load al contenido below-the-fold y prioriza lo que importa.

Renderizado

Mostrarlo rápido

Minimiza los saltos de diseño (layout shifts), evita el trabajo bloqueante y mantén el hilo principal libre.

Runtime

Mantener la fluidez

Mantén las interacciones receptivas enviando menos JavaScript y dividiendo las tareas largas.

Rendimiento de un vistazo

Métricas y herramientas

LCP

Largest Contentful Paint mide cuándo el contenido principal es visible.

INP

Interaction to Next Paint mide la capacidad de respuesta a la entrada del usuario.

CLS

Cumulative Layout Shift mide la estabilidad visual.

TTFB

Time to First Byte refleja la latencia del servidor y de la red.

Performance API

Mide tiempos reales en el navegador mediante observadores.

Bundle budget

Limita el JavaScript que envías y falla la compilación cuando este crezca.

Una breve historia

Del tiempo de carga de página a las métricas centradas en el usuario

  1. 2010

    Tiempo de carga de página

    Los primeros trabajos de rendimiento se centran en cuánto tarda la página en cargar.

    10
  2. 2015

    Modelo RAIL

    Google redefine el rendimiento basándose en respuesta, animación, inactividad y carga.

    15
  3. 2020

    Core Web Vitals

    LCP, CLS y FID proporcionan a la industria métricas compartidas centradas en el usuario.

    20
  4. 2024

    INP reemplaza a FID

    Interaction to Next Paint se convierte en la métrica de capacidad de respuesta.

    24
  5. Hoy

    Presupuestos de rendimiento

    Los equipos tratan el rendimiento como una restricción en tiempo de compilación, no como algo secundario.

    Hoy

La guia completa

Rendimiento Web: Todo lo que necesitas saber

Por qué el rendimiento es una funcionalidad

El rendimiento no es un paso de pulido al final de un proyecto. Es lo que decide si los usuarios llegan a ver tu contenido o no. Una página que tarda cuatro segundos en mostrar su contenido principal pierde una gran parte de sus visitantes antes siquiera de ser usable, y las interacciones lentas hacen que una aplicación se sienta rota incluso cuando funciona correctamente.

La buena noticia es que el rendimiento es medible y, en su mayoría, sistemático. Un pequeño número de palancas —cargar menos, cargar más tarde, realizar menos trabajo en el hilo principal— representan la gran mayoría de las mejoras. Esta guía cubre las métricas, las herramientas y las técnicas que más importan.

Core Web Vitals

Tres métricas, denominadas colectivamente Core Web Vitals, describen la experiencia del usuario:

  • Largest Contentful Paint (LCP) — indica cuándo termina de renderizarse el elemento visible más grande. Un buen resultado es inferior a 2.5 segundos.
  • Interaction to Next Paint (INP) — la latencia entre una interacción del usuario y la siguiente actualización visual. Un buen resultado es inferior a 200 milisegundos.
  • Cumulative Layout Shift (CLS) — cuánto se desplaza el contenido visible de forma inesperada. Un buen resultado es inferior a 0.1.

Otras métricas complementarias incluyen Time to First Byte (TTFB) para la latencia del servidor y First Contentful Paint (FCP) para el momento en que aparece el primer elemento. En conjunto, estas métricas te indican si una página es rápida, responsiva y estable.

Medición

Necesitas tanto datos de campo (field data) como datos de laboratorio (lab data).

Los datos de campo provienen de usuarios reales y reflejan la gama real de dispositivos y redes; es aquello que debes optimizar. Los datos de laboratorio de Lighthouse o DevTools son reproducibles, lo que los hace mejores para diagnosticar un problema específico.

El navegador expone los tiempos reales a través de la Performance API.

// observe.js
new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(entry.name, entry.startTime);
  }
}).observe({ type: "largest-contentful-paint", buffered: true });

Librerías como web-vitals envuelven estos observadores y envían los reportes a tu sistema de analíticas, lo que te permite obtener datos de campo sin tener que construir toda la infraestructura tú mismo.

Cargar menos

La palanca más importante es enviar menos. JavaScript es el recurso más costoso porque debe descargarse, analizarse y ejecutarse, y compite con el renderizado por el hilo principal.

  • Elimina las dependencias que no utilices y prefiere alternativas más ligeras.
  • Importa únicamente las funciones que necesites de una librería.
  • Divide las rutas y las funcionalidades pesadas mediante import() dinámicos.
  • Renderiza en el servidor siempre que sea posible y envía solo las partes interactivas.
  • Comprime y sirve formatos modernos como Brotli y AVIF.
  • Establece un presupuesto de bundle (bundle budget) y haz que la CI falle cuando este aumente.

Un analizador de bundles muestra exactamente qué hay en tu build, lo cual suele ser sorprendente la primera vez que lo revisas.

Carga diferida

No todo es necesario para el primer renderizado. Difiere el resto.

<!-- deferred.js -->
<script src="app.js" defer></script>
<script src="analytics.js" async></script>
<img src="hero.avif" fetchpriority="high" alt="Hero" />
<img src="thumb.avif" loading="lazy" decoding="async" width="400" height="300" alt="" />

defer ejecuta los scripts después del parseo, async los ejecuta tan pronto como se descargan, fetchpriority="high" prioriza la imagen LCP y loading="lazy" difiere las imágenes que están fuera de la pantalla. El import() dinámico hace lo mismo con los módulos de JavaScript.

Renderizado y estabilidad

Dos problemas de renderizado dominan el CLS y la velocidad percibida.

Reserva espacio para imágenes, iframes, anuncios y embeds para que no desplacen el contenido. Define width y height, o utiliza aspect-ratio en CSS. Implementa una estrategia de fuentes que evite el intercambio tardío (late swap), como font-display: swap con una fuente de respaldo compatible o fuentes autoalojadas.

Mantén el hilo principal libre. Las tareas largas bloquean la interacción e incrementan el INP. Divide el trabajo costoso, traslada los cálculos pesados a un Web Worker y evita el layout thrashing agrupando las lecturas y escrituras del DOM.

Caching

El caching convierte las visitas recurrentes en cargas instantáneas. Utiliza fingerprints en los assets mediante hashes de contenido y sírvelos con un max-age largo Cache-Control, ya que cualquier archivo modificado recibirá un nombre nuevo. Sirve el HTML con un cache corto y revalida. Para mejorar la velocidad en visitas recurrentes y el funcionamiento offline, un service worker puede cachear el app shell y los assets, tal como se explica en la guía de PWA.

Presupuestos de rendimiento

Un presupuesto convierte el rendimiento en una restricción en lugar de una esperanza.

{
  "budgets": [
    { "path": "/*", "resourceSizes": [{ "resourceType": "script", "budget": 170 }] }
  ]
}

Elige un límite realista para JavaScript, imágenes y LCP, y luego aplícalo en CI. Cuando un pull request excede el presupuesto, la compilación falla y el autor decide si el compromiso vale la pena. Así es como los equipos evitan que el rendimiento se degrade con el tiempo.

Mejores prácticas

  • Mide antes de optimizar y utiliza tanto datos de campo (field data) como de laboratorio (lab data).
  • Envía menos JavaScript antes de realizar micro-optimizaciones en cualquier otra cosa.
  • Implementa lazy-load en las imágenes que estén fuera del área visible (below-the-fold) y divide las rutas pesadas.
  • Define dimensiones explícitas en los archivos multimedia para proteger el CLS.
  • Utiliza fetchpriority, defer y async de manera deliberada.
  • Aplica fingerprinting a los assets y almacénalos en caché durante un largo periodo de tiempo.
  • Define y aplica un presupuesto de bundle (bundle budget) en el CI.

Errores comunes

  • Optimizar la cosa equivocada sin realizar mediciones.
  • Enviar un bundle de cliente enorme para contenido que podría ser estático.
  • Cargar ansiosamente cada imagen y script.
  • Omitir las dimensiones de las imágenes, provocando layout shift.
  • Bloquear el hilo principal con tareas síncronas prolongadas.
  • Tratar el rendimiento como un proyecto puntual en lugar de un presupuesto continuo.

Próximos pasos

El rendimiento es una disciplina, no una lista de tareas. Utiliza Vite para dividir y analizar tu bundle, reduce el peso de JavaScript con los patrones de la guía de React, añade almacenamiento en caché offline con PWA y mantén el hilo principal libre con un JavaScript sólido. Después, mide tu propio sitio con datos reales de campo y elige el cambio que tenga el mayor impacto.

Carga de imágenes

Aplica lazy-load a las imágenes below-the-fold y define dimensiones explícitas. La carga inmediata (eager) y la falta de tamaños perjudican el LCP y causan saltos de diseño.

Preferir
<img
  src="hero.avif"
  width="1200"
  height="600"
  alt="Hero"
  fetchpriority="high"
/>
<img
  src="thumb.avif"
  width="400"
  height="300"
  loading="lazy"
  alt=""
/>
Evitar
<img src="hero.png" alt="Hero" />
<img src="thumb.png" alt="" />
<!-- no dimensions,
     everything eager -->

Carga de scripts

Los scripts no críticos no deben bloquear el parseo del HTML. Aplica defer o cárgalos bajo demanda.

Preferir
<script src="app.js" defer></script>
<!-- or load when needed -->
<script type="module">
  import("./heavy.js");
</script>
Evitar
<head>
  <script src="analytics.js"></script>
  <script src="heavy-widget.js"></script>
</head>

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender Web Performance?

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