css front-end Intermediate 3 min

@font-face e Google Fonts: font custom senza rallentare il sito

font-display: swap, subset, preload font, self-hosting vs CDN

· 668 parole

Un font personalizzato è un file da scaricare, non un semplice stile. E fino a quando quel file non arriva, il browser deve decidere cosa fare: aspettare a schermo bianco, o mostrare subito qualcosa? Questa scelta ha un nome preciso, ed è tutta nella regola @font-face.

1. font-display: swap, il valore che quasi sempre vuoi

Il descrittore font-display definisce come si comporta il font mentre viene scaricato. MDN descrive due fasi: un blocco (il testo resta invisibile in attesa del font) e uno scambio (il testo appare subito con un font di riserva, sostituito appena il font vero è pronto).

@font-face { 
    font-family: "Inter"; src: url("/fonts/inter.woff2") format("woff2"); 
    font-display: swap; 
}

Con swap, il periodo di blocco è quasi nullo: il testo appare subito con il font di sistema, e passa al font personalizzato non appena disponibile. La guida MDN alle performance web lo raccomanda esplicitamente, proprio per non bloccare il rendering della pagina.

Fonte: MDN Web Docs: «font-display»: definisce blocco e scambio del caricamento font.

2. Subset: scaricare solo i caratteri che usi davvero

Un font completo contiene migliaia di glifi, alfabeti, simboli, lingue che probabilmente non userai nella pagina. Il subsetting è il processo di generare un file più piccolo con solo i caratteri necessari.

Attenzione a un equivoco comune: la proprietà unicode-range da sola non riduce il peso del file. Dice al browser «scarica questo file solo se ti serve questo intervallo di caratteri», ma se il file non è stato fisicamente ridotto, il browser scarica comunque tutto il file intero quando serve anche un solo carattere in quell'intervallo.

@font-face {
    font-family: "Inter";
    src: url("/fonts/inter-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153; /* solo latino base */
}

Il subsetting vero avviene prima, con uno strumento che genera il file ridotto; unicode-range serve poi solo a dire al browser quale dei file (già ridotti) scaricare.

Fonte: MDN Web Docs: «unicode-range» (CSS at-rule descriptor): specifica l'insieme di codepoint Unicode supportati, usato come indicazione per decidere se scaricare una risorsa font.

3. preload: dare priorità al font critico

Normalmente il browser scopre di aver bisogno di un font solo dopo aver letto e interpretato il CSS, un ritardo che si somma al tempo di download del font stesso. <link rel="preload"> dice al browser di iniziare il download subito, in parallelo, senza aspettare quella scoperta tardiva.

<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin="anonymous">

L'attributo crossorigin qui non è opzionale: MDN specifica che i font vengono sempre recuperati in modalità CORS anonima, e senza crossorigin il preload viene semplicemente ignorato e il font ri-scaricato da capo.

Usa preload solo per i font davvero critici (di solito uno, il testo principale): precaricare troppi font fa concorrenza di banda alle altre risorse e vanifica il vantaggio.

Fonte: MDN Web Docs: «rel=preload»: font e fetch richiedono l'attributo crossorigin per essere considerati validi dal browser.

4. Self-hosting vs CDN

Google Fonts via CDN è comodo: una riga di <link> e il font è pronto, con aggiornamenti gestiti automaticamente. Il costo tecnico verificabile: il browser deve aprire una connessione separata verso un dominio esterno (fonts.gstatic.com), con la sua risoluzione DNS e handshake, prima ancora di iniziare il download del font.

Il self-hosting: scaricare i file del font e servirli dal tuo stesso dominio con @font-face, elimina quella connessione esterna aggiuntiva, e ti dà controllo diretto su font-display, subsetting e preload. Il costo è occuparci degli aggiornamenti e conversione dei formati.

In sintesi

Tecnica Cosa fa Perché conta
font-display: swap Mostra subito un font di riserva Non blocca il rendering della pagina
Subset Riduce fisicamente i glifi nel file unicode-range da solo non basta
preload Anticipa il download del font critico Richiede sempre crossorigin
Self-hosting Elimina la connessione a un CDN esterno In cambio di gestione manuale

Nessuna di queste tecniche vale da sola: font-display: swap senza subsetting scarica comunque un file enorme, e il preload senza crossorigin non serve a niente. La velocità dei font nasce dalla somma di piccole scelte corrette, non da una sola.

Accedi o registrati per votare, salvare o commentare la pillola

Commenti (0)

Registrati per commentare, fare domande e proporre l'argomento della prossima pillola (oppure accedi se hai già un account).

Nessun commento. Sii il primo a scrivere qualcosa.

Pillole correlate