Hébergez vos polices Google sans effort avec Laravel

Pensez à héberger vos polices Google sur votre serveur : vous gagnerez en vitesse de chargement et vous serez en règle avec le RGPD. Je vous donne ma méthode dans cet article.

Hébergez vos polices Google sans effort avec Laravel

Google Fonts héberge un catalogue impressionnant de polices mais s’en remettre à lui n’est pas sans risques. En hébergeant les polices sur un domaine externe les navigateurs doivent effectuer une recherche DNS supplémentaire. Cela ralentit donc le chargement initial de la page.

En outre, comme vous dirigez vos visiteurs vers les serveurs de Google deux problèmes apparaissent :

  • les utilisateurs soucieux de leur vie privée n’apprécieront certainement pas cette pratique
  • vous enfreignez le RGPD (les produits Google ne sont plus bien vus, Google Analytics en a fait les frais tout début 2022)

Vous pouvez télécharger des polices à partir de Google Fonts et les héberger vous-même, mais cela demande plus de travail que d’intégrer un simple code HTML / CSS. Et je ne vous parle pas des mises à jour, une vraie corvée.

Il existe une solution !

J’utilise sur mon blog une solution qui permet de rendre la gestion des polices Google simple comme bonjour.

Simplifiez l’hébergement de vos polices

Le paquet spatie/laravel-google-fonts rend l’auto-hébergement des polices Google aussi simple que possible pour les utilisateurs de Laravel.

Par exemple :

// config/google-fonts.php
 
return [
'fonts' => [
'default' => 'https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,700;1,400;1,700&display=swap',
'mono' => 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,700;1,400&display=swap',
],
];
// resources/views/layouts/app.blade.php
 
<head>
// Chargement de la police Inter
@googlefonts
 
// Chargement de la police IBM Plex Mono
@googlefonts('mono')
</head>

Lorsque des polices sont demandées pour la première fois le paquet récupère le CSS, extrait les polices des serveurs de Google, les stocke localement et rend le CSS en ligne dans la balise de votre application.

Si un problème survient au cours de ce processus le paquet se rabat sur une balise pour charger les polices à partir de Google.

Installation

Tout d’abord il faut installer le paquet via Composer :

composer require spatie/laravel-google-fonts

Configuration

Il est possible de modifier la configuration par défaut en publiant le fichier :

php artisan vendor:publish --provider="Spatie\GoogleFonts\GoogleFontsServiceProvider" --tag="google-fonts-config"

Voici à quoi ressemble le fichier initial :

return [
 
/*
* Here you can register fonts to call from the @ googlefonts Blade directive.
* The google-fonts:fetch command will prefetch these fonts.
*/
'fonts' => [
'default' => 'https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,400;0,700;1,400;1,700',
],
 
/*
* This disk will be used to store local Google Fonts. The public disk
* is the default because it can be served over HTTP with storage:link.
*/
'disk' => 'public',
 
/*
* Prepend all files that are written to the selected disk with this path.
* This allows separating the fonts from other data in the public disk.
*/
'path' => 'fonts',
 
/*
* By default, CSS will be inlined to reduce the amount of round trips
* browsers need to make in order to load the requested font files.
*/
'inline' => true,
 
/*
* When something goes wrong fonts are loaded directly from Google.
* With fallback disabled, this package will throw an exception.
*/
'fallback' => ! env('APP_DEBUG'),
 
/*
* This user agent will be used to request the stylesheet from Google Fonts.
* This is the Safari 14 user agent that only targets modern browsers. If
* you want to target older browsers, use different user agent string.
*/
'user_agent' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15',
 
];

Utilisation

Pour charger les polices dans votre application il faut enregistrer une URL d’intégration de Google Fonts et ensuite les charger avec la directive @googlefonts dans une vue Blade.

Ici je vais récupérer la police Montserrat en version italique, gras, épaisseur 400 et 600 :

// config/google-fonts.php
 
return [
'fonts' => [
'default' => 'https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,400;0,600;1,400;1,600&display=swap',
],
];

Puis la charger dans mon layout :

// resources/views/layouts/app.blade.php
 
<head>
// Je charge ma police par défaut (Montserrat)
@googlefonts
</head>

Ce simple morceau de code permet d’intégrer le CSS directement dans la balise . Si vous préférez un fichier CSS externe vous pouvez désactiver l’option inline dans la configuration du paquet.

Les polices sont stockées dans un dossier “fonts” sur le disque public par défaut. Si vous souhaitez servir des polices à partir d’un CDN vous pouvez mettre en place une configuration de disque différente.

Précharger les polices avec Artisan

Si vous voulez vous assurer que les polices sont prêtes à l’emploi avant que quelqu’un ne visite votre site vous pouvez les récupérer et les stocker à l’aide de cette commande :

php artisan google-fonts:fetch

Mises en garde

Si vous utilisez spatie/laravel-csp

Si vous utilisez spatie/laravel-csp pour gérer votre CSP (Politique de Sécurité du Contenu) vous devez passer un tableau à la directive @googlefonts dans votre vue Blade et ajouter l’option nonce :

// resources/views/layouts/app.blade.php
<head>
// Je charge ma police par défaut (Montserrat)
- @googlefonts
+ @googlefonts(['nonce' => csp_nonce()])
</head>

À propos des anciens navigateurs

Les serveurs de Google Fonts analysent l’en-tête de l’agent utilisateur du visiteur pour déterminer le format de police à utiliser. Cela signifie que les polices fonctionnent dans tous les navigateurs modernes comme anciens.

Ce paquet n’est pas en mesure de s’adapter aux différents agents utilisateurs. Avec la configuration par défaut, seuls les navigateurs capables de gérer les fichiers de police WOFF 2.0 sont pris en charge.

Si vous avez besoin de servir des polices à un ancien navigateur, vous pouvez spécifier une chaîne d’agent utilisateur différente dans la configuration. N’oubliez pas que cela alourdit le chargement de la page pour tous les visiteurs.

Conclusion

La gestion des polices d’écritures sur une application Web est un sujet délicat, j’aime à dire qu’il n’y a pas de bonne solution. Il existe juste une solution adaptée à votre situation.

Contenus associés

Forcer la redirection HTTP vers HTTPS sur Laravel 8, 9 et plus

Votre hébergeur ne propose pas le HTTPS par défaut, vous ne pouvez pas modifier le htaccess… Comment faire ? J’ai LA réponse à vos questions.

Forcer la redirection HTTP vers HTTPS sur Laravel 8, 9 et plus
Laravel Artisan : make - le guide complet

Le framework Laravel dispose d'un ensemble complet de commandes, la plus utilisée étant certainement make. Connaissez-vous toutes les commandes disponibles ?

Laravel Artisan : make - le guide complet
Fonctionnement du blog : pourquoi Laravel et WordPress

J’explique dans cet article pourquoi j’ai choisi Laravel et WordPress comme stack de départ pour le fonctionnement de ce blog.

Fonctionnement du blog : pourquoi Laravel et WordPress
Laravel Eloquent : insertGetId - insérer et récupérer l'ID d'un enregistrement en une ligne

Laravel offre la possibilité d'insérer un enregistrement et de récupérer son ID en une ligne. Cet article vous explique comment faire.

Laravel Eloquent : insertGetId - insérer et récupérer l'ID d'un enregistrement en une ligne
Laravel Livewire : l'importance de sécuriser l'ID de son model

Livewire est un framework pour Laravel qui permet de créer des interfaces dynamiques depuis le backend. Attention tout de même à la sécurité.

Laravel Livewire : l'importance de sécuriser l'ID de son model
Laravel : créer facilement un sitemap

Je vous présente un paquet qui vous permet de générer très facilement un sitemap pour votre site sous Laravel.

Laravel : créer facilement un sitemap