Guía detallada

Speed Index Optimization Guide

Ver contenido

Guía Completa de Optimización de Speed Index: Logrando Cargas Visuales Más Rápidas

Introducción

Speed Index mide qué tan rápido la parte visible de tu página se llena durante la carga. Un Speed Index más bajo significa que los usuarios perciben tu página como cargando más rápido, incluso si el tiempo total de carga permanece igual.

Esta guía proporciona estrategias avanzadas de optimización para reducir Speed Index, basadas en la documentación oficial de Chrome Developers y las mejores prácticas de web.dev.

¿Nuevo en Speed Index? Comienza con nuestra guía para principiantes: 📖 Lee: Speed Index Explicado

Entendiendo el Progreso Visual

Cómo se Calcula Speed Index

Speed Index analiza un filmstrip de video de tu página cargando y calcula el área sobre la curva de progreso visual:

Progreso Visual en el Tiempo:
100% ─────────────────────────────────────────┐
     │                               ▓▓▓▓▓▓▓▓▓│ Página B (Bueno: 2.5s)
 75% ─                           ▓▓▓▓         │
     │                       ▓▓▓▓             │
 50% ─                   ▓▓▓▓                 │
     │       ████████████                     │ Página A (Pobre: 5.2s)
 25% ─   ████                                 │
     │ ██                                     │
  0% ─────────────────────────────────────────┘
     0s   1s   2s   3s   4s   5s   6s

Speed Index = Área sobre la curva (región sombreada)
Área más pequeña = Speed Index más bajo = Mejor rendimiento

Impacto en la Puntuación de Lighthouse

Según la documentación de Chrome Developers, Speed Index contribuye 10% a tu puntuación general de rendimiento en Lighthouse:

Métrica Peso Umbral Bueno
FCP 10% < 1.8s
Speed Index 10% < 3.4s
LCP 25% < 2.5s
TBT 30% < 200ms
CLS 25% < 0.1

Estrategia 1: Eliminar Recursos que Bloquean el Renderizado

Los recursos que bloquean el renderizado son la causa #1 de puntuaciones pobres de Speed Index.

Identificando Recursos Bloqueantes

Usa Chrome DevTools para identificar recursos bloqueantes:

  1. Abre DevTools → panel Performance
  2. Graba la carga de página
  3. Busca bloques largos de “Parse Stylesheet” o “Evaluate Script” antes del First Paint

Optimizando la Entrega de CSS

<!-- ❌ Mal: Todo el CSS bloquea el renderizado -->
<link rel="stylesheet" href="estilos.css">
<link rel="stylesheet" href="utilidades.css">
<link rel="stylesheet" href="componentes.css">

<!-- ✅ Bien: CSS crítico inline, diferir el resto -->
<style>
  /* CSS crítico above-the-fold inline */
  .header { background: #fff; height: 60px; }
  .hero { padding: 2rem; background: linear-gradient(...); }
</style>

<!-- CSS no crítico cargado asincrónicamente -->
<link rel="preload" href="estilos.css" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="estilos.css"></noscript>

Extrayendo CSS Crítico

Automatiza la extracción de CSS crítico:

// Usando el paquete npm critical
const critical = require('critical');

critical.generate({
  inline: true,
  base: 'dist/',
  src: 'index.html',
  target: 'index-critical.html',
  width: 1300,
  height: 900
});

Optimizando la Entrega de JavaScript

<!-- ❌ Mal: Script bloqueante en head -->
<head>
  <script src="app.js"></script>
</head>

<!-- ✅ Bien: Diferir JavaScript no crítico -->
<head>
  <!-- Solo JS crítico inline verdaderamente necesario -->
  <script>
    // Funcionalidad crítica mínima
  </script>
</head>
<body>
  <!-- Contenido -->

  <!-- Diferir bundle principal -->
  <script src="app.js" defer></script>
</body>

Estrategia 2: Optimizar Fuentes Web

Las fuentes web son un contribuyente importante al progreso visual lento.

Estrategias de Carga de Fuentes

/* ✅ Mejor: Usar font-display para mostrar texto inmediatamente */
@font-face {
  font-family: 'FuentePersonalizada';
  src: url('fuente-personalizada.woff2') format('woff2');
  font-display: swap; /* Muestra fallback, intercambia cuando carga */
}

/* Alternativa: optional (nunca intercambia, puede no mostrar fuente personalizada) */
@font-face {
  font-family: 'FuenteOpcional';
  src: url('fuente-opcional.woff2') format('woff2');
  font-display: optional;
}

Precargar Fuentes Críticas

<!-- Precargar fuentes necesarias para contenido above-the-fold -->
<link rel="preload"
      href="/fonts/fuente-principal.woff2"
      as="font"
      type="font/woff2"
      crossorigin>

Subconjuntos de Fuentes para Rendimiento

# Usando pyftsubset para crear subconjunto
pyftsubset font.ttf \
  --output-file=font-subset.woff2 \
  --flavor=woff2 \
  --layout-features="kern,liga" \
  --unicodes="U+0000-00FF"

Estrategia 3: Optimizar Carga de Imágenes

Las imágenes son frecuentemente los elementos visuales más grandes e impactan fuertemente el Speed Index.

Imágenes Responsivas

<!-- ✅ Usar srcset para imágenes responsivas -->
<img src="hero-800.webp"
     srcset="hero-400.webp 400w,
             hero-800.webp 800w,
             hero-1200.webp 1200w"
     sizes="(max-width: 600px) 400px,
            (max-width: 1000px) 800px,
            1200px"
     alt="Imagen hero"
     width="1200"
     height="600"
     loading="eager">

Formatos de Imagen Modernos

<!-- Usar elemento picture para fallbacks de formato -->
<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="Imagen hero" width="1200" height="600">
</picture>

Técnicas de Placeholder

Placeholder de Imagen de Baja Calidad (LQIP)

<!-- Mostrar placeholder borroso pequeño inmediatamente -->
<div class="image-container">
  <img src="data:image/jpeg;base64,/9j/4AAQ..."
       class="placeholder blur"
       alt="">
  <img src="hero-full.webp"
       class="full-image"
       loading="lazy"
       onload="this.previousElementSibling.remove()"
       alt="Imagen hero">
</div>

<style>
.placeholder { filter: blur(20px); }
.full-image { position: absolute; top: 0; left: 0; }
</style>

Placeholder de Color Dominante

<!-- Usar color dominante como placeholder -->
<div style="background-color: #3b82f6; aspect-ratio: 16/9;">
  <img src="hero.webp"
       loading="lazy"
       style="opacity: 0; transition: opacity 0.3s;"
       onload="this.style.opacity=1">
</div>

Estrategia 4: Optimizar Respuesta del Servidor

El rendimiento del servidor impacta directamente cuándo puede comenzar a cargar el contenido visual.

Habilitar Compresión

# Configuración gzip de Nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 256;
gzip_comp_level 6;

# Brotli (mejor compresión)
brotli on;
brotli_types text/plain text/css application/json application/javascript;

Usar un CDN

<!-- Servir recursos estáticos desde CDN -->
<link rel="stylesheet" href="https://cdn.example.com/estilos.css">
<script src="https://cdn.example.com/app.js" defer></script>
<img src="https://cdn.example.com/images/hero.webp">

Implementar HTTP/2 o HTTP/3

# Habilitar HTTP/2 en Nginx
server {
    listen 443 ssl http2;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
}

Renderizado del Lado del Servidor (SSR)

// Ejemplo Next.js - SSR para primer pintado más rápido
export async function getServerSideProps() {
  const data = await fetchData();
  return { props: { data } };
}

// O usar generación estática para entrega aún más rápida
export async function getStaticProps() {
  const data = await fetchData();
  return { props: { data }, revalidate: 3600 };
}

Estrategia 5: Priorizar Contenido Above-the-Fold

Enfoca los esfuerzos de optimización en lo que los usuarios ven primero.

Resource Hints

<head>
  <!-- Preconectar a orígenes requeridos -->
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://cdn.example.com" crossorigin>

  <!-- DNS prefetch para orígenes menos críticos -->
  <link rel="dns-prefetch" href="https://analytics.example.com">

  <!-- Precargar recursos críticos -->
  <link rel="preload" href="/fonts/main.woff2" as="font" crossorigin>
  <link rel="preload" href="/images/hero.webp" as="image">
  <link rel="preload" href="/css/critical.css" as="style">
</head>

Fetch Priority API

<!-- Alta prioridad para imagen above-the-fold -->
<img src="hero.webp" fetchpriority="high" alt="Hero">

<!-- Baja prioridad para imágenes below-the-fold -->
<img src="footer-bg.webp" fetchpriority="low" loading="lazy" alt="">

<!-- Alta prioridad para CSS crítico -->
<link rel="stylesheet" href="critical.css" fetchpriority="high">

Lazy Load de Contenido Below-the-Fold

<!-- Lazy loading nativo para imágenes -->
<img src="producto.webp" loading="lazy" alt="Producto">

<!-- Lazy load de iframes -->
<iframe src="https://youtube.com/embed/..." loading="lazy"></iframe>

Estrategia 6: Optimizar Scripts de Terceros

Los scripts de terceros frecuentemente retrasan significativamente el progreso visual.

Retrasar Scripts No Esenciales

// Cargar analytics después de interacción del usuario
let analyticsLoaded = false;

function loadAnalytics() {
  if (analyticsLoaded) return;
  analyticsLoaded = true;

  const script = document.createElement('script');
  script.src = 'https://analytics.example.com/track.js';
  document.body.appendChild(script);
}

// Cargar en primera interacción
['click', 'scroll', 'keydown'].forEach(event => {
  document.addEventListener(event, loadAnalytics, { once: true });
});

// O después de 5 segundos
setTimeout(loadAnalytics, 5000);

Usar Patrón Facade para Widgets

<!-- Mostrar placeholder estático para embed de YouTube -->
<div class="youtube-facade" data-video-id="dQw4w9WgXcQ">
  <img src="youtube-thumbnail.webp" alt="Miniatura de video">
  <button class="play-button" aria-label="Reproducir video"></button>
</div>

<script>
document.querySelector('.youtube-facade').addEventListener('click', function() {
  const videoId = this.dataset.videoId;
  this.innerHTML = `<iframe src="https://youtube.com/embed/${videoId}?autoplay=1"
                            allow="autoplay" allowfullscreen></iframe>`;
});
</script>

Midiendo Mejoras de Speed Index

Chrome DevTools

  1. Abre DevTools (F12)
  2. Ve al panel Performance
  3. Haz clic en Record, luego recarga la página
  4. Busca:
    • First Paint (línea verde)
    • Screenshots mostrando progreso visual
    • Actividad del hilo principal bloqueando el pintado

Lighthouse CI

Automatiza el tracking de Speed Index:

# .github/workflows/lighthouse.yml
- name: Run Lighthouse
  uses: treosh/lighthouse-ci-action@v9
  with:
    urls: |
      https://example.com/
    budgetPath: ./budget.json
// budget.json
{
  "timings": [
    {
      "metric": "speed-index",
      "budget": 3400
    }
  ]
}

Filmstrip de WebPageTest

  1. Ejecuta test en webpagetest.org
  2. Ve “Filmstrip View”
  3. Analiza el progreso visual fotograma a fotograma
  4. Identifica qué está retrasando la completitud visual

Errores Comunes y Soluciones

Error 1: Imágenes Hero Grandes Sin Optimizar

<!-- ❌ Problema: Imagen hero de 2MB -->
<img src="hero-original.jpg">

<!-- ✅ Solución: Hero responsivo optimizado -->
<picture>
  <source media="(max-width: 768px)"
          srcset="hero-mobile.webp"
          type="image/webp">
  <source srcset="hero-desktop.webp" type="image/webp">
  <img src="hero-desktop.jpg"
       width="1200" height="600"
       fetchpriority="high"
       alt="Imagen hero">
</picture>

Error 2: CSS Bloqueante para Below-the-Fold

<!-- ❌ Problema: Cargando todo el CSS de entrada -->
<link rel="stylesheet" href="todos-los-estilos.css">

<!-- ✅ Solución: Dividir y diferir CSS no crítico -->
<style>/* CSS crítico inline */</style>
<link rel="preload" href="below-fold.css" as="style"
      onload="this.rel='stylesheet'">

Error 3: Carga de Fuentes Sincrónica

/* ❌ Problema: Texto invisible hasta que carga la fuente */
@font-face {
  font-family: 'FuentePersonalizada';
  src: url('fuente.woff2');
}

/* ✅ Solución: Mostrar fallback inmediatamente */
@font-face {
  font-family: 'FuentePersonalizada';
  src: url('fuente.woff2');
  font-display: swap;
}

Checklist de Optimización de Speed Index

Antes de desplegar, verifica:

  • [ ] CSS crítico inline en <head>
  • [ ] CSS no crítico cargado asincrónicamente
  • [ ] JavaScript diferido o cargado al final del body
  • [ ] Fuentes web usando font-display: swap
  • [ ] Imágenes hero optimizadas y usando formatos modernos
  • [ ] Imágenes above-the-fold con fetchpriority="high"
  • [ ] Imágenes below-the-fold con loading="lazy"
  • [ ] Scripts de terceros retrasados hasta después de interacción
  • [ ] Resource hints (preconnect, preload) configurados
  • [ ] Speed Index < 3.4s en auditoría de Lighthouse

Artículos Relacionados

Continúa optimizando el rendimiento visual de tu sitio:

📚 Volver al Hub de Performance SEO - Explora todos los temas de rendimiento


Referencias

  1. Chrome Developers - Speed Index
  2. Chrome Developers - Lighthouse Performance Scoring
  3. Chrome Developers - Eliminate Render-Blocking Resources
  4. web.dev - Critical Rendering Path

Pruébalo Tú Mismo

¿Listo para optimizar tu Speed Index?

🔧 Descarga UXR SEO Analyzer (Gratis, análisis 100% local)


Disclaimer: Los analizadores en esta extensión son guías de referencia basadas en documentación oficial de Chrome Developers y web.dev. No representan verdades absolutas sobre cómo los motores de búsqueda evalúan tu contenido—solo los motores de búsqueda conocen sus algoritmos internos. Usa estas recomendaciones como punto de partida para mejorar tu sitio.

Última actualización: 14 de diciembre de 2025

Artículos relacionados

Versión relacionada

Introducción

Speed Index Explained

Speed Index mide qué tan rápido el contenido se muestra visualmente durante la carga de la página

Hub de categoría

Hub

Performance Seo Hub

El rendimiento es un factor de ranking crítico e impacta directamente la experiencia del usuario

En la misma categoría

Guía detallada

Lcp Optimization Guide

Largest Contentful Paint (LCP) mide cuándo el elemento de contenido más grande se vuelve visible para los usuarios

Guía detallada

Fcp Optimization Guide

First Contentful Paint (FCP) mide cuándo los usuarios ven por primera vez contenido en tu página