Bonnes pratiques concernant les polices

Optimiser les polices Web pour les métriques Core Web Vitals.

Cet article présente les bonnes pratiques en termes de performances pour les polices. Les polices Web ont un impact sur les performances de plusieurs façons :

Cet article se divise en trois sections : chargement des polices, diffusion des polices et affichage des polices. Chaque section explique le fonctionnement de cet aspect particulier du cycle de vie des polices et fournit les bonnes pratiques correspondantes.

Chargement des polices

Les polices sont généralement des ressources importantes, car sans elles, l'utilisateur risque de ne pas pouvoir afficher le contenu de la page. Par conséquent, les bonnes pratiques de chargement des polices consistent généralement à s'assurer qu'elles sont chargées le plus tôt possible. Les polices chargées à partir de sites tiers doivent faire l'objet d'une attention particulière, car le téléchargement de ces fichiers de polices nécessite des configurations de connexion distinctes.

Si vous ne savez pas si les polices de votre page sont demandées à temps, consultez l'onglet Timing (Temps) du panneau Network (Réseau) dans les outils de développement Chrome pour en savoir plus.

Capture d'écran de l'onglet "Timing" (Temps) dans DevTools

Fonctionnement de @font-face

Avant de découvrir les bonnes pratiques de chargement des polices, il est important de comprendre le fonctionnement de @font-face et son impact sur le chargement des polices.

La déclaration @font-face est essentielle pour utiliser n'importe quelle police Web. Au minimum, il déclare le nom qui sera utilisé pour faire référence à la police et indique l'emplacement du fichier de police correspondant.

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

Il est courant de penser qu'une police est demandée lorsqu'une déclaration @font-face est rencontrée. Ce n'est pas le cas. La déclaration @font-face ne déclenche pas le téléchargement de polices par elle-même. À la place, une police n'est téléchargée que si elle est référencée par le style utilisé sur la page. Par exemple :

@font-face {
  font-family: "Open Sans";
  src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
}

h1 {
  font-family: "Open Sans"
}

En d'autres termes, dans l'exemple ci-dessus, Open Sans ne serait téléchargé que si la page contenait un élément <h1>.

Par conséquent, lorsque vous réfléchissez à l'optimisation des polices, il est important de prêter autant d'attention aux feuilles de style qu'aux fichiers de polices eux-mêmes. La modification du contenu ou de la diffusion des feuilles de style peut avoir un impact significatif sur le moment où les polices arrivent. De même, supprimer le CSS inutilisé et diviser les feuilles de style peut réduire le nombre de polices chargées par une page.

Déclarations de polices intégrées

La plupart des sites gagneraient à intégrer les déclarations de polices et d'autres styles essentiels dans le <head> du document principal plutôt que de les inclure dans une feuille de style externe. Cela permet au navigateur de découvrir les déclarations de police plus tôt, car il n'a pas besoin d'attendre le téléchargement de la feuille de style externe.

<head>
  <style>
    @font-face {
        font-family: "Open Sans";
        src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
    }

    body {
        font-family: "Open Sans";
    }

    ...etc.

  </style>
</head>

L'intégration en ligne du CSS essentiel peut être une technique plus avancée que tous les sites ne pourront pas mettre en œuvre. Les avantages en termes de performances sont clairs, mais des processus et des outils de compilation supplémentaires sont nécessaires pour s'assurer que le CSS nécessaire (et idéalement, uniquement le CSS critique) est correctement intégré et que tout CSS supplémentaire est diffusé sans bloquer le rendu.

Se préconnecter aux origines tierces critiques

Si votre site charge des polices à partir d'un site tiers, nous vous recommandons vivement d'utiliser l'indice de ressource preconnect pour établir une ou plusieurs connexions anticipées avec l'origine tierce. Les indices de ressources doivent être placés dans le <head> du document. L'indice de ressource ci-dessous configure une connexion pour charger la feuille de style de police.

<head>
  <link rel="preconnect" href="https://fonts.com">
</head>

Pour préconnecter la connexion utilisée pour télécharger le fichier de police, ajoutez un indice de ressource preconnect distinct qui utilise l'attribut crossorigin. Contrairement aux feuilles de style, les fichiers de polices doivent être envoyés via une connexion CORS.

<head>
  <link rel="preconnect" href="https://fonts.com">
  <link rel="preconnect" href="https://fonts.com" crossorigin>
</head>

Lorsque vous utilisez l'indice de ressource preconnect, n'oubliez pas qu'un fournisseur de polices peut diffuser des feuilles de style et des polices d'origines distinctes. Par exemple, voici comment l'indice de ressource preconnect est utilisé pour Google Fonts.

<head>
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
</head>

Soyez prudent lorsque vous utilisez preload pour charger des polices.

Bien que preload soit très efficace pour rendre les polices visibles au début du processus de chargement de la page, cela a pour effet de supprimer des ressources du navigateur au lieu de charger d'autres ressources.

Il peut être plus efficace d'intégrer les déclarations de police et d'ajuster les feuilles de style. Ces ajustements se rapprochent de la cause première des polices découvertes tardivement, au lieu de simplement fournir une solution de contournement.

En outre, l'utilisation de preload comme stratégie de chargement de police doit être utilisée avec précaution, car elle contourne certaines stratégies de négociation de contenu intégrées au navigateur. Par exemple, preload ignore les déclarations unicode-range et, si elle est utilisée avec prudence, ne doit être utilisée que pour charger un seul format de police.

Toutefois, lorsque vous utilisez des feuilles de style externes, le préchargement des polices les plus importantes peut être très efficace, car le navigateur ne découvrira pas si la police est nécessaire avant bien plus tard.

Livraison de polices

Une diffusion plus rapide des polices permet d'accélérer le rendu du texte. De plus, si une police est livrée suffisamment tôt, cela peut aider à éliminer les décalages de mise en page dus au remplacement de la police.

Utiliser des polices autogérées

Sur le papier, l'utilisation d'une police auto-hébergée devrait offrir de meilleures performances, car elle élimine la configuration de connexion tierce. Toutefois, en pratique, les différences de performances entre ces deux options sont moins nettes : par exemple, l'Web Almanac a constaté que les sites utilisant des polices tierces affichaient un rendu plus rapide que ceux qui utilisaient des polices first party.

Si vous envisagez d'utiliser des polices auto-hébergées, vérifiez que votre site utilise un réseau de diffusion de contenu (CDN) et HTTP/2. Sans ces technologies, il est beaucoup moins probable que les polices auto-hébergées offrent de meilleures performances. Pour en savoir plus, consultez la page Réseaux de diffusion de contenu.

Si vous utilisez une police auto-hébergée, nous vous recommandons d'appliquer également certaines des optimisations de fichiers de polices que les fournisseurs de polices tiers fournissent généralement automatiquement, par exemple le sous-ensemble de polices et la compression WOFF2. L'effort requis pour appliquer ces optimisations dépendra dans une certaine mesure des langues disponibles sur votre site. En particulier, sachez que l'optimisation des polices pour les langues CJK peut s'avérer particulièrement difficile.

Utiliser WOFF2

Parmi les polices modernes, WOFF2 est la plus récente, la plus compatible avec les navigateurs et la plus compressée. Comme il utilise Brotli, WOFF2 compresse les fichiers de 30 % mieux que WOFF, ce qui réduit le nombre de données à télécharger et améliore les performances.

Compte tenu de la compatibilité des navigateurs, les experts recommandent désormais de n'utiliser que WOFF2 :

Nous pensons qu'il est également temps de proclamer : "N'utilisez que WOFF2 et oubliez tout le reste".

Cela simplifiera considérablement votre CSS et votre workflow, et évitera tout téléchargement accidentel de polices en double ou incorrect. WOFF2 est désormais compatible partout. Par conséquent, sauf si vous devez prendre en charge des navigateurs très anciens, utilisez simplement WOFF2. Si cela n'est pas possible, envisagez de ne diffuser aucune police Web sur ces anciens navigateurs. Ce ne sera pas un problème si vous avez mis en place une stratégie de remplacement robuste. Les visiteurs utilisant des navigateurs plus anciens ne verront que vos polices de remplacement.

Bram Stein, dans l'Almanach Web 2022

Polices de sous-ensembles

Les fichiers de police comprennent généralement un grand nombre de glyphes pour tous les caractères qu'ils acceptent. Toutefois, vous n'avez peut-être pas besoin de tous les caractères sur votre page. Vous pouvez donc réduire la taille des fichiers de polices en créant des sous-ensembles de polices.

Le descripteur unicode-range dans la déclaration @font-face indique au navigateur les caractères pour lesquels une police peut être utilisée.

@font-face {
    font-family: "Open Sans";
    src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2");
    unicode-range: U+0025-00FF;
}

Un fichier de police est téléchargé si la page contient un ou plusieurs caractères correspondant à la plage Unicode. unicode-range est généralement utilisé pour diffuser différents fichiers de police en fonction de la langue utilisée par le contenu de la page.

unicode-range est souvent utilisé conjointement avec la technique de sous-ensemble. Un sous-ensemble de police inclut une plus petite partie des glyphes contenus dans le fichier de police d'origine. Par exemple, au lieu de diffuser tous les caractères auprès de tous les utilisateurs, un site peut générer des polices de sous-ensembles distinctes pour les caractères latins et cyrilliques. Le nombre de glyphes par police varie considérablement : les polices latines comptent généralement entre 100 et 1 000 glyphes, tandis que les polices CJK peuvent comporter plus de 10 000 caractères. La suppression des glyphes inutilisés peut considérablement réduire la taille du fichier d'une police.

Certains fournisseurs de polices peuvent fournir automatiquement différentes versions de fichiers de polices avec différents sous-ensembles. Par exemple, Google Fonts effectue cette opération par défaut :

/* devanagari */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJbecnFHGPezSQ.woff2) format('woff2');
  unicode-range: U+0900-097F, U+1CD0-1CF6, U+1CF8-1CF9, U+200C-200D, U+20A8, U+20B9, U+25CC, U+A830-A839, U+A8E0-A8FB;
}
/* latin-ext */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJnecnFHGPezSQ.woff2) format('woff2');
  unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
  font-family: 'Poppins';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(https://fonts.gstatic.com/s/poppins/v20/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2) format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

Lorsque vous passez à l'auto-hébergement, cette optimisation peut facilement être négligée et entraîner des fichiers de polices plus volumineux en local.

Il est également possible de sous-définir manuellement des polices si votre fournisseur de polices le permet, soit via une API (Google Fonts le permet en fournissant un paramètre text), soit en modifiant manuellement les fichiers de polices, puis en les hébergeant vous-même. Les outils de génération de sous-ensembles de polices incluent subfont et glyphanger. Toutefois, vérifiez que la licence des polices que vous utilisez autorise le sous-titrage et l'hébergement par vous-même.

Utiliser moins de polices Web

La police la plus rapide à diffuser est celle qui n'est pas demandée au départ. Les polices système et les polices variables sont deux façons de réduire potentiellement le nombre de polices Web utilisées sur votre site.

Une police système est la police par défaut utilisée par l'interface utilisateur de l'appareil d'un utilisateur. Les polices système varient généralement en fonction du système d'exploitation et de la version. Étant donné que la police est déjà installée, il n'est pas nécessaire de la télécharger. Les polices système peuvent être particulièrement adaptées au corps du texte.

Pour utiliser la police du système dans votre CSS, indiquez system-ui comme famille de polices :

font-family: system-ui

L'idée derrière les polices variables est qu'une seule police variable peut remplacer plusieurs fichiers de polices. Les polices variables fonctionnent en définissant un style de police "par défaut" et en fournissant des axes pour manipuler la police. Par exemple, une police variable avec l'axe Weight peut être utilisée pour implémenter des lettres qui nécessitaient auparavant des polices distinctes pour les polices claires, standards, gras et très gras.

Tout le monde ne bénéficiera pas du passage aux polices variables. Les polices variables contiennent de nombreux styles. Elles ont donc généralement une taille de fichier plus importante que les polices non variables individuelles qui ne contiennent qu'un seul style. Les sites qui bénéficieront le plus de l'utilisation de polices variables sont ceux qui utilisent (et doivent utiliser) différents styles et épaisseurs de police.

Rendu des polices

Lorsqu'il est confronté à une police Web qui n'a pas encore été chargée, le navigateur se trouve face à un dilemme : doit-il attendre que la police Web soit disponible avant d'afficher le texte ? Ou doit-il afficher le texte dans une police de remplacement jusqu'à ce que la police Web arrive ?

Les navigateurs gèrent ce scénario différemment. Par défaut, les navigateurs Chromium et Firefox bloquent l'affichage du texte pendant trois secondes maximum si la police Web associée n'est pas chargée. Safari bloque l'affichage du texte indéfiniment.

Ce comportement peut être configuré à l'aide de l'attribut font-display. Ce choix peut avoir des conséquences importantes : font-display peut avoir un impact sur la LCP, la FCP et la stabilité de la mise en page.

Choisir une stratégie font-display appropriée

font-display indique au navigateur comment procéder au rendu du texte lorsque la police Web associée n'a pas été chargée. Il est défini par police.

@font-face {
  font-family: Roboto, Sans-Serif
  src: url(/fonts/roboto.woff) format('woff'),
  font-display: swap;
}

font-display peut prendre cinq valeurs :

Valeur Période de blocage Période d'échange
Auto Varie selon le navigateur Varie selon le navigateur
Bloquer 2 à 3 secondes Infini
Intervertir 0 ms Infini
Action de remplacement 100ms 3 secondes
Facultatif 100ms Aucun
  • Période de blocage : la période de blocage commence lorsque le navigateur demande une police Web. Pendant la période de blocage, si la police Web n'est pas disponible, elle est affichée dans une police de remplacement invisible. Le texte n'est donc pas visible par l'utilisateur. Si la police n'est pas disponible à la fin de la période de blocage, elle sera affichée dans la police de remplacement.
  • Période de swap : la période de swap suit la période de blocage. Si la police Web devient disponible pendant la période de remplacement, elle sera "remplacée".

Les stratégies font-display reflètent différents points de vue sur le compromis entre performances et esthétique. Il est donc difficile de recommander une approche, car elle dépend des préférences individuelles, de l'importance de la police Web pour la page et la marque, et de l'impact d'une police tardive lorsqu'elle est remplacée.

Pour la plupart des sites, voici les trois stratégies qui s'appliquent le mieux:

  • Si les performances sont une priorité : utilisez font-display: optional. Il s'agit de l'approche la plus "performante" : l'affichage du texte est retardé de 100 ms maximum, et nous avons l'assurance qu'il n'y aura pas de décalage de mise en page lié au changement de police. Cependant, l'inconvénient est que la police Web ne sera pas utilisée si elle arrive en retard.

  • Si l'affichage rapide du texte est une priorité absolue, mais que vous souhaitez tout de même vous assurer que la police Web est utilisée : utilisez font-display: swap, mais veillez à envoyer la police suffisamment tôt pour qu'elle ne provoque pas de décalage de mise en page. L'inconvénient de cette option est le décalage troublant qui survient lorsque la police arrive en retard.

  • Si vous avez pour priorité de vous assurer que le texte s'affiche dans une police Web:utilisez font-display: block, mais assurez-vous de diffuser la police suffisamment tôt pour réduire le retard du texte. L'inconvénient est que l'affichage initial du texte sera retardé. Notez que malgré cet affichage, il peut toujours entraîner un décalage de mise en page, car le texte est en réalité dessiné invisible. L'espace de police de remplacement est donc utilisé pour réserver l'espace. Une fois la police Web chargée, cela peut nécessiter un espace différent et donc un décalage. Toutefois, ce changement peut être moins choquant que font-display: swap, car le texte lui-même ne semble pas bouger.

N'oubliez pas que ces deux approches peuvent être combinées : par exemple, utilisez font-display: swap pour le branding et les autres éléments de page visuellement distinctifs, et font-display: optional pour les polices utilisées dans le corps du texte.

Réduire le décalage entre votre police de remplacement et votre police Web

Pour réduire l'impact du CLS, vous pouvez utiliser les nouveaux attributs size-adjust. Pour en savoir plus, consultez l'article sur le CSS size-adjust. Il s'agit d'une fonctionnalité très récente de notre ensemble d'outils. Elle est donc plus avancée et un peu manuelle pour le moment. Mais c'est un outil à tester et à surveiller pour voir s'il s'améliore à l'avenir.

Conclusion

Les polices Web restent un goulot d'étranglement des performances, mais nous disposons d'un éventail croissant d'options pour les optimiser et réduire ce goulot d'étranglement autant que possible.