Rendimiento tipográfico y CLS
El estado intermedio entre el primer pintado y la fuente lista: gobernar el intercambio con font-display, entender el desplazamiento de maquetación que provoca el cambio de fuente y anularlo con fallbacks métricos optimizados basados en size-adjust, y reservar el preload para la fuente crítica del primer viewport.
Una fuente web vive un instante peligroso: el que va desde que la página se pinta por primera vez hasta que sus glifos terminan de descargarse. En ese hueco, el navegador tiene que decidir qué enseñar, y cada decisión tiene un coste, o texto invisible, o un salto de maquetación cuando la fuente real reemplaza a la de respaldo. Este desplazamiento inesperado del contenido, que la web mide como CLS, es una de las peores experiencias que puede sufrir un lector. Esta lección explica cómo Astro gobierna ese estado intermedio con font-display, fallbacks métricos y precarga selectiva.
- Controlar la fase de intercambio con los valores de
font-display. - Explicar el desplazamiento de maquetación que causa el cambio de fuente.
- Anular ese salto con fallbacks métricos optimizados basados en
size-adjust. - Decidir un
preloadselectivo para la fuente crítica del primer viewport.
font-display: gobernar el intercambio
La propiedad font-display le dice al navegador cómo comportarse mientras la fuente carga, repartiendo dos periodos: uno de bloqueo, en el que el texto puede quedar invisible esperando la fuente, y uno de intercambio, en el que se muestra un respaldo hasta que la real llega. Sus valores gradúan esa negociación: swap muestra el respaldo de inmediato y cambia al llegar la fuente; block oculta el texto un instante antes de rendirse al respaldo; fallback es un término medio; y optional da un margen mínimo y, si la fuente no llega a tiempo, se queda con el respaldo sin cambiar en esa carga.
---
// astro.config.mjs
export default defineConfig({
fonts: [
{
provider: fontProviders.google(),
name: 'Inter',
cssVariable: '--font-inter',
display: 'swap',
},
],
});
La elección tiene consecuencias opuestas. swap garantiza que el texto siempre se vea, pero a costa de un cambio visible que puede desplazar la maquetación. optional es la mejor para las métricas de rendimiento, porque evita el salto por completo, pero acepta que en una red lenta el visitante quizá no llegue a ver tu fuente en esa visita. No hay un valor correcto universal; hay un valor correcto para cada compromiso entre certeza de mostrar la fuente y estabilidad visual.
Las dos patologías que font-display arbitra son viejas conocidas del rendimiento web. Al hueco en blanco mientras la fuente carga se le llama destello de texto invisible; al respaldo que luego se reemplaza de golpe, destello de texto sin estilo. Un periodo de bloqueo largo produce lo primero; un intercambio visible, lo segundo. Entender font-display es, en el fondo, elegir cuál de las dos prefieres y durante cuánto tiempo, sabiendo que la técnica métrica te permite quedarte con las ventajas de mostrar pronto sin pagar el salto.
Estos dos valores encarnan el dilema. Si tu prioridad es que la identidad tipográfica se vea sí o sí, swap la asegura pagando un posible reflow. Si tu prioridad es una estabilidad visual perfecta y un CLS de cero, optional la logra a cambio de que, en conexiones pobres, algunos visitantes vean solo el respaldo. La buena noticia es que el reflow de swap se puede neutralizar casi por completo con la técnica de la siguiente sección, lo que inclina la balanza a su favor en la mayoría de los casos.
Fallbacks métricos: el truco contra el CLS
El salto no lo causa el cambio de fuente en sí, sino que la fuente de respaldo y la real tengan métricas distintas: distinta altura de las minúsculas, distinta anchura de avance. Cuando el respaldo ocupa más o menos espacio que la fuente definitiva, el texto se recompone al intercambiar y todo lo que hay debajo salta. La cura no es evitar el respaldo, sino hacer que ocupe exactamente el mismo espacio que la fuente real.
Eso es lo que hace Astro por defecto. A partir de la última familia genérica de tu pila de fallbacks, genera un @font-face de respaldo optimizado que ajusta sus métricas, con size-adjust y los descriptores de ascenso y descenso, para calcar la caja de la fuente real. Mientras la fuente carga, el respaldo ya ocupa su sitio definitivo, así que cuando llega el intercambio no se mueve nada.
---
// astro.config.mjs
export default defineConfig({
fonts: [
{
provider: fontProviders.google(),
name: 'Inter',
cssVariable: '--font-inter',
fallbacks: ['sans-serif'],
optimizedFallbacks: true,
},
],
});
El respaldo optimizado que Astro inyecta se parece conceptualmente a esto: una familia de respaldo local que hereda las métricas de la fuente real mediante size-adjust, de modo que un carácter ocupe lo mismo en ambas.
@font-face {
font-family: 'Inter fallback';
src: local('Arial');
size-adjust: 107%;
ascent-override: 90%;
descent-override: 22%;
}
Cada descriptor cumple un papel: size-adjust escala el glifo para igualar la anchura de avance, y los ascent-override y descent-override fijan la altura de la caja de línea para que el interlineado coincida. Juntos consiguen que una línea de respaldo y una línea de la fuente real ocupen el mismo rectángulo, condición necesaria para que el intercambio no empuje nada.
optimizedFallbacks está activo por defecto y es lo que quieres en casi todos los casos. Solo lo desactivas, poniéndolo en false, si necesitas control manual absoluto sobre la pila de respaldo y prefieres definir tú los descriptores. La última entrada de fallbacks debe ser una familia genérica, como sans-serif o monospace, porque es de ella de donde Astro deriva el respaldo métrico.
flowchart TD START[primer pintado] --> FB[muestra el respaldo optimizado] FB --> METRICS[sus metricas calcan la fuente real con size adjust] LOAD[la fuente real termina de cargar] --> SWAP[intercambio] METRICS --> SWAP SWAP --> NOCLS[sin desplazamiento de maquetacion] style START fill:#89b4fa,color:#11111b style NOCLS fill:#a6e3a1,color:#11111b
preload selectivo
La tercera palanca, ya presentada con el componente <Font />, es la precarga. Aquí su papel es de rendimiento puro: adelantar la fuente crítica del primer viewport acorta el tiempo en que se muestra el respaldo, pero precargar de más retrasa el contenido importante.
---
import { Font } from 'astro:assets';
---
<head>
<!-- solo la fuente del cuerpo, que domina el primer viewport -->
<Font cssVariable="--font-inter" preload />
<!-- la de titulares decorativos, a demanda -->
<Font cssVariable="--font-display" />
</head>
La regla se mantiene: precarga solo la fuente que domina lo visible al abrir la página, y deja las demás a demanda. Una precarga quirúrgica reduce el tiempo con respaldo justo donde el ojo mira primero, sin robar prioridad al resto de la carga.
El rendimiento tipográfico no sale de un único ajuste, sino de la combinación afinada de tres: font-display decide qué se ve durante la espera, los fallbacks métricos garantizan que esa espera no mueva nada, y el preload acorta la espera para lo crítico. Un swap con respaldo optimizado y una precarga sensata para la fuente principal es, para la mayoría de sitios, el punto dulce: el texto siempre visible, sin saltos y con la fuente real llegando pronto.
font-display
Gradua el intercambio entre respaldo y fuente real. swap, optional, fallback, block.
size-adjust
Ajusta las metricas del respaldo para que ocupe lo mismo que la fuente real.
optimizedFallbacks
Activo por defecto. Genera el respaldo metrico desde tu familia generica.
preload selectivo
Adelanta solo la fuente critica del primer viewport, nunca todas.
La enseñanza honda de esta lección es que la calidad de una interfaz no se decide solo en sus estados finales, la página con la fuente ya cargada, sino sobre todo en los estados transitorios que casi nadie se molesta en diseñar. Entre el primer pintado y la fuente lista hay un intervalo de cientos de milisegundos que el visitante sí experimenta, y durante años la web lo trató como un accidente inevitable: o un hueco en blanco, o un salto brusco. La API de fuentes de Astro parte de la convicción contraria, que ese intervalo es un estado de primera clase que merece ingeniería. Los fallbacks métricos son la expresión más elegante de esa idea: en lugar de tolerar que el respaldo y la fuente real ocupen espacios distintos y aceptar el salto como precio, Astro fuerza a que el respaldo mienta sobre su tamaño para ocupar exactamente el sitio de la fuente que aún no ha llegado. El resultado es una ilusión perfecta de continuidad: el usuario ve texto desde el primer instante, ese texto no se mueve ni un píxel, y la fuente real se desliza en su lugar sin que el ojo lo note. Esto conecta con un principio que va mucho más allá de la tipografía: los sistemas que se sienten pulidos no son los que tienen estados finales bonitos, sino los que tratan cada transición, cada carga, cada espera, como algo que merece ser diseñado. El CLS no es una métrica técnica árida; es la medida de cuántas veces tu interfaz traiciona la confianza del lector moviéndole el suelo bajo los pies. Reducirlo a cero es, en el fondo, un acto de respeto.
- Configura una familia con
display: 'swap'y observa, en una red ralentizada desde las herramientas del navegador, el cambio de fuente al cargar. - Verifica que
optimizedFallbacksestá activo y comprueba con la métrica de CLS que el intercambio no desplaza la maquetación. - Desactiva
optimizedFallbacksponiéndolo enfalse, repite la medición y compara el CLS resultante para sentir lo que la optimización te ahorraba. - Cambia
displayaoptional, mide de nuevo, y razona en qué tipo de sitio elegirías cada valor según su compromiso.