Outils pour utilisateurs

Outils du site


projets:informatique:amelioration_de_mon_site

Amélioration de mon site

Amélioration des performances

Depuis ses débuts, le web s'est alourdi. On a besoin de plus de puissance pour afficher une simple page web que pour lancer Appolo. Je peste régulièrement sur les sites qui mettent trop longtemps avant d'être utilisables. J'ai décidé de me regarder le nombril et d'alléger le contenu de mon site pour qu'il soit plus agréable à utiliser.

Pour m'aider dans cette tâche, j'utilise l'outil PageSpeed Insights1) 2) de Google. Un autre indicateur pour vérifier l'embonpoint de son site est l'outil Fit on a Floppy3) qui valide si la page appelée peut être stockée sur une disquette.

Compression des données

L'étape la plus facile à mettre en œuvre est la compression des données entre le serveur et le navigateur afin de réduire la quantité de données transférées. J'utilise Apache comme serveur web, j'ai donc configuré mon fichier .htaccess pour qu'il compresse les données compressibles 4). Pour cela, j'utilise mod_deflate pour le HTML, le CSS, le JS et le XML 5). J'ai donc ajouté les lignes suivantes dans mon fichier :

AddType text/css .css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/xml

J'ai ensuite vérifié que le contenu fourni était correctement compressé avec cet outil et que j'avais amélioré mon score sur PageSpeed Insights. C'est concluant, alors on passe à l'étape suivante.

Changement de thème

J'ai troqué le thème bootstrap pour le thème lanyon qui utilise beaucoup moins de fichiers. J'ai du abandonner quelques effets supportés par le précédent thème mais ce n'est pas trop grave car j'y ai gagné en lisibilité et en clareté.

Suppression des vidéos

Nikola permet d'inclure une vidéo Youtube par l'intermédiaire d'un mot-clé. Cela inclus automatiquement le lecteur de vidéo avec son lot de dépendances6). Comme l'usage de la vidéo sur mon site est très limité et que dans la plus part des cas, un lien suffit, j'ai remplacé le mot-clé par un lien vers l'original.

C'est un changement très facile qui m'a permis de passer d'un score inférieur à 50 à un score supérieur à 70.

Suppression des appels à Google

Le thème utilisé 7) fait des appels à Google pour la récupération des polices de caractères. Comme je ne suis pas fan de faire des appels aux serveurs de Google 8), je préfère héberger les polices sur mon serveur. Pour cela, j'ai supprimé la ligne correspondante dans le fichier base_helper.tmpl :

<link rel="stylesheet" href="//fonts.googleapis.com/css?family=PT+Serif:400,400italic,700|PT+Sans:400">

Maintenant le site utilise les polices disponibles dans le navigateur. Comme je veux toujours utiliser la police PT, j'ai téléchargé les fichiers TrueType associés dans le répertoire de polices de mon site. J'ai ensuite modifié les fichiers de style pour reproduire ce que faisait Google.

/* latin-ext */
@font-face {
    font-family: 'PT Sans';
    font-style: normal;
    font-weight: 400;
    src: local('PT Sans'), local('PTSans-Regular'), url(../fonts/PT_Sans/PT_Sans-Web-Regular.ttf) format('truetype');
    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: 'PT Sans';
    font-style: normal;
    font-weight: 400;
    src: local('PT Sans'), local('PTSans-Regular'), url(../fonts/PT_Sans/PT_Sans-Web-Regular.ttf) format('truetype');
    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;
}
/* latin-ext */
@font-face {
    font-family: 'PT Serif';
    font-style: italic;
    font-weight: 400;
    src: local('PT Serif Italic'), local('PTSerif-Italic'), url(../fonts/PT_Serif/PT_Serif-Web-Italic.ttf) format('truetype');
    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: 'PT Serif';
    font-style: italic;
    font-weight: 400;
    src: local('PT Serif Italic'), local('PTSerif-Italic'), url(../fonts/PT_Serif/PT_Serif-Web-Italic.ttf) format('truetype');
    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;
}
/* latin-ext */
@font-face {
    font-family: 'PT Serif';
    font-style: normal;
    font-weight: 400;
    src: local('PT Serif'), local('PTSerif-Regular'), url(../fonts/PT_Serif/PT_Serif-Web-Regular.ttf) format('truetype');
    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: 'PT Serif';
    font-style: normal;
    font-weight: 400;
    src: local('PT Serif'), local('PTSerif-Regular'), url(../fonts/PT_Serif/PT_Serif-Web-Regular.ttf) format('truetype');
    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;
}
/* latin-ext */
@font-face {
    font-family: 'PT Serif';
    font-style: normal;
    font-weight: 700;
    src: local('PT Serif Bold'), local('PTSerif-Bold'), url(../fonts/PT_Serif/PT_Serif-Web-Bold.ttf) format('truetype');
    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: 'PT Serif';
    font-style: normal;
    font-weight: 700;
    src: local('PT Serif Bold'), local('PTSerif-Bold'), url(../fonts/PT_Serif/PT_Serif-Web-Bold.ttf) format('truetype');
    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;
}

Pour optimiser les temps de chargement, j'ai ajouté une directive dans le fichier .htaccess pour prendre en charge la compression des polices :

AddType font/truetype .ttf
AddOutputFilterByType DEFLATE font/truetype

Ces opérations ne changent pas vraiment la performance générale du site, mais il me permet de ne pas dépendre de Google.

Ajout d'une politique de cache

Une autre façon d'avoir de meilleures performances est d'activer le cache. Toutes les resources n'ont pas la même durée de vie, il faut donc gérer la durée de rétention en cache en fonction du type de ressource. Dans mon cas, j'ai mis une durée de vie de 1 ans pour les ressources qui ne devraient pas changer (images, polices, documents), 1 semaines pour les resources qui ne changent que rarement (feuilles de style, script) et 6 heures pour le contenu du site. Pour cela, j'ai ajouté la configuration suivante dans mon fichier .htaccess :

<FilesMatch "\.(ico|pdf|jpg|jpeg|png|ttf)$">
Header set Cache-Control "max-age=31449600, public"
</FilesMatch>
<FilesMatch "\.(css|js)$">
Header set Cache-Control "max-age=604800, public, must-revalidate"
</FilesMatch>
<FilesMatch "\.(html|htm|xml)$">
Header set Cache-Control "max-age=32400, must-revalidate"
</FilesMatch>

À partir de ce moment, mon indice de performance est supérieur à 85.

Minimiser le nombre d'appels

Le site utilise plusieurs feuilles de style ainsi que plusieurs fichiers de script. Il est possible de les regrouper ce qui a pour effet de limiter le nombre d'appel, limiter le nombre de compression/décompression et donc de rendre le site plus réactif. Avec nikola, rien de plus simple. Il suffit d'activer la configuration suivante dans le fichier conf.py :

USE_BUNDLES = True

Il faudra, au préalable, installer le paquet webassets pour que cela fonctionne correctement :

pip install webassets

À partir de ce moment, mon indice de performance avoisine les 95.

Attention, pour que les fichiers custom.css et fonts.css soient ajoutés au fichier généré, il faut les ajouter dans le fichier de configuration bundles.

Il faut éviter l'utililation de l'import de fichier en CSS (@import) car cela force le navigateur a charger les fichiers séquentiellement.

Minifier les fichiers

Pour limiter la taille de certains fichiers transférés, il est possible d'en supprimer les espaces non-significatifs 9). Pour cela, j'ai utilisé des filtres déclenchés à la fin du traitement de compilation pour traiter les fichiers CSS et les fichiers XML. Comme ces filtres sont fournis avec Nikola, il suffit de les activer dans la configuration. Dans le fichier conf.py, il faut ajouter les lignes suivantes :

FILTERS = {
    ".css": ["filters.cssminify"],
    ".xml": ["filters.xmlminify"],
}

Il est important d'avoir une connexion à Internet car le filtre filters.cssminify utilise un service externe pour supprimer les espaces non-significatifs.

Suppression du JS

J'utilise le javascript uniquement pour l'interprétation du LaTeX situé dans certaines pages. Les autres appels sont donc inutiles. J'ai modifié le thème lanyon pour supprimer tous ces appels :

  • Suppression de la définition de la méthode late_load_js dans base_helper.tmpl.
  • Suppression de l'appel conditionnel de javascript pour Internet Explorer 9 dans base_helper.tmpl.
  • Suppression de l'appel de la méthode late_load_js dans base.tmpl.
  • Suppression de l'appel de javascript supplémentaire dans base.tmpl.

Amélioration de la sécurité

Après être tombé par hasard sur le site Security Headers10), je me suis rendu compte que ma note était vraiment basse. En fait, je n'avais jamais prêté attention aux entêtes envoyés par mon serveur et je n'avais même jamais entendu parlé de ces entêtes.

J'ai donc décidé d'y remédier et porter attention à la sécurité de mes visiteurs. Pour cela, j'ai modifié mon fichier .htaccess en ajoutant les directives suivantes :

Header set Content-Security-Policy "default-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' cdnjs.cloudflare.com; font-src 'self' cdnjs.cloudflare.com; img-src 'self' data:; style-src 'self' 'unsafe-inline'; base-uri 'self'; connect-src 'self'; form-action 'self'; media-src 'self'; frame-src embed.diagrams.net; worker-src embed.diagrams.net"
Header set Permissions-Policy "interest-cohort=()"
Header set Referrer-Policy "no-referrer"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"

Content-Security-Policy permet de gérer la manière dont les ressources du site peuvent être chargées. Ces permissions sont encore un peu trop large à mon goût car je suis encore obligé d'autoriser cloudflare.com11). Pour plus d'informations, il y a le MDN et le guide de référence. 12)
Permissions-Policy permet de gérer les autorisations d'accès aux API du navigateur. Ici, je l'ai configuré pour bloquer l'accès à la nouvelle technologie de pistage de Google. Pour plus d'informations, il y a ce site et ce site qui en parlent mieux que je ne pourrais le faire.
Referrer-Policy permet de gérer les informations transmises lors de l'ouverture d'un lien externe au site. Ici, je l'ai configuré pour ne rien envoyer. Pour plus d'informations, il y a le MDN.
Strict-Transport-Security indique au navigateur d'utiliser uniquement HTTPS pour accéder au site. Ici, je l'ai configuré avec la valeur recommandée. Pour plus d'informations, il y a le MDN.
X-Content-Type-Options indique au navigateur de ne pas modifier les types MIME envoyés par le serveur. Pour plus d'informations, il y a le MDN.
X-Frame-Options indique au navigateur si le site peut être inclus dans un autre site. Pour plus d'informations, il y a le MDN.

Amélioration de l'accessibilité

Après avoir fait quelques recherches sur l'accessibilité des sites web, je me suis rendu compte que le mien pouvait être très largement amélioré. Voici la liste des choses que j'ai faite pour améliorer mes scores sur différents outils :

  • Ajout de description alternative 13)sur les balises img.
  • Augmentation du contraste du texte.
  • Modification des liens pour éviter les redirections permanentes 14), j'ai modifié l'ensemble des liens dans le fichier conf.py pour qu'ils dirigent vers la vraie URL.
  • Utilisation d'images en JPG Progressif à l'aide d'un filtre déclenché en fin de traitement. Ce filtre est à configurer dans le fichier conf.py :
    FILTERS = {
        ".jpg": ["jpegoptim --strip-all --all-progressive %s"],
    }
  • Suppression des identifiants dupliqués à l'aide d'un filtre déclenché en fin de traitement. Ce filtre est à configurer dans le fichier conf.py :
    FILTERS = {
        ".html": ["filters.deduplicate_ids"],
    }

Pour identifier et corriger les problèmes d'accessibilité de mon site, j'ai utilisé les outils suivants :

2)
Attention à autoriser le referer pour pouvoir l'utiliser
4)
on oublie toutes les données déjà optimisées comme les images
5)
pour le flux RSS
6)
CSS, JS et trackers
7)
lanyon
8)
profilage, etc
9)
C'est l'action minify en anglais
11)
Nécessaire pour MathJax jusqu'au jour où j'arrive à le faire fonctionner directement sur mon site
12)
Cet entête m'a causé quelques soucis car il a été appliqué également sur le wiki. Je n'en ai pas eu conscience jusqu'au moment où j'ai essayé d'y intégrer des vidéos. Il me manquait la règle autorisant les médias, à savoir media-src. Ce fut un beau casse-tête à résoudre.
13)
Attribut alt de la balise img
projets/informatique/amelioration_de_mon_site.txt · Dernière modification : 2021/11/17 05:19 de alexis