MilleCheck

Performance mesurée

  • Score
    Lighthouse
  • LCP 2,52s
  • TBT 7,43s
  • CLS 0,00
  • FCP 2,22s
  • SI 8,56s
  • TTFB 0,64s
  • Fullyload 30,49s
plus

Impact
WebPerf

1P 5%

3P 95%

Le + impactant : Pub (62%)

plus

EcoIndex

  • F
  • DOM 1012
  • Poids 2,7 Mo
  • Requêtes 582
plus

Bonnes pratiques de performance

help

Par mail Poser une question

Respect des bonnes pratiques

Performance (53 bonnes pratiques)

Nous listons ici les bonnes pratiques issues de référentiels de performance connus comme YellowLabTools ou Lighthouse, en apportant des commentaires basés sur notre expérience. Si seules les métriques FCP, LCP, SI, TBT et CLS contribuent à votre score de performance Lighthouse, l'amélioration de la qualité du code en respectant les bonnes pratiques ci-dessous devrait probablement améliorer ces cinq métriques. Ainsi, même de manière indirecte, appliquer ces bonnes pratiques améliore votre score de performance Lighthouse, votre SEO au travers des Web Vitals et, au final, l'expérience utilisateur.

Poids 54

Voir l'analyse

Le poids est un critère révélateur de beaucoup de choses.
C'est le domaine d'action sur lequel vous devez intervenir en premier lieu. 

#1 Poids/ EcoconceptionLimiter le poids total de la page 19 x 5

Le poids est, selon Artwaï, la métrique la plus importante à surveiller !

En 2022, Web Almanach recensait un poids médian des pages web d'environ 2 Mo. Selon Alex Russell (ingénieur logiciel chez Google), le poids idéal pour qu'une page se charge en moins de 5 secondes est de 500 Ko...

L'objectif "raisonnable" que vous pouvez vous fixer est de rester sous 1 Mo, ce qui est déjà très long à télécharger sur une connexion lente.

Maîtriser le poids de vos pages est aussi une bonne pratique en termes d'éco-conception et compte pour le calcul de l'écoindex. En effet, le poids et le temps d’exécution, en étant plus légers, seront moins gourmands en énergie. Par exemple : en nettoyant son code JavaScript, Wikipédia a économisé 4,3 téraoctets par jour de bande passante de données pour ses visiteurs. L’équivalent de 700 arbres à planter pour faire face à la pollution annuelle qui en aurait résulté.

Quelques articles sur le sujet : 

Poids total

2,71 Mo 1.5 3 5

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Évitez les énormes charges utiles du réseau

#2 Poids/ EcoconceptionOptimiser les images 100 x 2

L'optimisation des images est généralement l'un des moyens les plus simples de réduire le poids d'une page et, par conséquent, le temps de chargement de la page.

La compression est donc l’étape essentielle pour optimiser les images. Elle sert à réduire la redondance des données d’une image afin de pouvoir l’emmagasiner en occupant moins de place.

  • Il y a la compression avec perte de données, où l’image devient plus floue à mesure qu’elle est compressée ;
  • et la compression sans perte, où les traits de l’image restent nets.

Il faut trouver le bon rapport qualité/compression qui satisfasse à vos besoins.

N'utilisez pas Photoshop ou d'autres outils d'édition d'images, car ils ne sont pas très bons pour l'optimisation. Utilisez des outils spécialisés comme Kraken.io ou l'excellent ImageOptim sur Mac. Pour les images SVG, vous pouvez utiliser SVGOMG.

Article sur le sujet : 

Gain estimé en optimisant les images

13,43 Ko 20 200 300

Avec YellowLabTools, on mesure le nombre d'octets qui pourraient être économisés en optimisant les images.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#080

#3 Poids/ EcoconceptionDimensionner correctement les images 96 x 1

Idéalement, votre page ne doit jamais diffuser d'images plus grandes que la version affichée sur l'écran de l'utilisateur. La règle de base est de dimensionner l’image à sa taille réelle d’affichage. Vous pouvez très bien avoir une image de 1000 px x 1000 px affichée en 100 px x 100 px. Du coup, en exagérant, votre image est 10 fois plus lourde que nécessaire. 

Ainsi, tout ce qui est plus grand que cela entraîne simplement des octets gaspillés et ralentit le temps de chargement de la page. 

La principale stratégie pour diffuser des images de taille appropriée est appelée "images responsives". Avec les images responsives, vous générez plusieurs versions de chaque image, puis spécifiez la version à utiliser dans votre code HTML ou CSS à l'aide des requêtes multimédia, des dimensions de la fenêtre d'affichage. 

De plus, il se peut que l'attribut "sizes"  liés aux "srcset" d'une image responsive soit incorrect. Cela peut entrainer un mauvais choix d'image chargée, donc potentiellement plus de poids ou une dégradation de l'image affichée.  Pour contrôler cet aspect vous pouvez utilisez  dans Chrome, l'extension Responsive Image Linter qui vérifie chaque image de la page.

Article sur le sujet : 

Gain potentiel

14,8 Ko 2 300 500

Avec la YellowLabTools, on compare le nombre de pixels dans une image chargée au nombre de pixels physiques sur lesquels elle est affichée, pour en déduire le nombre de Ko qui pourraient être économisés.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Images correctement dimensionnées, CNumR - BP#034, Opquast règle n°114

#4 Poids/ EcoconceptionActiver la compression 93 x 2

Les ressources textuelles type CSS ou JS doivent être servies avec compression pour minimiser le nombre total d'octets réseau, c'est-à-dire limiter limiter l’utilisation de la bande passante et améliorer les temps de chargement.  Selon le test, certains fichiers pourraient ne pas être compressés du tout ou être déjà compressés avec Gzip, mais deviendraient encore plus légers avec Brotli.

Tous les principaux systèmes de serveurs sont désormais compatibles avec Brotli.

Consultez la liste des types MIME concernés.

NB : la compression de petits fichiers (< 1 Ko) est discutable et que certains éléments tels que les images ou les polices au format WOFF2 ne doivent pas être compressés, car ils sont déjà inclus dans leur format

Gain estimé de la compression

32,68 Ko 20 200 400

Avec YellowLabTools, on mesure le nombre d'octets qui pourraient être économisés en compressant des fichiers textuels.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR, Opquast.
Article de référence(s) : https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/, CNumR - BP#078, Opquast règle n°219

#5 Poids/ EcoconceptionMinifier les fichiers 34 x 2

Minifier les fichiers textuels type CSS ou JS permet d'économiser du poids. Il s'agit de rendre un programme plus petit, en le compactant, en réduisant la taille de son code. Cela se fait habituellement en supprimant les espaces, les indentations, et en raccourcissant les noms des variables.

Les gains de minification sont généralement faibles, mais l'impact peut être important lorsque ces fichiers texte sont chargés sur le chemin critique ou en priorité.

Vous pouvez le faire manuellement avec un service en ligne pour minifier vos fichiers, ou en automatisant votre flux de déploiement de votre code avec des outils de compilation comme Gulp ou Grunt.

Gain estimé de la minification

41,08 Ko 5 60 120

Avec YellowLabTools, on calcule le poids qui pourrait être économisé si toutes les ressources textuelles étaient correctement modifiées.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, YellowLab Tools, CNumR, Opquast.
Article de référence(s) : https://developer.chrome.com/docs/lighthouse/performance/unminified-css/, https://developer.chrome.com/docs/lighthouse/performance/unminified-javascript/, CNumR - BP#077, Opquast règle n°222, Opquast règle n°223

Requêtes 0

Voir l'analyse

En second lieu, travaillez vos requêtes
pour en diminuer le nombre et améliorer la qualité de leurs en-têtes.

#6 Requêtes/ EcoconceptionLimiter le nombre de requêtes 0 x 2 alerte

Chaque requête ralentit le chargement de la page, surtout sur le protocole HTTP/1, mais aussi un peu sur HTTP/2. En 2022, Web Almanac recensait environ 70 requêtes pour le chargement d'une page web médiane. Notez aussi qu'en situation de mobilité, un navigateur n'a pas une qualité de connexion constante. Limiter le nombre de requêtes permet donc aussi de limiter le risque qu'une ressource ne soit pas chargée correctement.

Il existe plusieurs techniques pour réduire le nombre de requêtes :

  • Concaténer des fichiers JS
  • Concaténer des fichiers CSS
  • Créer des sprites ou des fonts d'icônes pour les icônes
  • Utiliser le lazyload pour les images

Nous excluons volontairement les techniques suivantes de nos recommandations car elles créent souvent d'autres inconvénients : 

  • Incorporer ou intégrer de petits fichiers JS ou CSS dans le HTML
  • Base64 encode de petites images en HTML ou en feuilles de style

Bien évidemment, en réduisant le nombre de requêtes, vous réduisez les impacts environnementaux associés à la réalisation de la réponse.

Nombre de requêtes

582  80 240 320

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR.
Article de référence(s) : CNumR - BP#009

#7 Requêtes/ EcoconceptionLimiter le nombre de domaines différents 0 x 3 alerte

Pour chaque domaine rencontré, le navigateur doit :

  1. Faire une recherche DNS,
  2. Initier une connexion,
  3. Effectuer la négociation SSL,
  4. Et après, répondre à la requête. 

Forcément, plus il y a de domaines, plus cela peut être lent. De plus, généralement, ces différents domaines sont des services tiers dont vous ne maîtrisez ni la réactivité du code, ni le taux de disponibilité. Vous avez donc une dépendance à ces services, voire même un SPOF (Single Point Of Failure : point de défaillance unique, dont le reste du site est dépendant et dont une panne peut entraîner des dysfonctionnements).

Évitez d'avoir de nombreux domaines différents ; la page devrait s'afficher plus rapidement et vous évitez de consommer de la bande passante inutilement.

Une solution simple consiste à rapatrier sur le domaine first-party les ressources qui peuvent l'être. Par exemple, une police de caractères disponible sur fonts.google.com, une librairie JavaScript externe. Il est aussi possible de mettre en place une routine pour récupérer un fichier dépendant de paramètres changeants à intervalles réguliers, comme une CMP.

NB : la technique nommée "domain sharding" n'est plus une bonne pratique.

Nombre de domaines différents

154  12 30 60

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#018

#8 Requêtes/ EcoconceptionEviter les requêtes en erreur 404 100 x 2

Lorsqu'une ressource est demandée à un serveur, celui commence par répondre avec un code de statut HTTP. Ces codes sont envoyés par le serveur HTTP au navigateur afin de permettre à ce dernier de déterminer automatiquement si une requête a réussi, et sinon, de connaître le type d'erreur. Ces codes sont spécifiés dans le document RFC 7231 par l'IETF (Internet Engineering Task Force). 

Une erreur 404 est un code d’erreur HTTP transmis par un serveur web quand une ressource demandée est indisponible ou que le serveur n’arrive pas à la trouver. Les erreurs 404 ne sont jamais mises en cache, donc chaque fois qu'une URL se termine en 404, elle arrive sur le serveur même si elle se trouve derrière un CDN ou un cache de proxy inverse.

Une erreur 404 occupe inutilement le navigateur et le serveur qui doit lui répondre et chercher une ressource qui n'existe pas ou qui n'existe plus.

NB : Cette bonne pratique est recommandée par l'analyste GreenIT Analysis, mais n'a pas son équivalent dans le référentiel du CNumR.

Nombre d'erreurs 404

0 1 1

On mesure ici les requêtes effectués qui répondent en erreur 404 et non pas les liens brisés éventuels de la page disponibles pour l'utilisateur.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Opquast.
Article de référence(s) : Opquast règle n°147

#9 RequêtesNe pas charger plusieurs fois la même ressource à partir d'URLs différentes 0 x 2

Il s'agit du nombre de requêtes qui pourraient être évitées, en raison de fichiers téléchargés qui ont le même contenu mais qui sont chargés à partir d'URL différentes. Attention, on parle d'URLs différentes. Il ne s'agit pas ici d'URLs appelées plusieurs fois.

Comprenez bien que si vous chargez la même image avec 2 URLs différentes, le navigateur les considéra comme 2 fichiers différents et fera donc deux fois le travail pour la récupérer et l'afficher... Il en va de même pour tout autre fichier, notamment les fichiers JavaScript qui, en plus peuvent avoir la particularité de s'exécuter plusieurs fois. 

Bref, essayez de les charger à partir de la même URL.

Nombre de fichiers identiques

0 5 15

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#10 RequêtesEviter les requêtes vides 0 x 3 alerte

Il arrive parfois qu'une requête renvoie une page blanche, autrement appelée un "empty body" ou un corps vide. Cela peut provenir d'une erreur dans le système de cache côté serveur ou tout simplement d'une erreur d'interprétation du code exécuté pour répondre à la demande.

Bien évidemment, cela n'a aucune espèce d'intérêt pour le navigateur qui se retrouve occupé inutilement.

Ce sont probablement les requêtes les plus faciles à supprimer à condition que ce ne soit pas une anomalie ayant un impact fonctionnel par ailleurs.

Nombre de requêtes vides

72  0 1 5

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Avec YellowLabTools, on compte le nombre des requêtes GET qui répondent avec un corps vide.

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#11 Requêtes/ EcoconceptionDifférez le chargement des images hors écran 91 x 2

Envisagez de charger paresseusement (en lazyload) les images sous la ligne de flottaison du viewport , une fois que toutes les ressources critiques ont fini de se charger pour réduire le temps d'interaction. Il s'agit de différer le chargement des images non visibles à l’écran jusqu'au moment où l’utilisateur est susceptible de les voir.  C'est un excellent moyen d'accélérer le temps de chargement initial d'une page tout en économisant de la bande passante.

Nous recommandons d'utiliser le lazyloading natif des image qui fonctionne désormais pour les principaux navigateurs du marché. Ce simple attribut se révèle très efficace. Attention, toutes les images ne doivent pas être lazyloadée avec l'attribut loading="lazy". Pour les images constitutive du LCP ou situées au dessus de la ligne de flottaison, préférez loading="eager" qui priorisera leurs chargements. 

Articles sur le sujet : 

Nombre d'images non "lazyloadées"

1 12 30

Nous comptons le nombre d'images affichées sous la ligne de flottaison du viewport.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR.
Article de référence(s) : Différer les images hors champ, CNumR - BP#037

#12 RequêtesEviter de charger les images invisibles 0 x 1

Cette bonne pratique est légèrement différente de la BP#11 "Différez le chargement des images hors écran". Il s'agit ici des images ou l'un de leurs parents qui ont une propriété display:none.

En effet, même si elles ne sont pas visibles, ces images sont quand même chargées par le navigateur. Vous devez trouver un moyen de les charger en lazyloading, uniquement lorsqu'elles deviennent visibles. 

L'attribut loading="lazy" est une solution possible, mais c'est parfois plus compliqué avec des composants JavaScript, notamment avec des carrousels horizontaux.

Nombre d'images invisibles

17  1 12 30

Avec YellowLabTools, on compte le nombre d'images invisibles avec la propriété CSS display:none, ou leurs éléments parents.

Comme les images affichées en 1x1 pixel ont tendance à être des traceurs, elles sont exclues de cette règle.

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#45 Requêtes/ EcoconceptionUtiliser la version la plus récente du protocole HTTP/2 0 x 2

Les avantages d'HTTP/2 sont multiples :

  • Les demandes et les réponses parallèles multiplexées ne se bloquent pas entre elles.
  • Une seule connexion TCP est utilisée pour assurer une utilisation efficace des ressources réseau malgré la transmission de plusieurs flux de données.
  • Pas besoin d’appliquer des hacks d’optimisation inutiles – tels que les sprites d’images, la concaténation et le domain sharding, entre autres – qui compromettent d’autres domaines de performance du réseau.
  • Temps de latence réduit.
  • Réduction des coûts d’exploitation et d’investissement des ressources réseau et informatiques.

HTTP/2 n'est pas la dernière version du protocole HTTP. HTTP/3 est en cours de déploiement sur de nombreux serveurs et est encore plus rapide !

NB : En dessous de 5 requêtes, les bénéfices de HTTP/2 sont généralement moins importants.

Nombre de requêtes en HTTP/1 au delà de 4 par domaine

57  0 25 100

Lorsqu'un domaine envoie plus de 4 requêtes via HTTP/1, cette métrique compte un point pour chaque nouvelle requête. 

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#4006

#46 Requêtes/ SécuritéUtiliser la version la plus récente du protocole TLS 0 x 2 alerte

TLS est le protocole qui assure la confidentialité des échanges HTTP/S sur Internet entre les utilisateurs et les serveurs. Lorsqu'un serveur et un client communiquent, TLS s'assure qu'aucun tiers ne peut intercepter ni falsifier un message.

Ce protocole est très largement utilisé et la plupart des navigateurs sont aussi des clients TLS. Les versions 1.0 et 1.1 sont obsolètes. Depuis 2020, les navigateurs ne supportent plus ces anciennes versions. En effet, elles ne sont pas sûres, si ce n'est pas le cas il vous faut passer à minima à la version 1.2.

La version 1.3 de TLS en plus d'être plus sécurisée, effectue une négociation "handshake" en moins d'étapes et est donc plus rapide que le TLS 1.2. 

NB : Faire du HTTPS avec la version 1 d'HTTP est une hérésie en termes de performance.

 

Nombre de domaines qui utilisent des versions TLS< 1.3

18  0 5 15

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Compte le nombre de domaines qui utilisent des versions TLS < 1.3. 

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#47 RequêtesEviter les connexions closes 100 x 2

Il se peut que, pour une raison historique, votre serveur soit configuré pour fermer les connexions rapidement, voire immédiatement. En faisant de la sorte, vous privez l'utilisateur des avantages d'une connexion persistante.

Les connexions persistantes réduisent le temps nécessaire pour établir de nouvelles connexions, notamment dans le cadre d'une négociation SSL. Sans cela, la requête suivante est ralentie, car le navigateur doit ouvrir une nouvelle connexion au serveur, ce qui signifie un aller-retour supplémentaire.

Corrigez le problème en définissant un en-tête Keep-Alive sur le serveur coupable. Lorsque Keep-Alive est activé, le client et le serveur conviennent de maintenir la connexion ouverte pour les demandes ou réponses ultérieures. Keep-Alive est généralement activé par défaut sur votre serveur d'origine.

En termes d'écoconception, l'utilisation de connexions persistantes profitera au serveur. En effet, avec moins de requêtes HTTP générées, cela réduit l'utilisation du processeur et de la mémoire du serveur, et donc la consommation d'énergie.

Nombre de connexions closes

0 4 15

Cela compte le nombre de requêtes qui ne maintiennent pas la connexion active (en spécifiant "Connexion : fermer" dans les en-têtes de réponse). Il ne compte une requête que si elle est suivie d'une autre requête sur le même domaine.

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#48 Requêtes/ EcoconceptionLimiter les mises en cache non spécifiées 0 x 1 alerte

La mise en cache des en-têtes fait partie de ces technologies Web qui sont souvent mal configurées. La requête la plus rapide est celle qui n'est pas faite, et les en-têtes de mise en cache vous permettent d'indiquer aux navigateurs quand ils peuvent réutiliser une ressource qu'ils ont déjà téléchargée

C'est particulièrement utile avec les ressources dites statiques comme les images, les fichiers de polices, les fichiers JS et CSS. Lorsqu'aucune mise en cache n'est spécifiée, chaque navigateur la gère différemment. La plupart du temps, il ajoutera automatiquement un cache lui-même, mais de mauvaise qualité. 

Pour régler ce problème, il faut configurer le serveur pour qu'il retourne une des entêtes suivantes : Cache-control ou Expires. 

Vous pouvez combiner cette requête avec ETag ou Last-Modified qui permettent de bypasser l'entête précédente en cas de modification du fichier, afin que le navigateur récupère la version la plus récente du fichier.

Nous recommandons l'usage de Cache-control et ETag plutôt que Expires et Last-Modified.

NB : Même avec un entête ETag, la mise à jour d'un fichier dans le navigateur peut s'avérer compliqué. artwaï recommande d'ajouter un hash dans vos noms de fichiers (et non pas en paramètre dans l'url) pour contrer ce problème.

Nombre de requêtes sans mise en cache spécifiée

410  5 20 40

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Avec YellowLabTools, on vérifie la présence d'au moins une des entêtes HTTP suivantes sur les fichiers statiques (image, CSS et JS) : cache-control, expires, pragma, x-pass-expires ou x-pass-cache-control. Et si la valeur attribuée à un de ces en-têtes est un nombre supérieur à 0.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Servir des ressources statiques avec une politique de cache efficace, CNumR - BP#101, Opquast règle n°220

#49 RequêtesLimiter les mises en cache désactivées 0 x 1 alerte

Les ressources statiques n'ont pas à être actualisées et donc téléchargées régulièrement par le navigateur parcourant votre site. En effet, il est inutile de lui faire télécharger la même image à chaque page...

Pour des besoins de test pendant le développement, il n'est pas rare de désactiver le cache de ces ressources pour profiter des modifications réalisées immédiatement. Mais cela ne doit pas être le comportement de vos pages Web en production. Cela est généralement fait en spécifiant une valeur max-age=0 à l'entête Cache-control ou avec l'entête Pragma: no-cache. 

Evitez de désactiver les mises en cache en définissant une durée de cache à zéro.

Nombre de requêtes avec une mise en cache désactivée

85  2 15 30

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Avec YellowLabTools, on liste le nombre de requêtes de fichiers statiques (image, JS et CSS) avec une durée de cache spécifiée explicitement à zéro.

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#50 RequêtesLimiter les mises en cache trop courtes 0 x 1

Mettre en cache les ressources statiques, c'est bien, mais reste la question de la durée de vie de ce cache. En règle générale, plus vous mettez en cache longtemps, mieux c'est.

Pour vous simplifier la vie, utilisez des URLs versionnées pour vos ressources statiques. Il s'agit de mettre un hash dans votre URL ou dans votre nom de fichier pour faciliter l'invalidation des réponses mises en cache.

  • Quand l'URL de la ressource change, cela force le navigateur à télécharger la nouvelle ressource.
  • Si l'URL ne change pas, le navigateur peut immédiatement utiliser la valeur du cache HTTP, sans avoir à refaire une requête réseau sur votre serveur Web.

Ainsi l'URL de chaque version de vos fichiers est unique et peut être mise en cache quasiment indéfiniment. Vous bénéficiez immédiatement de la fiabilité et de la rapidité en évitant une requête réseau supplémentaire !

Avec cette stratégie de versioning, vous pouvez définir un temps de cache d'une année.

Requêtes avec un temps de mise en cache de moins d'une semaine

38  5 25 50

Avec YellowLabTools, on liste le nombre de requêtes de fichiers statiques (image, JS et CSS) avec une durée de cache spécifiée inférieur à une semaine.

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

DOM 93

Voir l'analyse

JavaScript ayant pris énormément d'importance, surveillez votre DOM
et tout ce qui s'y rapporte pour éviter un ralentissement de la réactivité de votre page.

#13 DOM/ EcoconceptionLimiter le nombre d'éléments dans le DOM 100 x 3

Un nombre élevé d'éléments DOM signifie beaucoup de travail pour le navigateur pour rendre la page. Cela peut ralentir les performances de votre page de plusieurs manières :

  • Efficacité du réseau et performances de charge
    Une grande arborescence DOM comprend souvent de nombreux nœuds qui ne sont pas visibles lorsque l'utilisateur charge la page pour la première fois, ce qui augmente inutilement les coûts de données pour vos utilisateurs et ralentit le temps de chargement.

  • Performances d'exécution
    Au fur et à mesure que les utilisateurs et les scripts interagissent avec votre page, le navigateur doit constamment recalculer la position et le style des nœuds. Une grande arborescence DOM associée à des règles de style compliquées peut ralentir considérablement le rendu.

  • Performances de la mémoire
    Si votre JavaScript utilise des sélecteurs de requête généraux tels que document.querySelectorAll('li'), vous stockez peut-être sans le savoir des références à un très grand nombre de nœuds, ce qui peut surcharger les capacités de mémoire des appareils de vos utilisateurs.

La taille du DOM est souvent liée à des problématiques d'affichage.  Nous observons que cela vient d'une utilisation restreinte de la sémantique HTML qui conduit à un abus de <div> et d'une méconnaissance des nouvelles propriétés CSS qui permettent de simplifier grandement l'arbre DOM tout en étant compatible avec la plupart des navigateurs.

Le DOM est aussi le critère le plus important qui détermine la notation Ecoindex, car il a une influence directe sur la durée de vie des terminaux.

Analyser votre code HTML et CSS pour réduire ce DOM, le cas échéant demandez l'avis des experts d'Artwaï.

Nombre d'éléments dans le DOM

1012  1500 3000 4500

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Éviter une taille DOM excessive

#14 DOMLimiter la profondeur du DOM 100 x 1

Un DOM profond rend difficile la correspondance CSS avec les éléments DOM.

Cela ralentit également les modifications JavaScript apportées au DOM car la modification des dimensions d'un élément oblige le navigateur à recalculer les dimensions de ses parents. Même principe pour les événements JavaScript, qui remontent à la racine du document.

La complexité d'imbrication du DOM est souvent liée à des problématiques d'affichage.  Nous observons que cela vient d'une utilisation restreinte de la sémantique HTML qui conduit à un abus de <div> et d'une méconnaissance des nouvelles propriétés CSS qui permettent de simplifier grandement l'arbre DOM tout en étant compatible avec la plupart des navigateurs.

Analyser votre code HTML et CSS pour réduire ce DOM, le cas échéant demandez l'avis des experts d'Artwaï.

Profondeur maximale du DOM

11  15 25 32

YellowLabTools nous remontent la profondeur maximale de DOM trouvée dans la page.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : https://developer.chrome.com/docs/lighthouse/performance/dom-size/

#15 DOMLimiter le nombre d'Iframes 55 x 1

L'élément HTML iframe permet d'obtenir une page HTML intégrée dans la page courante. Chaque iframe possède son propre historique et son propre document actif. Ce qui a évidemment un coût en terme de performance. C'est en cela que les iframes sont les éléments HTML les plus complexes. 

Nous ne voyons que deux cas où il est rare de faire sans : 

  • l'affichage d'un service vidéo comme Youtube, Dailymotion ou Vimeo.
  • l'affichage d'un service de cartographie comme Google Map ou Open Street Map.

Il faut donc en limiter le nombre et si l'iframe est indispensable :

  • Veillez à bien renseigner les attributs allow et sandbox pour limiter les risques de sécurité.
  • Il est recommandé de toujours inclure un attribut title pour l'iframe. Celui-ci est utilisé par les lecteurs d'écran pour lire le contenu de l'iframe.

Nombre d'iframes

4 15 30

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#16 DOM/ AccessibilitéNe pas avoir d'IDs dupliqués 100 x 1

L'attribut id définit un identifiant qui doit être unique pour l'ensemble du document. Le but de cet attribut est de pouvoir identifier un élément lorsqu'on crée un lien, qu'on souhaite le manipuler avec un script ou qu'on le met en forme avec CSS.

Comme les navigateurs sont très indulgents en matière de rendu HTML, ils autorisent les ID en double. Cela devrait être à proscrire dans la mesure du possible et strictement proscrit lors de l'accès aux éléments par ID en JavaScript.

En effet, que doit renvoyer la méthode getElementById lorsque plusieurs éléments correspondants sont trouvés ? Devrait-il renvoyer une erreur, le 1er élément correspondant, un ensemble d'éléments, etc. ?

C'est d'autant plus important en termes d'accessibilité. S'assurer que les ids sont uniques permet d'éviter les erreurs clés qui sont connues pour causer des problèmes aux technologies d'assistance lorsqu'elles essaient d'analyser le contenu qui a le même attribut id sur différents éléments.

Nombre d'IDs dupliqués

0 10 50

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, WCAG, Opquast.
Article de référence(s) : https://dequeuniversity.com/rules/axe/4.7/duplicate-id-aria, Les identifiants des éléments actifs doivent être uniques, Opquast règle n°229

#65 DOMRenseigner les attributs "height" et "width" des images 90 x 0.5

Tant que le navigateur n'a pas téléchargé l'image, il ne connait pas ces proportions. Même si le code CSS utilisé dans la page définit les dimensions auxquelles une image doit être affichée, cela ne correspond pas aux dimensions réelles de l'image.

Et tant que ces dimensions ne sont pas connues vous pouvez créer du CLS le temps que le navigateur récupère le fichier de l'image. 

Donc, vous devriez toujours définir les attributs de largeur et de hauteur sur vos images malgré les avancées CSS de ces dernières années. Le plus important, n'étant pas de définir les valeurs qui seront utilisées pour l'affichage mais les proportions de l'image elle-même.

De plus, il existe quelques cas où le lazyloading natif ne fonctionne que si les attributs de largeur et de hauteur de l'image sont définis.

Nombre d'images sans attribut HEIGHT et/ou WIDTH

0 10 50

Compte le nombre d'images sans attribut "height" et "width".

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Images sans dimensions

#66 DOM/ Ecoconception/ SEOEviter les erreurs graves de l'HTML selon le W3C 100 x 1

Même si la plupart du temps, les erreurs relevés par le W3C n'ont que peu d'impact sur le fonctionnement d'une page ; certaines erreurs sont rédhibitoires.

En effet, tout code HTML mal formé peut provoquer des bugs graphiques et dans certains cas empêcher la bonne indexation des pages dans les moteurs de recherche. 

Nous avons identifié les erreurs graves suivantes comme des erreurs devant être corrigées : 

  • Elément mal placé : par exemple un élément meta dans le body ne sera pas interprété.
  • Pas d'espace entre 2 attributs.
  • Ouverture d'un élément non fermé par la suite.
  • Fermeture d'un élément non ouvert au préalable.
  • Erreur fatale qui empêche le validateur de parcourir le code dans son intégralité. 

Article sur le sujet : 

Nombre d'erreurs graves selon le W3C

0 10 20

Cette bonne pratique est aussi recommandée par : CNumR.
Article de référence(s) : CNumR - BP#031

#67 DOM/ Ecoconception/ AccessibilitéEviter les erreurs HTML selon le W3C 99 x 0

Cela peut paraitre surprenant, un code HTML mal formé et donc invalide selon les règles du W3C n'a finalement que peu d'impact sur le fonctionnement de la page. Pourquoi ? Parce que les navigateurs corrigent automatiquement les erreurs qu'ils trouvent. 

Toutefois, si le navigateur passe du temps à corriger les erreurs HTML, c'est donc du temps de chargement en plus.

La plupart des erreurs ont peu d'incidences mais il convient d'en avoir le moins possible et de connaître les raisons de celles qui ne peuvent être corrigées.

Article sur le sujet : 

Nombre d'erreurs selon le W3C

0 100 150

Cette bonne pratique est aussi recommandée par : CNumR.
Article de référence(s) : CNumR - BP#031

JS 2

Voir l'analyse

Le temps de chargement d'une page web est souvent plus dû à l'exécution du code JS
qu'au chargement des ressources de la page... Surveillez la qualité du code JavaScript.

#17 JSLimiter le temps d'exécution total de JS 0 x 4 alerte

Le processus de rendu du navigateur est ce qui transforme votre code en une page Web avec laquelle vos utilisateurs peuvent interagir. Par défaut, le thread principal du processus de rendu gère généralement la plupart du code : il analyse le HTML et construit le DOM, analyse le CSS et applique les styles spécifiés, et analyse, évalue et exécute le JavaScript.

Le thread principal traite également les événements utilisateur. Ainsi, chaque fois que le fil principal est occupé à faire autre chose, votre page Web peut ne pas répondre aux interactions des utilisateurs, ce qui entraîne une mauvaise expérience.

Lighthouse recommande un temps d'occupation du thread principal à moins de 4 secondes et un temps d'exécution de JavaScript de moins de 2 secondes (ce que nous mesurons pour ce test).

Il s'agit ici de réduire le nombre de millisecondes passées par le navigateur sur l'exécution de JavaScript lors du chargement de la page.

Temps d'exécution total JavaScript

9,83 s 0.5 2 4

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Minimiser le travail du thread principal, Réduire le temps d'exécution de JavaScript

#18 JS/ EcoconceptionLimiter les accès DOM 91 x 2

La modification du DOM, par l'ajout et la suppression d'éléments, la modification d'attributs, de classes ou d'animations, obligera le navigateur à recalculer les styles d'éléments et, dans de nombreux cas, à mettre en page (ou redistribuer) la page ou des parties de celle-ci

Plus votre code JavaScript accède au DOM, plus la page se chargera et interagira lentement. En analysant le nombre de fois que le JavaScript lit, modifie ou lie le DOM, nous pouvons déterminer un indicateur qui permet d'évaluer la charge côté navigateur.

Et n'oubliez pas que plus le nombre d'éléments DOM est grand, plus les accès DOM sont lents car il y a plus d'éléments à parcourir.

Ce nombre d'accès DOM doit être le plus petit possible. Essayez, dans la mesure du possible, d'avoir une page HTML entièrement générée par le serveur au lieu de faire des modifications avec JS. Essayez également de réduire le nombre de requêtes en refactorisant votre code JavaScript. Lier trop d'événements JS a également un coût.

Nombre d'accès DOM

674  500 2500 5000

Avec un script injecté dans WebPageTest, nous comptons le nombre d'accès DOM appelés en JS. Cela comprend : 

  • getElementById()
  • getElementsByTagName()
  • getElementsByClassName()
  • querySelector() or querySelectorAll()
  • appendChild() or insertBefore()
  • addEventListener()
  • l'ajout ou la suppression de noeuds
  • le changement d'attribut

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#054

#19 JSLimiter le nombre d'events 'scroll' liés à 'window' ou 'document'. 86 x 1

Demander trop de travail au navigateur sur le défilement nuit à la fluidité du défilement. En règle général, le le simple fait d'ajouter un écouteur d'événement même vide au document peut avoir un impact négatif significatif sur les performances de défilement.

La fusion de tous vos écouteurs d'événements en un seul écouteur peut vous aider à factoriser leur code et à réduire leur empreinte sur le défilement.

Toutefois, l'intervalle de temps de déclenchement de l'événement onscroll est d'environ 10 à 20 ms lorsque vous faites défiler la molette de la souris ou scroller l'écran de votre smartphone. Donc, éviter de demander trop de chose en même temps si vous ne voulez pas dégrader l'expérience utilisateur.

Une autre solution est de passer à l'intersection observer. Plutôt que de déterminer jusqu'où l'utilisateur a fait défiler la page, vous pouvez utiliser l'observateur d'intersection pour déterminer si quelque chose est actuellement visible sur la page.

Nombre d'events 'scroll' liés à 'window' ou 'document'.

1 8 15

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#20 JSEviter les erreurs JavaScript 0 x 1

La plupart des navigateurs sont livrés avec des outils de développement intégrés. Ces outils de développement incluent généralement une console. La console vous donne des informations sur la page en cours d'exécution.

Les messages consignés dans la console proviennent soit des développeurs Web qui ont créé la page, soit du navigateur lui-même. Tous les messages de la console ont un niveau de gravité : Verbose, Info, Warning ou Error.

Les erreurs enregistrées dans la console indiquent des problèmes non résolus. Ceux-ci peuvent être dus à des requêtes réseau qui ont échoué et à d'autres problèmes du navigateur. Vous devez résoudre ces erreurs, car potentiellement, elles bloquent la suite de l'exécution dans le thread principal.

Éventuellement, dans le cadre d'une chaîne de production automatisée, vous pouvez faire valider votre code JavaScript par des outils de vérification comme JSLint ou ESLint.

Erreurs JavaScript

0 1 5

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Les erreurs du navigateur ont été consignées dans la console

#21 JSEviter les appels en JS de "document.write" 100 x 2

Les appels en JS de "document.write" ralentissent la construction de la page, surtout s'ils sont utilisés pour insérer des scripts dans la page.

En effet, si le script injecte dynamiquement un autre script, l'analyseur est obligé d'attendre encore plus longtemps le téléchargement de la ressource, ce qui peut entraîner un ou plusieurs allers-retours réseau et retarder le premier rendu de la page.

D'un point de vue performance, document.write()  n'est pas un  mal en soi. En fait, tout ce qu'il fait, c'est mettre en évidence les comportements potentiels déjà présents dans n'importe quel script synchrone - la seule différence principale est que le document.write() garantit que ces comportements négatifs se manifesteront, alors que d'autres scripts synchrones peuvent utiliser des optimisations alternatives pour les contourner. Même la doc de MDN les déconseille !

Conclusion : retirez-les dès que possible !

Si vous ne pouvez pas les supprimer car ils proviennent d'un script tiers (tel que des publicités), consultez PostScribe .

Nombre d'appels en JS de "document.write"

0 2 6

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Utilisation de document.write()

#22 JSEviter les requêtes AJAX synchrone. 100 x 5

AJAX (Asynchronous JavaScript + XML) désigne une approche utilisant l'ensemble de technologies Web existantes et surtout l'objet XMLHttpRequest. En utilisant des requêtes AJAX, les applications web sont capables de réaliser des mises à jour rapides de l'interface utilisateur sans devoir recharger la page entière dans le navigateur. Les pages sont censés fonctionner plus rapidement et être plus réactives aux actions de l'utilisateur.

Mais, encore faut-il faire attention aux détails : le paramètre async de la requête XMLHttpRequest doit être défini à true et non pas à false. Sinon le thread principal du navigateur doit tout arrêter jusqu'à ce que la réponse soit reçue...

Ce n'est pas la technologie qui est mise en cause mais le caractère synchrone et donc bloquant de son usage avec l'option async défini à false.

Nombre de requêtes AJAX synchrones

0 1 1

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#23 JSLimiter le nombre de variables globales 0 x 0.5

Avec JavaScript, en déclarant une variable globale, elle reste en mémoire tout au long de son cycle de vie. Certains vous diront que l'impact sur les performances est infime...

Néanmoins, si nous enregistrons de longues chaînes de texte ou des données JSON dans des variables globales, le navigateur peut rapidement manquer de mémoire, ce qui pourrait détériorer ou bloquer la page. De plus, les variables globales prennent également un petit peu plus de temps pour être accessibles que les variables locales d'une fonction.

En déclarant des variables dans un contexte local avec, par exemple, le mot-clé let ou const, une portée de bloc est appliquée et les variables sont supprimées de la mémoire après l'exécution du bloc. 

Ainsi, essayer de toujours utiliser une variable locale dans son périmètre est une bonne pratique qui peut améliorer considérablement les performances globales, surtout en remplacement d'un nombre important de variables globales.

A l'inverse, avoir un nombre important de  variables globales est une mauvaise pratique car elles encombrent la mémoire et l'espace de noms global. En outre, si deux scripts utilisent le même nom de variable dans la portée globale, cela peut provoquer des conflits et il est généralement difficile à déboguer.

Nombre de variables globales

315  20 300 800

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#24 JSUtiliser la dernière version de jQuery 100 x 2

jQuery est une bibliothèque JavaScript libre et multiplateforme créée pour faciliter l'écriture de scripts. Le but de la bibliothèque étant le parcours et la modification du DOM, elle contient de nombreuses fonctionnalités ; notamment des animations, la manipulation des feuilles de style en cascade, la gestion des évènements, etc. Et l'utilisation d'Ajax est facilitée et de nombreux plugins sont présents.

Depuis sa création en 2006 et notamment à cause de la complexification croissante des interfaces Web, jQuery a connu un large succès auprès des développeurs Web. Il est à l'heure actuelle en 2022, la bibliothèque front-end la plus utilisée au monde.

Chaque nouvelle version de jQuery optimise les performances. Ne conservez pas une ancienne version de jQuery. La mise à jour peut parfois casser certaines choses, mais il est généralement assez facile de les réparer. Alors n'hésitez pas. La dernière version en juillet 2023 est la version 3.7.0.

En dessous de la version 3, jQuery embarque du code de rétrocompatibilité avec de très anciens navigateurs. Ces versions sont très lourdes et lentes. Elles sont à proscrire si vous cherchez la performance. ( artwaï a également un avis négatif sur l'usage de la librairie associée jQuery UI qui est encore plus lourde toutes versions confondues ).

La plupart des fonctionnalités de jQuery sont désormais réalisables avec les API DOM natives et peuvent être inutiles dans les pages Web d'aujourd'hui. artwaï recommande de ne pas l'utiliser du tout : R.I.P jQuery.

Version de jQuery

3,7  3 0 0

Le test de la version est basée uniquement sur les 2 premiers chiffres (exemple : 3.3 pour 3.3.1).

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#25 JSCharger qu'une seule fois jQuery 100 x 2

En vous référant à la BP#24, vous savez que jQuery est une bibliothèque lourde qui peut nuire à vos performances. Il est donc évident que vous ne devez jamais charger jQuery plus d'une fois sur la même page.

Pourtant cela arrive plus souvent qu’on le croit : redondance dans la chaîne de production ou script tiers qui embarque sa propre version de jQuery. Dans ce cas-là, vous avez 2 jQuery différents qui en plus peuvent être en conflit.

La plupart des fonctionnalités de jQuery sont désormais réalisables avec les API DOM natives et peuvent être inutiles dans les pages Web d'aujourd'hui. artwaï recommande de ne pas l'utiliser du tout : R.I.P jQuery.

Nombre de jQuery chargées

1 2 3

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

CSS 95

Voir l'analyse

Les CSS et les polices associées ont généralement moins d'impact que les autres catégories.
Cependant, l'accumulation de mauvaises pratiques peut causer des problèmes à l'affichage.

#26 CSSLimiter le nombre de règles CSS 100 x 2

Avoir un grand nombre de règles CSS nuit aux performances.

Lors du rendu initial de la page, le CSS est appliqué à une page et une structure similaire au DOM connue sous le nom de CSS Object Model (CSSOM) est créée. Ce rendu des styles nécessite que le navigateur vérifie au moins une fois si chaque élément correspond à chaque sélecteur CSS déclaré. Pour faire simple, vous multipliez le nombre d'éléments par le nombre de sélecteurs !

Si le nombre de règles CSS est supérieur au nombre d'éléments DOM, il y a clairement un problème.

Les feuilles de style volumineuses se produisent généralement lorsque les différentes pages d'un site Web chargent tous les CSS, concaténés dans une seule feuille de style, même si une grande partie des règles sont inutiles à la page en cours. Dans ce cas-là, une solution consiste à créer un fichier CSS principal avec des règles globales et un fichier personnalisé par page.

Sinon il faut repenser la conception de vos CSS, voir même revoir la cohérence graphique du site, pour factoriser vos sélecteurs. La mise en place d'un design system peut grandement être utile dans cette mise en œuvre. Le cas échéant demandez l'avis des experts d'artwaï.

Nombre de règles CSS

652  2000 5000 8000

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Supprimer le CSS inutilisé

#27 CSS/ EcoconceptionEviter les sélecteurs complexes 97 x 2

Les sélecteurs complexes sont des sélecteurs CSS avec 6 éléments ou plus comme "#header ul li .foo". 
Les combinatoires "espace", ">", "+", ":not()", etc, comptent pour un élément. Notre exemple "#header ul li .foo" compte donc 7 éléments : un id (#header), un espace, une balise (ul), un espace, une balise (li), un espace, une class (.foo).
Contrairement à ce que l'on pourrait penser, trop de précisions dans les sélecteurs CSS deviennent contreproductives pour la performance.

Pour le rendu initial des styles, le navigateur vérifie au moins une fois si chaque élément du DOM correspond à chaque sélecteur CSS déclaré (cf BP#26). Chaque sélecteur est parcouru de droite à gauche pour vérifier si l'élément correspond au sélecteur. Le navigateur filtre les éléments du DOM en fonction de l'élément du sélecteur le plus à droite et parcourent ses éléments parents pour déterminer les correspondances. Plus la longueur de la chaîne du sélecteur est longue, plus le navigateur doit parcourir d'éléments parents pour déterminer si l'élément de droite correspond au sélecteur. 

Dès lors, en précisant plus d'un sélecteur, vous complexifiez le travail du navigateur.

Cela peut se produire si les feuilles de styles sont développées en SCSS. Les développeurs front-end ont tendance à trop indenter et donc surspécifier les sélecteurs CSS. La compilation avec Gulp ou Grunt, ne peut pas régler ce problème de manière automatique.

NB : Vous pouvez visualiser la complexité et la spécificité de vos sélecteurs avec un outil comme Specificity Visualizer.

La simplification des sélecteurs passe par l'œil aguerri d'un intégrateur front-end.  Et pourquoi pas un intégrateur de chez artwaï ? 

Nombre de sélecteurs complexes

30  0 1000 24000

Nous comptons par expression et combinatoire (espace, +, >,...) le nombre de sélecteurs avec 6 éléments ou plus.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#024

#28 CSSLimiter le nombre de couleurs différentes 100 x 0.5

Soyons clair : le nombre de couleurs définies dans vos CSS n'a aucun impact sur le temps de chargement de vos pages. Même le codage de celles-ci, que cela soit en hexa, RGB ou HSL, cela n'a aucune différence notable d'un point de la rapidité de leur interprétation.

Toutefois, c'est un révélateur de la qualité de votre code. En effet, si le nombre de couleurs est très important, il y a fort à parier que la cohérence du code CSS sur l'ensemble des autres caractéristiques soit équivalente. Ce qui signifie un code non factorisé avec tous les inconvénients que cela implique.

Dans l'idéal une palette de couleur est déterminée en amont, le cas échéant avec des variables CSS ou SCSS. Et chaque composant utilise ces couleurs ainsi référencées.

Au-delà de la performance, c'est la maintenabilité de votre code CSS qui est ici en jeu. Votre CSS sera plus facile à maintenir si vous conservez un petit jeu de couleurs.

Pour résoudre cette bonne pratique la première étape est d'identifier les couleurs similaires et de les rationaliser. Pour cela référez vous à la BP#29.

Nombre de couleurs différentes

23  100 200 500

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#29 CSSEviter le nombre de couleurs similaires 100 x 0.5

Soyons clair : le nombre de couleurs définies dans vos CSS n'a aucun impact sur le temps de chargement de vos pages. Même le codage de celles-ci, que cela soit en hexa, RGB ou HSL, cela n'a aucune différence notable d'un point de la rapidité de leur interprétation.

Au-delà du nombre de couleurs qui peut être justifié, c'est la similarité de certaines couleurs entre elles qui est à remettre en cause. Leur proximité peut rendre impossible leur identification distincte par l'utilisateur. Dès lors, quel est l'intérêt de conserver deux couleurs similaires si une seule peut faire le job.

Cela est d'autant plus vrai, car il est illusoire de croire que vous maîtrisez le rendu final de ces couleurs. Si une couleur reste toujours la même d'un point vu de son code, la réalisation physique d'une couleur dépend de l'écran utilisé, des matériaux utilisés pour l'affichage, des paramètres d'affichage (notamment le taux de contraste), de l'éclairage de la pièce et d'un éventail presque infini de situations.

Au-delà de la performance, c'est la maintenabilité de votre code CSS qui est ici en jeu. Réduire ce nombre en rapprochant les couleurs similaires est une partie de la solution pour réduire le nombre de couleurs (cf BP#28).

Le nombre indiqué dans la métrique mesurée est la liste des couleurs trouvées dans les feuilles de style, qui sont très proches les unes des autres. L'œil peut à peine voir la différence. Utilisez cette liste pour réduire le nombre de couleurs dans votre palette, vos CSS seront plus faciles à maintenir.

Nombre de couleurs similaires

0 60 120

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#30 CSSLimiter le nombre de breakpoints 100 x 0.5

Les breakpoints CSS sont des points où le contenu du site Web réagit en fonction de la largeur de l'appareil, vous permettant de montrer la meilleure mise en page possible à l'utilisateur. Ce sont généralement des paliers dont la valeur est incrémentée au fur et à mesure des résolutions cibles.

Pour définir ces paliers, on utilise les médiaqueries avec des instructions de taille portant généralement sur la largeur. Notez que la métrique ici mesurée est basée uniquement sur les médiaqueries min-width , max-width , min-device-width et max-device-width .

D'un point de fonctionnement, le moteur de rendu d'un navigateur sérialise et supprime les médiaqueries en double, de sorte qu'ils n'ont besoin d'évaluer chaque médiaquerie qu'une seule fois. Ils mettent également en cache les requêtes pour les réutiliser ultérieurement. Ainsi, même s'il y a une différence de performance, elle est minime au regard d'un chargement initial. Toutefois, si vous redimensionnez la fenêtre du navigateur, cela peut entraîner une charge massive du processeur et de la mémoire qui peut même planter votre navigateur. Il ne s'agit certes pas d'un usage courant (aucun utilisateur ne redimensionne constamment son navigateur) mais cela traduit quand même la complexité du code.

Votre CSS sera plus facile à maintenir si vous conservez un nombre raisonnable de breakpoints. Essayez de faire une conception fluide - en utilisant des pourcentages - pour éviter la création de nombreux breakpoints.

Pour réduire ce nombre, définissez bien vos cibles en fonction de vos statistiques de fréquentation ou inspirez vous des breakpoints des frameworks CSS populaires comme Bootstrap qui dans sa version 5.3 définit 6 breakpoints. Le cas échéant demandez l'avis des intégrateurs front-end d'artwaï.

Nombre de breakpoints

10 50 80

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#31 CSS/ EcoconceptionLimiter les mediaqueries non mobiles first 100 x 1

On considère comme mobile-first l'ensemble des pratiques qui donne la priorité aux besoins des utilisateurs mobiles pour optimiser leur expérience. En termes de code CSS, cela consiste à écrire du CSS de manière à ce que les petits appareils, les smartphones, puissent accéder à leurs styles sans avoir à parcourir les styles écrits pour les ordinateurs de bureau.

Généralement on définit les éléments communs à tous les appareils. Puis  on définit les éléments spécifiques à chaque résolution par palier à l'aide des mediaqueries en passant par l'instruction min-width. L'usage de max-width n'est pas à proscrire, mais vous devez garder deux principes en tête : 

  • Ne définissez les styles que lorsque cela est nécessaire. 
  • Ne pas les définir dans l'espoir de les écraser plus tard, encore et encore. 

Dans l'idéal, fractionnez vos CSS en plusieurs fichiers et distribuez-les via l'élément link dans le head en précisant la mediaquerie directement avec l'attribut media. Vous profiterez de la priorisation du navigateur qui chargera en premier les fichiers qui correspondent à sa résolution. Si vous travaillez en SCSS, l'usage d'un compilateur comme GULP devrait automatisé cette tâche.

Le respect de cette pratique peut contribuer à la résolution des problèmes de FOUC (Flash Of Unstyled Content) où l'utilisateur peut voir votre page se charger sans style pendant quelques instants avant de se corriger.

Nombre de mediaqueries non mobile-first

44  60 400 1200

Le test comptabilise l'ensemble des mentions max-width trouvés dans les mediaqueries du code CSS.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#006

#32 CSSEviter les erreurs de syntaxe CSS 100 x 3

Une erreur de syntaxe CSS peut avoir des effets non-négligeables sur l'affichage de vos pages web. Et là il ne s'agit pas que de performance, mais cela peut avoir des effets non-désirés sur le fonctionnel lui-même. Un bouton qui devient non cliquable, des éléments se chevauchant, ou alors une page affichée sans aucun style du tout.

Pour éviter, ce genre d'erreur vous pouvez valider votre code manuellement avec un validateur en ligne comme celui du W3C ou CSSLint, ou dans votre chaine de déploiement vérifier automatiquement le code CSS avec un compilateur comme GULP ou Grunt.

Attention, nous ne mesurons pas ici les syntaxes qui ne seraient pas prises en compte par une version de navigateur X ou Y. Pour cela, référez-vous à au site caniuse.com.

Article sur le sujet :

Nombre d'erreurs CSS

0 2 20

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#33 CSSEviter les @imports en CSS 100 x 4

La plupart des fichiers CSS sont des ressources bloquant le rendu, ce qui signifie que le navigateur doit les télécharger avant de pouvoir afficher le contenu à l'utilisateur.

La règle CSS @import est un des moyens disponibles pour charger des feuilles de style supplémentaires au sein d'une instruction CSS. Et lorsque plusieurs feuilles de style sont ajoutées avec @import, le navigateur doit télécharger séquentiellement ces fichiers. Il peut même y avoir une cascade de requêtes, un fichier CSS en appelant un autre qui en appelle un autre et ainsi de suite... Par conséquent, la page Web se charge plus lentement.

Cela se produit souvent lors de l'importation de Google Fonts dans un fichier CSS : le CSS des polices Google ne commence à se charger qu'après le téléchargement du fichier initial. 

A l'inverse, plusieurs balises link au sein du HTML sont plus efficaces et chargent les fichiers CSS en parallèle. Il y a donc une solution efficace : vous devez utiliser <link rel='stylesheet' href='a.css'> à la place.

Nombre de @imports en CSS

0 1 1

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#34 CSSEviter les sélecteurs dupliqués 100 x 2

S'il y a deux sélecteurs CSS ou plus qui pointent vers le même élément, le sélecteur avec la valeur de spécificité la plus élevée "gagnera" et sa déclaration de style sera appliquée à cet élément HTML. Considérez la spécificité comme un score/rang qui détermine quelle déclaration de style est finalement appliquée à un élément. Vous pouvez voir comment est déterminé le score de spécificité sur la page What is Specificity ? du W3School.

Cela demande donc un certain temps de calcul pour déterminer qui a la priorité; d'autant plus si les sélecteurs sont strictement identiques. Les sélecteurs en double sont très rarement intentionnels. Dans le cas d'un sélecteur basé sur un id, il s'agit certainement d'une erreur. En plus du travail supplémentaire requis par le navigateur, cela est souvent source de conflit et n'aide pas la maintenance.

Une seule issue : lorsque deux ou plusieurs sélecteurs sont strictement identiques au sein d'une même media query, ils doivent être fusionnés.

Dans le cas d'une chaîne de production automatisée avec GULP ou Grunt, il est aisé de regrouper ces sélecteurs dupliqués en un seul. Mais gare aux propriétés dupliquées ! (cf BP#35)

Nombre de sélecteurs dupliqués

0 100 200

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#35 CSSEviter les propriétés CSS dupliquées 100 x 1

CSS autorise les propriétés en double même au sein d'un même sélecteur. Mais seule la dernière instance de la propriété détermine la valeur réelle qui sera attribuée à l'élément cible. Par conséquent, la modification des valeurs des occurrences précédentes d'une propriété dupliquée n'aura aucun effet et pire, cela peut entraîner des conflits et des bogues d'affichage.

Ainsi, seule la dernière occurrence de la propriété est utile. Du coup, on embarque du code en plus qui nécessite plus de temps à être téléchargé

La duplication de propriété est donc autant un problème de maintenabilité que de performance.

La meilleure solution reste d'utiliser un parseur CSS qui au sein d'une chaîne de production automatisée, avec GULP ou Grunt par exemple, va automatiquement supprimer les occurrences de propriétés inutiles.

Nombre de propriétés CSS dupliquées

0 100 200

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#36 CSS Eviter les règles CSS vides. 96 x 2

Le rendu initial des styles nécessite que le navigateur vérifie au moins une fois si chaque élément correspond à chaque sélecteur CSS déclaré, même si celui-ci ne contient aucune propriété, bref même si il est vide.

Pourquoi surcharger le travail du navigateur avec un parcours du CSS Object Model (CSSOM) inutile ?
La solution est donc simple : supprimez toutes les règles vides.

Dans le cas d'une chaîne de production automatisée avec GULP ou Grunt, il est aisé de supprimer ces sélecteurs vides.

Nombre de règles CSS vides.

0 50 120

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#37 CSSEviter l'usage de !important en CSS 98 x 2

Une déclaration !important permet de donner à une valeur CSS plus de poids qu'elle n'en a naturellement.

La balise !important semble être la solution la plus simple pour forcer des styles qui ne fonctionnent pas comme prévu. Cette situation se produit lorsque vous essayez de remplacer des styles qui sont déclarés ailleurs dans votre CSS. Généralement, le sélecteur que vous utilisez n'a pas la priorité par rapport à un autre. Vous pouvez voir comment est déterminé le score de priorité sur la page What is Specificity ? du W3School.

Les déclarations !important ne doivent pas être utilisées à moins qu'elles ne soient absolument nécessaires après que toutes les autres voies ont été épuisées. C'est une mauvaise pratique car elle remplace la logique de cascade CSS normale : plus vous utilisez !important, plus vous en avez à nouveau besoin pour la remplacer. Cela conduit à une mauvaise maintenabilité du code CSS.

Pour résoudre ce problème, il vous faudra généralement revoir la spécificité des sélecteurs utilisant la mention !important de façon à ce qu'ils reprennent la priorité.

Nombre de !important en CSS

0 200 1000

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#38 CSSEviter les fixes dédiés au ancien navigateur IE 100 x 1

Il s'agit là de supprimer du code inutile. En effet, les habitudes ont la vie dure et il n'est pas rare de trouver au sein du code CSS, des propriétés, des sélecteurs voire des hacks qui se référent à des très anciens navigateurs.

Internet Explorer est de ceux-ci. Depuis 2019, Microsoft recommande de ne plus l'utiliser. Et en juin 2022, Microsoft a mis fin définitivement au développement et au support d’Internet Explorer, après vingt-sept années de service. 

Même avec cette popularité passée, rien ne justifie aujourd'hui de cibler spécifiquement Internet Explorer qui représente en juillet 2023 moins de 0,5% de part de marché... 

Il convient donc de supprimer toutes les anciennes façons d'adresser du CSS pour ce navigateur.

Nombre de mentions IE obsolètes

0 100 300

YellowLabTools compte le nombre de mentions des règles dont l'usage est désormais obsolète.

IE6:

  • * html
  • html > body (everything but IE6)

IE7:

  • *height: 123px;
  • height: 123px !ie;

IE9:

  • -ms-filter
  • progid:DXImageTransform.Microsoft

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#39 CSSEviter les préfixes CSS anciens 100 x 1

Les préfixes de fournisseur CSS ou préfixes de navigateur CSS, sont un moyen pour les fabricants de navigateurs d'ajouter la prise en charge de nouvelles fonctionnalités CSS avant que ces fonctionnalités ne soient entièrement prises en charge dans tous les navigateurs. Cela peut être fait pendant une période d'expérimentation où le fabricant du navigateur détermine exactement comment ces nouvelles fonctionnalités CSS seront implémentées. Ces préfixes sont devenus très populaires avec l'essor de CSS3 il y a quelques années. 

Une fois, la période d'expérimentation terminée, ces préfixes deviennent inutiles.

Ainsi de nombreux préfixes de propriété tels que -moz- ou -webkit- ne sont plus nécessaires, ou pour très peu de navigateurs. Parfois, ils n'ont même jamais existé et sont intégrés par méconnaissance de l'intégrateur. Vous pouvez les supprimer ou les remplacer par la version sans préfixe pour réduire cette portion de code inutile. Cela aidera à réduire le poids de vos feuilles de style.

NB : la base de données des préfixes provient de Can I Use.

Nombre de préfixes CSS anciens

0 100 400

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#40 CSSEviter la redondance de body dans les sélecteur CSS 100 x 1

Au-delà des sélecteurs complexes (cf BP#27), il est souvent inutile de surspécifier un sélecteur. Ce qui signifie qu'un tag HTML peut être redondant voir parfaitement inutile.

C'est le cas du tag body, puisque tout élément que l'on souhaite styliser se trouve nécessairement à l'intérieur du body. N'oubliez pas que chaque sélecteur est parcouru de droite à gauche pour vérifier si l'élément correspond au sélecteur. Dès lors, en précisant un parent body à vos sélecteur, vous complexifiez le travail du navigateur inutilement.

Vous devez donc supprimer les tags body redondant, ce qui est une manière de réduire la complexité de vos règles CSS.

NB : le tag body peut lui même être stylisé. Dans ce cas là, il ne s'agit pas de redondance.

Nombre de body redondant dans les sélecteurs CSS

0 120 400

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#41 CSSEviter la redondance de tag dans les sélecteurs CSS 95 x 1

Au-delà des sélecteurs complexes (cf BP#27), il est souvent inutile de surspécifier un sélecteur. Ce qui signifie qu'un tag HTML peut être redondant voir parfaitement inutile.

C'est le cas de certaines balises incluses dans d'autres balises. Par exemple, lorsque "ul li" est spécifié dans une règle, "ul" peut être supprimé car la balise "li" est presque toujours à l'intérieur d'un conteneur "ul" (le conteneur "ol" est assez rare). Même chose pour "tr td", "select option", ...

N'oubliez pas que chaque sélecteur est parcouru de droite à gauche pour vérifier si l'élément correspond au sélecteur. Dès lors, en précisant un tag évident de par sa hiérarchie à vos sélecteurs, vous complexifier le travail du navigateur inutilement.

Vous devez donc supprimer les tags redondants, ce qui est une manière de réduire la complexité de vos règles CSS.

Nombre de tags redondants dans les sélecteurs CSS

0 120 400

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#42 CSS/ EcoconceptionLimiter le nombre de polices 0 x 1

Les polices Web affectent les performances de différentes manières :

  1. Si une police Web n'a pas été chargée, les navigateurs retardent généralement le rendu du texte. Dans de nombreuses situations, cela retarde le FCP (First Contentful Paint)  et parfois le LCP (Largest Contentful Paint).
  2. Le temps que la police soit chargée, une police de substitution est affichée. Quand le changement de police affichée intervient cela peut produire des décalages de mise en page et avoir un impact sur le CLS (Cumulative Layout Shift). Cela se produit lorsqu'une police Web et sa police de secours ont des tailles de glyphes différentes.

Donc vous avez tout intérêt à réduire le nombre de polices sur vos pages web. Il existe trois solutions pour réduire ce nombre : les polices système et les polices variables.

  • Une police système est la police par défaut utilisée par le navigateur. Les polices système varient généralement selon le système d'exploitation et la version. Mais étant donné que la police est déjà installée, elle n'a pas besoin d'être téléchargée. Les polices système fonctionnent particulièrement bien pour le corps du texte.

  • Utiliser le "faux gras" en CSS permet d'éviter de charger une police dédiée à une version "grasse" d'une police déjà chargée.

  • Une police variable peut être utilisée en remplacement de plusieurs fichiers de polices. En effet, les polices variables fonctionnent en définissant un style de police "par défaut" et en fournissant des "axes" pour manipuler la police.

En règle générale, une seule police de caractères et une seule pour les icônes devraient suffire.

Quelques articles sur le sujet :

Nombre de polices

2 6 10

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#029

#43 CSSLimiter le poids des polices 69 x 0.5

Au-dessus d'un poids de 40 ko, la police n'est probablement pas optimisée pour le Web.

Plusieurs raisons à cette surcharge pondérale : 

  • Un problème de compression ou de format de la police (cf BP#44).
    NB: une police au format WOFF2 ne se compresse pas, car elle est déjà compressée.
  • La police contient trop de glyphes. Dans ce cas là, utilisez un seul subset de la police (Latin, Latin-ex, Cyrillique...)  Plutôt que de proposer tous les caractères à tous les utilisateurs, vous pouvez utiliser des sous-ensembles de polices distincts pour les caractères latins et cyrilliques par exemple. Vous pouvez réduire la taille des fichiers de polices en créant ces sous-ensembles de polices, ceux-ci ne seront chargés que si un caractère du sous-ensemble est affiché.
  • Ou les glyphes de la police ont des formes complexes. Vous pouvez essayer de réduire la complexité des glyphes.

Un outil comme fontsquirrel.com peut vous permettre de jouer sur tous les paramètres de la police afin d'en réduire le poids.

Nombre de kilooctets au delà de 40 ko par police

31,37 Ko 0 100 200

Cette métrique est la somme de tous les octets au-dessus de 40 Ko dans les polices chargées. 

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#44 CSSPréférer les polices au format WOFF2 100 x 0.5

Les formats souvent mentionnés dans les feuilles de styles sont :

  • Embedded OpenType (EOT) : EOT est un format hérité développé par Microsoft. Les anciennes versions d'Internet Explorer nécessitent EOT pour afficher vos polices Web. EOT est souvent servi non compressé, donc si vous n'avez pas besoin d'un support de navigateur comme IE8 ou inférieur, vous feriez mieux de le laisser de côté.
  • TrueType (TTF) : TTF est un format de police développé par Microsoft et Apple dans les années 1980. Les fichiers TTF modernes sont également appelés polices TrueType OpenType. TTF peut être utile pour étendre la prise en charge à certains navigateurs plus anciens, en particulier sur mobile, si vous en avez besoin.
  • Web Open Font Format (WOFF) : WOFF a été développé en 2009 en tant que format wrapper pour les polices TrueType et OpenType. Il compresse les fichiers et est pris en charge par tous les navigateurs modernes.
  • Web Open Font Format 2 (WOFF2) : WOFF2 est une mise à jour du format WOFF d'origine . Développé par Google, il est considéré comme le meilleur format du groupe car il offre des tailles de fichiers plus petites et de meilleures performances pour les navigateurs modernes qui le prennent en charge.

NB : les fonts SVG ne sont plus supportés par Chrome depuis sa version 38 datant 2016.

Parmi ces formats de polices, WOFF2 est le plus récent. Il est pris en charge par la plupart des navigateurs et offre la meilleure compression. Parce qu'il utilise Brotli, le format WOFF2 est  30% plus compressé que WOFF, réduisant ainsi la quantité de données à télécharger et améliorant les performances.

Compte tenu de la prise en charge du navigateur, artwaï recommande de n'utiliser que WOFF2 (en prévoyant une stratégie de repli vers une police système).

Certains outils en ligne comme fontsquirrel.com peuvent vous aider à convertir facilement les anciens formats en WOFF2.

Gain attendu en passant au WOFF2

0 Ko 0 50 120

On teste la différence de poids entre les polices trouvées qui ne sont pas WOFF2 et le poids attendus en les convertissant en WOFF2.

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

Ecoconception (21 bonnes pratiques)

En termes de bonnes pratiques, l'écoconception partage 90 % de son ADN avec la performance. D'un côté, on cherche la rapidité et, de l'autre, la sobriété. L'idée étant, dans les deux cas, de chercher l'efficience. Nous avons regroupé ces bonnes pratiques, issues pour la plupart du référentiel fourni par Green.it et son collectif, en trois sous-catégories : Terminal, Réseau et Serveur, correspondant aux trois critères définissant l'Ecoindex.

Terminal 97

L’impact écologique des terminaux utilisateurs est le plus important.
Optimiser l'expérience utilisateur vise à limiter le taux de renouvellement de ces terminaux.

#3 Terminal/ PerformanceDimensionner correctement les images 96 x 4

Idéalement, votre page ne doit jamais diffuser d'images plus grandes que la version affichée sur l'écran de l'utilisateur. La règle de base est de dimensionner l’image à sa taille réelle d’affichage. Vous pouvez très bien avoir une image de 1000 px x 1000 px affichée en 100 px x 100 px. Du coup, en exagérant, votre image est 10 fois plus lourde que nécessaire. 

Ainsi, tout ce qui est plus grand que cela entraîne simplement des octets gaspillés et ralentit le temps de chargement de la page. 

La principale stratégie pour diffuser des images de taille appropriée est appelée "images responsives". Avec les images responsives, vous générez plusieurs versions de chaque image, puis spécifiez la version à utiliser dans votre code HTML ou CSS à l'aide des requêtes multimédia, des dimensions de la fenêtre d'affichage. 

De plus, il se peut que l'attribut "sizes"  liés aux "srcset" d'une image responsive soit incorrect. Cela peut entrainer un mauvais choix d'image chargée, donc potentiellement plus de poids ou une dégradation de l'image affichée.  Pour contrôler cet aspect vous pouvez utilisez  dans Chrome, l'extension Responsive Image Linter qui vérifie chaque image de la page.

Article sur le sujet : 

Gain potentiel

14,8 Ko 2 300 500

Avec la YellowLabTools, on compare le nombre de pixels dans une image chargée au nombre de pixels physiques sur lesquels elle est affichée, pour en déduire le nombre de Ko qui pourraient être économisés.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Images correctement dimensionnées, CNumR - BP#034, Opquast règle n°114

#13 Terminal/ PerformanceLimiter le nombre d'éléments dans le DOM 100 x 5

Un nombre élevé d'éléments DOM signifie beaucoup de travail pour le navigateur pour rendre la page. Cela peut ralentir les performances de votre page de plusieurs manières :

  • Efficacité du réseau et performances de charge
    Une grande arborescence DOM comprend souvent de nombreux nœuds qui ne sont pas visibles lorsque l'utilisateur charge la page pour la première fois, ce qui augmente inutilement les coûts de données pour vos utilisateurs et ralentit le temps de chargement.

  • Performances d'exécution
    Au fur et à mesure que les utilisateurs et les scripts interagissent avec votre page, le navigateur doit constamment recalculer la position et le style des nœuds. Une grande arborescence DOM associée à des règles de style compliquées peut ralentir considérablement le rendu.

  • Performances de la mémoire
    Si votre JavaScript utilise des sélecteurs de requête généraux tels que document.querySelectorAll('li'), vous stockez peut-être sans le savoir des références à un très grand nombre de nœuds, ce qui peut surcharger les capacités de mémoire des appareils de vos utilisateurs.

La taille du DOM est souvent liée à des problématiques d'affichage.  Nous observons que cela vient d'une utilisation restreinte de la sémantique HTML qui conduit à un abus de <div> et d'une méconnaissance des nouvelles propriétés CSS qui permettent de simplifier grandement l'arbre DOM tout en étant compatible avec la plupart des navigateurs.

Le DOM est aussi le critère le plus important qui détermine la notation Ecoindex, car il a une influence directe sur la durée de vie des terminaux.

Analyser votre code HTML et CSS pour réduire ce DOM, le cas échéant demandez l'avis des experts d'Artwaï.

Nombre d'éléments dans le DOM

1012  1500 3000 4500

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Éviter une taille DOM excessive

#18 Terminal/ PerformanceLimiter les accès DOM 91 x 3

La modification du DOM, par l'ajout et la suppression d'éléments, la modification d'attributs, de classes ou d'animations, obligera le navigateur à recalculer les styles d'éléments et, dans de nombreux cas, à mettre en page (ou redistribuer) la page ou des parties de celle-ci

Plus votre code JavaScript accède au DOM, plus la page se chargera et interagira lentement. En analysant le nombre de fois que le JavaScript lit, modifie ou lie le DOM, nous pouvons déterminer un indicateur qui permet d'évaluer la charge côté navigateur.

Et n'oubliez pas que plus le nombre d'éléments DOM est grand, plus les accès DOM sont lents car il y a plus d'éléments à parcourir.

Ce nombre d'accès DOM doit être le plus petit possible. Essayez, dans la mesure du possible, d'avoir une page HTML entièrement générée par le serveur au lieu de faire des modifications avec JS. Essayez également de réduire le nombre de requêtes en refactorisant votre code JavaScript. Lier trop d'événements JS a également un coût.

Nombre d'accès DOM

674  500 2500 5000

Avec un script injecté dans WebPageTest, nous comptons le nombre d'accès DOM appelés en JS. Cela comprend : 

  • getElementById()
  • getElementsByTagName()
  • getElementsByClassName()
  • querySelector() or querySelectorAll()
  • appendChild() or insertBefore()
  • addEventListener()
  • l'ajout ou la suppression de noeuds
  • le changement d'attribut

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#054

#27 Terminal/ PerformanceEviter les sélecteurs complexes 97 x 3

Les sélecteurs complexes sont des sélecteurs CSS avec 6 éléments ou plus comme "#header ul li .foo". 
Les combinatoires "espace", ">", "+", ":not()", etc, comptent pour un élément. Notre exemple "#header ul li .foo" compte donc 7 éléments : un id (#header), un espace, une balise (ul), un espace, une balise (li), un espace, une class (.foo).
Contrairement à ce que l'on pourrait penser, trop de précisions dans les sélecteurs CSS deviennent contreproductives pour la performance.

Pour le rendu initial des styles, le navigateur vérifie au moins une fois si chaque élément du DOM correspond à chaque sélecteur CSS déclaré (cf BP#26). Chaque sélecteur est parcouru de droite à gauche pour vérifier si l'élément correspond au sélecteur. Le navigateur filtre les éléments du DOM en fonction de l'élément du sélecteur le plus à droite et parcourent ses éléments parents pour déterminer les correspondances. Plus la longueur de la chaîne du sélecteur est longue, plus le navigateur doit parcourir d'éléments parents pour déterminer si l'élément de droite correspond au sélecteur. 

Dès lors, en précisant plus d'un sélecteur, vous complexifiez le travail du navigateur.

Cela peut se produire si les feuilles de styles sont développées en SCSS. Les développeurs front-end ont tendance à trop indenter et donc surspécifier les sélecteurs CSS. La compilation avec Gulp ou Grunt, ne peut pas régler ce problème de manière automatique.

NB : Vous pouvez visualiser la complexité et la spécificité de vos sélecteurs avec un outil comme Specificity Visualizer.

La simplification des sélecteurs passe par l'œil aguerri d'un intégrateur front-end.  Et pourquoi pas un intégrateur de chez artwaï ? 

Nombre de sélecteurs complexes

30  0 1000 24000

Nous comptons par expression et combinatoire (espace, +, >,...) le nombre de sélecteurs avec 6 éléments ou plus.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#024

#31 Terminal/ PerformanceLimiter les mediaqueries non mobiles first 100 x 2

On considère comme mobile-first l'ensemble des pratiques qui donne la priorité aux besoins des utilisateurs mobiles pour optimiser leur expérience. En termes de code CSS, cela consiste à écrire du CSS de manière à ce que les petits appareils, les smartphones, puissent accéder à leurs styles sans avoir à parcourir les styles écrits pour les ordinateurs de bureau.

Généralement on définit les éléments communs à tous les appareils. Puis  on définit les éléments spécifiques à chaque résolution par palier à l'aide des mediaqueries en passant par l'instruction min-width. L'usage de max-width n'est pas à proscrire, mais vous devez garder deux principes en tête : 

  • Ne définissez les styles que lorsque cela est nécessaire. 
  • Ne pas les définir dans l'espoir de les écraser plus tard, encore et encore. 

Dans l'idéal, fractionnez vos CSS en plusieurs fichiers et distribuez-les via l'élément link dans le head en précisant la mediaquerie directement avec l'attribut media. Vous profiterez de la priorisation du navigateur qui chargera en premier les fichiers qui correspondent à sa résolution. Si vous travaillez en SCSS, l'usage d'un compilateur comme GULP devrait automatisé cette tâche.

Le respect de cette pratique peut contribuer à la résolution des problèmes de FOUC (Flash Of Unstyled Content) où l'utilisateur peut voir votre page se charger sans style pendant quelques instants avant de se corriger.

Nombre de mediaqueries non mobile-first

44  60 400 1200

Le test comptabilise l'ensemble des mentions max-width trouvés dans les mediaqueries du code CSS.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#006

#52 Terminal/ Accessibilité/ SEORenseigner une balise "title" 100 x 0.5

La balise "title" doit être présente dans le head du document. Elle contient un texte court et descriptif résumant le contenu de la page.

L'intérêt du title est multiple, car :

  • il définit le titre de l'onglet courant ou de la fenêtre du navigateur,
  • il donne un titre à la page lorsqu'elle est ajoutée aux favoris,
  • il est utilisé par les moteurs de recherche pour déterminer la pertinence du contenu proposé et lors de l'affichage des résultats,
  • et il est le premier élément entendu par les utilisateurs de lecteurs d'écran

En termes d'écoconception, la pertinence du titre évite une visite inutile à l'utilisateur, raccourcit le temps de recherche et réduit la charge des serveurs nécessaires.

Essayez de rendre le titre aussi précis et significatif que possible ! Toutefois quelques règles à respecter :

  • Au sein d'un même site, rendez chaque titre unique - ne dupliquez pas les titres d'une page à l'autre, même si elles sont similaires.
  • Généralement, les outils SEO recommandent d'écrire un title avec un nombre de caractères compris entre 30 et 60 afin qu'il s'affiche correctement dans les résultats de recherche.
  • Faites en sorte que le titre de la page corresponde au titre supérieur (idéalement étiqueté h1) de votre page. Ceux-ci n'ont pas besoin d'être identiques, mais il est souvent logique de les rendre très similaires pour confirmer au moteur de recherche la pertinence du sujet traité.
  • Utilisez vos mots-clés mais sans faire de bourrage de mots-clés non plus.

Présence d'un title dans le head

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Les documents doivent avoir un élément "title" pour faciliter la navigation, CNumR - BP#4015, Opquast règle n°97, Opquast règle n°98

#53 Terminal/ SEORenseigner une balise "meta description" 100 x 0.5

La balise HTML "meta description" est utilisée par les moteurs de recherche pour décrire le contenu d’une page web. Dans les résultats des moteurs de recherche, cette description s’affiche sous le titre et l’URL de votre page.

NB : Google a tendance à prendre le texte de la description de cette balise, mais si cette dernière s'avère non informative, le moteur de recherche peut également utiliser le contenu de votre page pour générer un extrait. 

Ne pensez pas vos "meta description" comme étant uniquement destinées aux moteurs de recherche. Avec l'usage abusif des mots-clés dans ce champ de texte, Google a décidé de retirer la balise "meta description" de ses critères de pertinence, comme indiqué sur blog officiel de Google en 2007 : "il convient de noter que même si des méta-descriptions précises peuvent améliorer le taux de clics, elles n'affecteront pas votre classement dans les résultats de recherche."

Toutefois, si votre description est attractive et décrit ce qu’ils recherchent, les utilisateurs cliqueront sur le lien proposé par le moteur de recherche pour voir votre page. Google ne peut pas savoir si votre page est attractive depuis la "meta description" mais sait compter ce sur quoi les utilisateurs cliquent.

Donc, pour améliorer votre CTR (Click Through Rate : taux de clic), soignez le texte de vos "meta description" pour être attractif. Pour vous guider, vous pouvez prendre en compte ces quelques conseils :

  • Rédigez un texte suffisamment long. Toute description de moins de 50 caractères est signalée comme « trop courte » dans Google Search Console. Dans la pratique, il est recommandé de respecter une taille minimum de 90 caractères et un maximum de 250.
  • Au sein d'un même site, rendez "chaque meta description" unique - ne dupliquez pas les titres d'une page à l'autre, même si elles sont similaires.
  • Utilisez vos mots-clés mais sans faire de bourrage de mots-clés non plus.

En termes d'écoconception, la pertinence de la description évitant une visite inutile à l'utilisateur, raccourcit le temps de recherche et réduit la charge des serveurs nécessaires.

Présence de la meta description

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Le document n'a pas de méta description, CNumR - BP#4015, Opquast règle n°3

#63 Terminal/ SEOEviter les plugins 100 x 0.3

Évitez d’utiliser des plug-ins (machines virtuelles Flash Player, Java et Silverlight, etc.), pour plusieurs raisons : 

  • Les moteurs de recherche ne peuvent pas indexer le contenu des plug-ins.
  • De nombreux appareils limitent l'utilisation de ces derniers, voire ne les acceptent pas.
  • Pour limiter votre impact environnemental, car ils peuvent entraîner une lourde charge de ressources (processeur et RAM). Par exemple, le lecteur Flash d'Adobe qu’Apple a décidé de ne pas prendre en charge sur ses appareils mobiles afin de maximiser la durée de vie de la batterie.

NB : Depuis 2020, ce type de contenu est très marginal.

Plugin non détecté

1 0 0

Lighthouse détecte la présence des plugins Flash Player, Java et Silverlight. Si oui, le score est à 0.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, CNumR.
Article de référence(s) : Le document utilise des plugins, CNumR - ex BP#12 (supprimé du référentiel v4)

#66 Terminal/ Performance/ SEOEviter les erreurs graves de l'HTML selon le W3C 100 x 1

Même si la plupart du temps, les erreurs relevés par le W3C n'ont que peu d'impact sur le fonctionnement d'une page ; certaines erreurs sont rédhibitoires.

En effet, tout code HTML mal formé peut provoquer des bugs graphiques et dans certains cas empêcher la bonne indexation des pages dans les moteurs de recherche. 

Nous avons identifié les erreurs graves suivantes comme des erreurs devant être corrigées : 

  • Elément mal placé : par exemple un élément meta dans le body ne sera pas interprété.
  • Pas d'espace entre 2 attributs.
  • Ouverture d'un élément non fermé par la suite.
  • Fermeture d'un élément non ouvert au préalable.
  • Erreur fatale qui empêche le validateur de parcourir le code dans son intégralité. 

Article sur le sujet : 

Nombre d'erreurs graves selon le W3C

0 10 20

Cette bonne pratique est aussi recommandée par : CNumR.
Article de référence(s) : CNumR - BP#031

#67 Terminal/ Performance/ AccessibilitéEviter les erreurs HTML selon le W3C 99 x 0.5

Cela peut paraitre surprenant, un code HTML mal formé et donc invalide selon les règles du W3C n'a finalement que peu d'impact sur le fonctionnement de la page. Pourquoi ? Parce que les navigateurs corrigent automatiquement les erreurs qu'ils trouvent. 

Toutefois, si le navigateur passe du temps à corriger les erreurs HTML, c'est donc du temps de chargement en plus.

La plupart des erreurs ont peu d'incidences mais il convient d'en avoir le moins possible et de connaître les raisons de celles qui ne peuvent être corrigées.

Article sur le sujet : 

Nombre d'erreurs selon le W3C

0 100 150

Cette bonne pratique est aussi recommandée par : CNumR.
Article de référence(s) : CNumR - BP#031

Serveur 0

Cette démarche d'écoconception vise à limiter l'impact environnemental sur les serveurs :
plus le nombre de requêtes est élevé, plus il faut de serveurs pour servir la page web.

#4 Serveur/ PerformanceActiver la compression 93 x 4

Les ressources textuelles type CSS ou JS doivent être servies avec compression pour minimiser le nombre total d'octets réseau, c'est-à-dire limiter limiter l’utilisation de la bande passante et améliorer les temps de chargement.  Selon le test, certains fichiers pourraient ne pas être compressés du tout ou être déjà compressés avec Gzip, mais deviendraient encore plus légers avec Brotli.

Tous les principaux systèmes de serveurs sont désormais compatibles avec Brotli.

Consultez la liste des types MIME concernés.

NB : la compression de petits fichiers (< 1 Ko) est discutable et que certains éléments tels que les images ou les polices au format WOFF2 ne doivent pas être compressés, car ils sont déjà inclus dans leur format

Gain estimé de la compression

32,68 Ko 20 200 400

Avec YellowLabTools, on mesure le nombre d'octets qui pourraient être économisés en compressant des fichiers textuels.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR, Opquast.
Article de référence(s) : https://developer.chrome.com/docs/lighthouse/performance/uses-text-compression/, CNumR - BP#078, Opquast règle n°219

#5 Serveur/ PerformanceMinifier les fichiers 34 x 4

Minifier les fichiers textuels type CSS ou JS permet d'économiser du poids. Il s'agit de rendre un programme plus petit, en le compactant, en réduisant la taille de son code. Cela se fait habituellement en supprimant les espaces, les indentations, et en raccourcissant les noms des variables.

Les gains de minification sont généralement faibles, mais l'impact peut être important lorsque ces fichiers texte sont chargés sur le chemin critique ou en priorité.

Vous pouvez le faire manuellement avec un service en ligne pour minifier vos fichiers, ou en automatisant votre flux de déploiement de votre code avec des outils de compilation comme Gulp ou Grunt.

Gain estimé de la minification

41,08 Ko 5 60 120

Avec YellowLabTools, on calcule le poids qui pourrait être économisé si toutes les ressources textuelles étaient correctement modifiées.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, YellowLab Tools, CNumR, Opquast.
Article de référence(s) : https://developer.chrome.com/docs/lighthouse/performance/unminified-css/, https://developer.chrome.com/docs/lighthouse/performance/unminified-javascript/, CNumR - BP#077, Opquast règle n°222, Opquast règle n°223

#6 Serveur/ PerformanceLimiter le nombre de requêtes 0 x 4 alerte

Chaque requête ralentit le chargement de la page, surtout sur le protocole HTTP/1, mais aussi un peu sur HTTP/2. En 2022, Web Almanac recensait environ 70 requêtes pour le chargement d'une page web médiane. Notez aussi qu'en situation de mobilité, un navigateur n'a pas une qualité de connexion constante. Limiter le nombre de requêtes permet donc aussi de limiter le risque qu'une ressource ne soit pas chargée correctement.

Il existe plusieurs techniques pour réduire le nombre de requêtes :

  • Concaténer des fichiers JS
  • Concaténer des fichiers CSS
  • Créer des sprites ou des fonts d'icônes pour les icônes
  • Utiliser le lazyload pour les images

Nous excluons volontairement les techniques suivantes de nos recommandations car elles créent souvent d'autres inconvénients : 

  • Incorporer ou intégrer de petits fichiers JS ou CSS dans le HTML
  • Base64 encode de petites images en HTML ou en feuilles de style

Bien évidemment, en réduisant le nombre de requêtes, vous réduisez les impacts environnementaux associés à la réalisation de la réponse.

Nombre de requêtes

582  80 240 320

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR.
Article de référence(s) : CNumR - BP#009

#7 Serveur/ PerformanceLimiter le nombre de domaines différents 0 x 3 alerte

Pour chaque domaine rencontré, le navigateur doit :

  1. Faire une recherche DNS,
  2. Initier une connexion,
  3. Effectuer la négociation SSL,
  4. Et après, répondre à la requête. 

Forcément, plus il y a de domaines, plus cela peut être lent. De plus, généralement, ces différents domaines sont des services tiers dont vous ne maîtrisez ni la réactivité du code, ni le taux de disponibilité. Vous avez donc une dépendance à ces services, voire même un SPOF (Single Point Of Failure : point de défaillance unique, dont le reste du site est dépendant et dont une panne peut entraîner des dysfonctionnements).

Évitez d'avoir de nombreux domaines différents ; la page devrait s'afficher plus rapidement et vous évitez de consommer de la bande passante inutilement.

Une solution simple consiste à rapatrier sur le domaine first-party les ressources qui peuvent l'être. Par exemple, une police de caractères disponible sur fonts.google.com, une librairie JavaScript externe. Il est aussi possible de mettre en place une routine pour récupérer un fichier dépendant de paramètres changeants à intervalles réguliers, comme une CMP.

NB : la technique nommée "domain sharding" n'est plus une bonne pratique.

Nombre de domaines différents

154  12 30 60

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#018

#8 Serveur/ PerformanceEviter les requêtes en erreur 404 100 x 1

Lorsqu'une ressource est demandée à un serveur, celui commence par répondre avec un code de statut HTTP. Ces codes sont envoyés par le serveur HTTP au navigateur afin de permettre à ce dernier de déterminer automatiquement si une requête a réussi, et sinon, de connaître le type d'erreur. Ces codes sont spécifiés dans le document RFC 7231 par l'IETF (Internet Engineering Task Force). 

Une erreur 404 est un code d’erreur HTTP transmis par un serveur web quand une ressource demandée est indisponible ou que le serveur n’arrive pas à la trouver. Les erreurs 404 ne sont jamais mises en cache, donc chaque fois qu'une URL se termine en 404, elle arrive sur le serveur même si elle se trouve derrière un CDN ou un cache de proxy inverse.

Une erreur 404 occupe inutilement le navigateur et le serveur qui doit lui répondre et chercher une ressource qui n'existe pas ou qui n'existe plus.

NB : Cette bonne pratique est recommandée par l'analyste GreenIT Analysis, mais n'a pas son équivalent dans le référentiel du CNumR.

Nombre d'erreurs 404

0 1 1

On mesure ici les requêtes effectués qui répondent en erreur 404 et non pas les liens brisés éventuels de la page disponibles pour l'utilisateur.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Opquast.
Article de référence(s) : Opquast règle n°147

#11 Serveur/ PerformanceDifférez le chargement des images hors écran 91 x 4

Envisagez de charger paresseusement (en lazyload) les images sous la ligne de flottaison du viewport , une fois que toutes les ressources critiques ont fini de se charger pour réduire le temps d'interaction. Il s'agit de différer le chargement des images non visibles à l’écran jusqu'au moment où l’utilisateur est susceptible de les voir.  C'est un excellent moyen d'accélérer le temps de chargement initial d'une page tout en économisant de la bande passante.

Nous recommandons d'utiliser le lazyloading natif des image qui fonctionne désormais pour les principaux navigateurs du marché. Ce simple attribut se révèle très efficace. Attention, toutes les images ne doivent pas être lazyloadée avec l'attribut loading="lazy". Pour les images constitutive du LCP ou situées au dessus de la ligne de flottaison, préférez loading="eager" qui priorisera leurs chargements. 

Articles sur le sujet : 

Nombre d'images non "lazyloadées"

1 12 30

Nous comptons le nombre d'images affichées sous la ligne de flottaison du viewport.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR.
Article de référence(s) : Différer les images hors champ, CNumR - BP#037

#42 Serveur/ PerformanceLimiter le nombre de polices 0 x 4

Les polices Web affectent les performances de différentes manières :

  1. Si une police Web n'a pas été chargée, les navigateurs retardent généralement le rendu du texte. Dans de nombreuses situations, cela retarde le FCP (First Contentful Paint)  et parfois le LCP (Largest Contentful Paint).
  2. Le temps que la police soit chargée, une police de substitution est affichée. Quand le changement de police affichée intervient cela peut produire des décalages de mise en page et avoir un impact sur le CLS (Cumulative Layout Shift). Cela se produit lorsqu'une police Web et sa police de secours ont des tailles de glyphes différentes.

Donc vous avez tout intérêt à réduire le nombre de polices sur vos pages web. Il existe trois solutions pour réduire ce nombre : les polices système et les polices variables.

  • Une police système est la police par défaut utilisée par le navigateur. Les polices système varient généralement selon le système d'exploitation et la version. Mais étant donné que la police est déjà installée, elle n'a pas besoin d'être téléchargée. Les polices système fonctionnent particulièrement bien pour le corps du texte.

  • Utiliser le "faux gras" en CSS permet d'éviter de charger une police dédiée à une version "grasse" d'une police déjà chargée.

  • Une police variable peut être utilisée en remplacement de plusieurs fichiers de polices. En effet, les polices variables fonctionnent en définissant un style de police "par défaut" et en fournissant des "axes" pour manipuler la police.

En règle générale, une seule police de caractères et une seule pour les icônes devraient suffire.

Quelques articles sur le sujet :

Nombre de polices

2 6 10

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#029

#45 Serveur/ PerformanceUtiliser la version la plus récente du protocole HTTP/2 0 x 4

Les avantages d'HTTP/2 sont multiples :

  • Les demandes et les réponses parallèles multiplexées ne se bloquent pas entre elles.
  • Une seule connexion TCP est utilisée pour assurer une utilisation efficace des ressources réseau malgré la transmission de plusieurs flux de données.
  • Pas besoin d’appliquer des hacks d’optimisation inutiles – tels que les sprites d’images, la concaténation et le domain sharding, entre autres – qui compromettent d’autres domaines de performance du réseau.
  • Temps de latence réduit.
  • Réduction des coûts d’exploitation et d’investissement des ressources réseau et informatiques.

HTTP/2 n'est pas la dernière version du protocole HTTP. HTTP/3 est en cours de déploiement sur de nombreux serveurs et est encore plus rapide !

NB : En dessous de 5 requêtes, les bénéfices de HTTP/2 sont généralement moins importants.

Nombre de requêtes en HTTP/1 au delà de 4 par domaine

57  0 25 100

Lorsqu'un domaine envoie plus de 4 requêtes via HTTP/1, cette métrique compte un point pour chaque nouvelle requête. 

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#4006

#48 Serveur/ PerformanceLimiter les mises en cache non spécifiées 0 x 4 alerte

La mise en cache des en-têtes fait partie de ces technologies Web qui sont souvent mal configurées. La requête la plus rapide est celle qui n'est pas faite, et les en-têtes de mise en cache vous permettent d'indiquer aux navigateurs quand ils peuvent réutiliser une ressource qu'ils ont déjà téléchargée

C'est particulièrement utile avec les ressources dites statiques comme les images, les fichiers de polices, les fichiers JS et CSS. Lorsqu'aucune mise en cache n'est spécifiée, chaque navigateur la gère différemment. La plupart du temps, il ajoutera automatiquement un cache lui-même, mais de mauvaise qualité. 

Pour régler ce problème, il faut configurer le serveur pour qu'il retourne une des entêtes suivantes : Cache-control ou Expires. 

Vous pouvez combiner cette requête avec ETag ou Last-Modified qui permettent de bypasser l'entête précédente en cas de modification du fichier, afin que le navigateur récupère la version la plus récente du fichier.

Nous recommandons l'usage de Cache-control et ETag plutôt que Expires et Last-Modified.

NB : Même avec un entête ETag, la mise à jour d'un fichier dans le navigateur peut s'avérer compliqué. artwaï recommande d'ajouter un hash dans vos noms de fichiers (et non pas en paramètre dans l'url) pour contrer ce problème.

Nombre de requêtes sans mise en cache spécifiée

410  5 20 40

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Avec YellowLabTools, on vérifie la présence d'au moins une des entêtes HTTP suivantes sur les fichiers statiques (image, CSS et JS) : cache-control, expires, pragma, x-pass-expires ou x-pass-cache-control. Et si la valeur attribuée à un de ces en-têtes est un nombre supérieur à 0.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Servir des ressources statiques avec une politique de cache efficace, CNumR - BP#101, Opquast règle n°220

Réseau 55

Puisque ce sont les infrastructures réseaux qui transportent les ressources jusqu’aux navigateurs, un poids maîtrisé est essentiel pour limiter l'impact environnemental des réseaux.

#1 Réseau/ PerformanceLimiter le poids total de la page 19 x 5

Le poids est, selon Artwaï, la métrique la plus importante à surveiller !

En 2022, Web Almanach recensait un poids médian des pages web d'environ 2 Mo. Selon Alex Russell (ingénieur logiciel chez Google), le poids idéal pour qu'une page se charge en moins de 5 secondes est de 500 Ko...

L'objectif "raisonnable" que vous pouvez vous fixer est de rester sous 1 Mo, ce qui est déjà très long à télécharger sur une connexion lente.

Maîtriser le poids de vos pages est aussi une bonne pratique en termes d'éco-conception et compte pour le calcul de l'écoindex. En effet, le poids et le temps d’exécution, en étant plus légers, seront moins gourmands en énergie. Par exemple : en nettoyant son code JavaScript, Wikipédia a économisé 4,3 téraoctets par jour de bande passante de données pour ses visiteurs. L’équivalent de 700 arbres à planter pour faire face à la pollution annuelle qui en aurait résulté.

Quelques articles sur le sujet : 

Poids total

2,71 Mo 1.5 3 5

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse.
Article de référence(s) : Évitez les énormes charges utiles du réseau

#2 Réseau/ PerformanceOptimiser les images 100 x 4

L'optimisation des images est généralement l'un des moyens les plus simples de réduire le poids d'une page et, par conséquent, le temps de chargement de la page.

La compression est donc l’étape essentielle pour optimiser les images. Elle sert à réduire la redondance des données d’une image afin de pouvoir l’emmagasiner en occupant moins de place.

  • Il y a la compression avec perte de données, où l’image devient plus floue à mesure qu’elle est compressée ;
  • et la compression sans perte, où les traits de l’image restent nets.

Il faut trouver le bon rapport qualité/compression qui satisfasse à vos besoins.

N'utilisez pas Photoshop ou d'autres outils d'édition d'images, car ils ne sont pas très bons pour l'optimisation. Utilisez des outils spécialisés comme Kraken.io ou l'excellent ImageOptim sur Mac. Pour les images SVG, vous pouvez utiliser SVGOMG.

Article sur le sujet : 

Gain estimé en optimisant les images

13,43 Ko 20 200 300

Avec YellowLabTools, on mesure le nombre d'octets qui pourraient être économisés en optimisant les images.

Cette bonne pratique est aussi recommandée par : YellowLab Tools, CNumR.
Article de référence(s) : CNumR - BP#080

Accessibilité (57 bonnes pratiques)

Le Web est fondamentalement conçu pour fonctionner pour toutes les personnes, quels que soient leur matériel, leurs logiciels, leur langue, leur emplacement ou leurs capacités. Ces bonnes pratiques permettent de surveiller un certain nombre de points de contrôle pour veiller à l'accessibilité des contenus pour ceux qui auraient une déficience, mais aussi pour tous. Certaines des pratiques listées ci-dessous rendent simplement l'expérience utilisateur plus agréable.
NB : Les relevés automatiques réalisés ici ne permettent pas de garantir à 100 % le respect de tous les critères d'accessibilité, mais c'est un bon point de départ.

Structure 100

La structure d'une page web est sa colonne vertébrale. Le respect de ces bonnes pratiques assure une transcription sans erreur du site internet, quel que soit le contexte d'usage de l'utilisateur.

#16 Structure/ PerformanceNe pas avoir d'IDs dupliqués 100 x 2

L'attribut id définit un identifiant qui doit être unique pour l'ensemble du document. Le but de cet attribut est de pouvoir identifier un élément lorsqu'on crée un lien, qu'on souhaite le manipuler avec un script ou qu'on le met en forme avec CSS.

Comme les navigateurs sont très indulgents en matière de rendu HTML, ils autorisent les ID en double. Cela devrait être à proscrire dans la mesure du possible et strictement proscrit lors de l'accès aux éléments par ID en JavaScript.

En effet, que doit renvoyer la méthode getElementById lorsque plusieurs éléments correspondants sont trouvés ? Devrait-il renvoyer une erreur, le 1er élément correspondant, un ensemble d'éléments, etc. ?

C'est d'autant plus important en termes d'accessibilité. S'assurer que les ids sont uniques permet d'éviter les erreurs clés qui sont connues pour causer des problèmes aux technologies d'assistance lorsqu'elles essaient d'analyser le contenu qui a le même attribut id sur différents éléments.

Nombre d'IDs dupliqués

0 10 50

Cette bonne pratique est aussi recommandée par : YellowLab Tools, Google Lighthouse, WCAG, Opquast.
Article de référence(s) : https://dequeuniversity.com/rules/axe/4.7/duplicate-id-aria, Les identifiants des éléments actifs doivent être uniques, Opquast règle n°229

#52 Structure/ Ecoconception/ SEORenseigner une balise "title" 100 x 4

La balise "title" doit être présente dans le head du document. Elle contient un texte court et descriptif résumant le contenu de la page.

L'intérêt du title est multiple, car :

  • il définit le titre de l'onglet courant ou de la fenêtre du navigateur,
  • il donne un titre à la page lorsqu'elle est ajoutée aux favoris,
  • il est utilisé par les moteurs de recherche pour déterminer la pertinence du contenu proposé et lors de l'affichage des résultats,
  • et il est le premier élément entendu par les utilisateurs de lecteurs d'écran

En termes d'écoconception, la pertinence du titre évite une visite inutile à l'utilisateur, raccourcit le temps de recherche et réduit la charge des serveurs nécessaires.

Essayez de rendre le titre aussi précis et significatif que possible ! Toutefois quelques règles à respecter :

  • Au sein d'un même site, rendez chaque titre unique - ne dupliquez pas les titres d'une page à l'autre, même si elles sont similaires.
  • Généralement, les outils SEO recommandent d'écrire un title avec un nombre de caractères compris entre 30 et 60 afin qu'il s'affiche correctement dans les résultats de recherche.
  • Faites en sorte que le titre de la page corresponde au titre supérieur (idéalement étiqueté h1) de votre page. Ceux-ci n'ont pas besoin d'être identiques, mais il est souvent logique de les rendre très similaires pour confirmer au moteur de recherche la pertinence du sujet traité.
  • Utilisez vos mots-clés mais sans faire de bourrage de mots-clés non plus.

Présence d'un title dans le head

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Les documents doivent avoir un élément "title" pour faciliter la navigation, CNumR - BP#4015, Opquast règle n°97, Opquast règle n°98

#59 Structure/ SEORenseigner un attribut "alt" sur chaque image 100 x 4

L'attribut "alt" doit être obligatoirement présent sur l'élément HTML "img". Cet attribut fournit une description textuelle de l'image. Il peut être vide mais est extrêmement utile pour l'accessibilité et le SEO. 

En effet, les outils de lecture d'écran utilisent cette description pour la lire afin que les personnes qui ne peuvent pas la voir sachent ce que l'image représente. In extenso, un robot d'un moteur de recherche "ne voit pas" l'image mais peut utiliser sa description quand l'attribut "alt" est renseigné.

Pour bien optimiser votre référencement, utilisez les attributs "alt" pour faire des descriptions précises de vos images en restant sous les 100 caractères et profitez-en pour placer vos mots clés de manière naturelle.

Si une image est purement décorative, l'attribut alt doit être vide (alt="") afin que les lecteurs d'écran et robots l'ignorent simplement.

Nombre d'images sans attribut ALT

0 3 10

Cette bonne pratique est aussi recommandée par : Opquast, Google Lighthouse.
Article de référence(s) : Règle n° 111 - Chaque image décorative est dotée d'une alternative textuelle appropriée, Les images doivent avoir un texte alternatif, Opquast règle n°111, Opquast règle n°112, Opquast règle n°113

#67 Structure/ Performance/ EcoconceptionEviter les erreurs HTML selon le W3C 99 x 3

Cela peut paraitre surprenant, un code HTML mal formé et donc invalide selon les règles du W3C n'a finalement que peu d'impact sur le fonctionnement de la page. Pourquoi ? Parce que les navigateurs corrigent automatiquement les erreurs qu'ils trouvent. 

Toutefois, si le navigateur passe du temps à corriger les erreurs HTML, c'est donc du temps de chargement en plus.

La plupart des erreurs ont peu d'incidences mais il convient d'en avoir le moins possible et de connaître les raisons de celles qui ne peuvent être corrigées.

Article sur le sujet : 

Nombre d'erreurs selon le W3C

0 100 150

Cette bonne pratique est aussi recommandée par : CNumR.
Article de référence(s) : CNumR - BP#031

#72 StructureNe pas associer plusieurs étiquettes de même type à un champ de formulaire NA x 2

Si chaque champ de formulaire doit être associé à au moins une étiquette, il n'est aucunement recommandé de lui en associer plusieurs de même type.

Cela signifie qu'un champ de formulaire peut avoir une étiquette de type "label" et un attribut "aria-label", mais pas deux étiquettes de type "label".

L'attribution de plusieurs étiquettes de même type à un champ de formulaire peut entraîner des problèmes pour certains lecteurs d'écran et de navigateurs. Les résultats sont incohérents d'une combinaison à l'autre. Certaines combinaisons liront la première étiquette. Certains liront la dernière étiquette. D'autres liront les deux étiquettes...

Nombre de champs de formulaire avec plusieurs items

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Le champ du formulaire ne doit pas contenir plusieurs éléments d'étiquette, Opquast règle n°67

#73 StructureRespecter la structure des listes de définitions NA x 2

L'élément dl représente une liste de définitions sous la forme d'une liste de paires d'éléments dt/dd (terme et définition ). On utilisera cette structure pour représenter un glossaire.

Dès lors, il convient de vérifier que :

  • Les éléments de liste de définition sont encapsulés dans des éléments dl.
  • Les éléments dl ne contiennent que des éléments dt et dd dans le bon ordre,
  • ou éventuellement des éléments script, template ou div.

Respecter cette bonne pratique permet aux lecteurs d'écran de les énoncer correctement.

Nombres d'Eléments dl, dt ou dd non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les éléments <dt> et <dd> doivent être contenus par un <dl>, Les éléments <dl> ne doivent contenir directement que des groupes <dt> et <dd> correctement ordonnés, des éléments <script>, <template> ou <div>

#76 StructureRenseigner des valeurs valides pour les attributs role 100 x 2

Par défaut, de nombreux éléments HTML ont un sens sémantique, mais pas tous (div, span). Les rôles ARIA permettent de déterminer une signification sémantique aux éléments qui n'en ont pas ou redéfinir le sens des éléments qui en ont. 

Pour cela, il suffit d'utiliser l'attribut role.  Par exemple, définir un rôle de titre de niveau 1 à une div :

<div role="heading" aria-level="1">Texte</div>

Cela signifie que l'arbre d'accessibilité (accessibility tree) est modifié. Cela ne change pas le comportement de la page pour les navigateurs standards. Mais pour un lecteur d'écrans (et un moteur de recherche), l'exemple ci-dessus sera interprété comme un h1.

Les valeurs d'attribut sont précis et doivent être renseignées correctement afin de remplir leurs fonctions d'accessibilité.

NB : Depuis l'arrivée des éléments de structure en HTML5, ces attributs sont moins nécessaires et doivent être utilisés avec parcimonie.

 

Nombre de roles invalides

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les rôles ARIA utilisés doivent être conformes à des valeurs valides

#81 StructureRespecter la hiérarchie des éléments role NA x 2

Pour chaque rôle, WAI-ARIA définit explicitement quels éléments enfants ou parents avec l'attribut role sont autorisés et/ou requis. Si cette hiérarchie n'est pas respectée, la technologie d'assistance ne pourra pas fonctionner comme prévu.

Lorsqu'il est nécessaire de transmettre le contexte à l'utilisateur d'une technologie d'assistance sous forme de hiérarchie (par exemple, l'importance d'un conteneur parent, d'un élément ou d'un frère dans une arborescence de dossiers), et que la hiérarchie diffère de la structure du code ou de l'arborescence du DOM, il n'existe aucun moyen de fournir les informations sur la relation sans l'utilisation des éléments parents du rôle ARIA.

Nombre d'éléments ARIA non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Certains rôles ARIA doivent être contenus par des parents particuliers, Certains rôles ARIA doivent contenir des enfants particuliers

#83 StructureRenseigner des valeurs valides pour les attributs aria-* 100 x 2

Les attributs ARIA (commençant par aria-) doivent contenir des valeurs valides. Ces valeurs doivent être orthographiées correctement et correspondre à des valeurs qui ont du sens pour qu'un attribut particulier remplisse la fonction d'accessibilité prévue.

De nombreux attributs ARIA acceptent un ensemble spécifique de valeurs. Les valeurs autorisées, les valeurs « non définies » acceptables et les valeurs « par défaut » acceptables sont requises. Le non-respect des valeurs autorisées entraîne un contenu qui est inaccessible aux utilisateurs de technologies d'assistance.

Nombre de valeurs d'attributs aria-* invalides

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les attributs ARIA doivent être conformes à des valeurs valides

#84 StructureNe pas mettre d'éléments interactifs dans un élément avec l'attribut role=text NA x 3

Lorsqu'un nœud de texte est divisé par un balisage (par exemple : <h1>Hello <span>World</span></h1>), VoiceOver le traitera comme deux phrases distinctes au lieu d'une seule. L'ajout role="text" d'éléments autour résout le problème.

Cependant, il remplace également le rôle de l'élément et de tous ses descendants et les traite tous comme des nœuds de texte. Si l'un des éléments descendants est également interactif, cela créerait un point de tabulation vide. Autrement dit, vous pouvez accéder à l'élément en tabulant, mais VoiceOver n'annonce pas son nom, son rôle ou sa valeur.

Il convient donc de ne pas mettre d'éléments focalisables dans un élément avec l'attribut role=text.

Nombre d'éléments non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : "role=text" ne doit avoir aucun descendant focalisable

#85 StructureUtiliser des attributs aria-* valides et correctement orthographiés 100 x 2

Il s'agit ici de vérifier la partie du nom de l'attribut aria-* venant après le tiret.

Afin de permettre aux technologies d'assistance de transmettre des informations appropriées aux personnes en situation de handicap, les éléments de l'interface utilisateur destinés à améliorer l'accessibilité et l'interopérabilité du contenu web et des applications doivent être conformes aux attributs aria correctement orthographiés et actuels.

Les technologies d'assistance telles que les lecteurs d'écran ne peuvent pas interpréter les attributs ARIA si leurs noms ne sont pas valides.

Nombre d'attributs aria-* mal orthographiés

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les attributs ARIA doivent être conformes à des noms valides

#90 StructureNe pas utiliser aria-hidden="true" sur le body 100 x 5

Lorsque aria-hidden="true" est appliqué au body, le contenu n’est pas accessible aux technologies d’assistance.

Une page Web est conçue pour être entièrement accessible, et elle ne le serait si aucun élément ne contient la valeur de l'attribut aria-hidden="true". Les lecteurs d'écran ne lisent pas le contenu marqué avec cette valeur. Les utilisateurs peuvent toujours accéder aux éléments focalisables dans les objets cachés, mais les lecteurs d'écran restent silencieux.

Tout contenu ou élément d'interface intentionnellement masqué aux utilisateurs (par exemple, boîtes de dialogue inactives, menus réduits) doit également être masqué aux utilisateurs de lecteurs d'écran. Lorsque des éléments sont disponibles pour les utilisateurs voyants, par exemple lorsqu'ils activent un bouton ou développent un élément de menu, les mêmes éléments doivent être disponibles pour les utilisateurs de lecteurs d'écran. 

L’objectif est d’offrir aux utilisateurs de lecteurs d’écran une expérience utilisateur équivalente à celle des utilisateurs voyants. S'il existe une raison impérieuse de cacher du contenu aux utilisateurs voyants, il existe généralement une raison impérieuse de cacher ce contenu aux utilisateurs de lecteur d'écran. Et inversement, lorsque le contenu est mis à la disposition des utilisateurs voyants, il est logique de le rendre également accessible aux utilisateurs non voyants.

Présence de l'attribut aria-hidden="true" sur le body

0 1 1

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : aria-hidden='true' ne doit pas être présent dans le corps du document

#91 StructureNe pas mettre d'éléments sélectionnables dans un élément avec aria-hidden="true" 100 x 5

L'utilisation de l'attribut aria-hidden="true" sur un élément supprime l'élément et TOUS ses nœuds enfants de l'API d'accessibilité, le rendant complètement inaccessible aux lecteurs d'écran et autres technologies d'assistance. 

De plus, un élément focalisable avec aria-hidden="true" est ignoré dans le cadre de l'ordre de lecture, mais fait toujours partie de l'ordre de focus, ce qui rend son état visible ou masqué peu clair.

Aria-hidden peut être utilisé avec une extrême prudence pour masquer le contenu visiblement rendu aux technologies d'assistance uniquement si le fait de masquer ce contenu vise à améliorer l'expérience des utilisateurs de technologies d'assistance en supprimant le contenu redondant ou superflu.

Si aria-hidden est utilisé pour masquer le contenu visible aux lecteurs d’écran, la signification et la fonctionnalité identiques ou équivalentes doivent être exposées aux technologies d’assistance.

Nombre d'éléments non conformes

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : L'élément masqué ARIA ne doit pas être focalisable ni contenir d'éléments focalisables

#93 StructureRespecter la structure des listes ul et ol 100 x 2

Les éléments ul et ol représentent respectivement une liste non ordonnée et une liste ordonnée. On utilise cette structure assez souvent pour représenter n'importe quel listings dans une page.

Dès lors, il convient de vérifier que :

  • Les éléments de liste li sont encapsulés dans des éléments ul ou ol.
  • Les éléments ul ou ol ne contiennent en enfant direct que des éléments li.

Respecter cette bonne pratique permet aussi aux lecteurs d'écran de les énoncer correctement.

Nombres d'Eléments ul, ol ou li non conformes

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : <ul> et <ol> ne doivent contenir directement que des éléments <li>, <script> ou <template>, Les éléments <li> doivent être contenus dans un <ul> ou un <ol>, Opquast règle n°228

#104 StructureUtiliser les attributs aria-* conformément à leurs rôles 100 x 2

La norme ARIA définit explicitement quels attributs sont autorisés pour un role donné et pour chaque attribut et où cet attribut peut être utilisé. Les informations détaillées sur chaque attribut peuvent être trouvées en consultant la documentation de chaque role et/ou chaque attribut : 

L'utilisation des attributs ARIA dans des roles où ils ne sont pas autorisés peut interférer avec l'accessibilité de la page Web. L’utilisation d’une combinaison role-attribut non valide n’aura, au mieux, aucun effet sur l’accessibilité de l’application et, au pire, peut déclencher un comportement qui désactive l’accessibilité pour des parties entières d’une application.

Nombre d'éléments none conformes

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les éléments ne doivent utiliser que les attributs ARIA autorisés

#105 StructureRenseigner les attributs aria-* requis pour tous les éléments avec role 100 x 2

La norme ARIA définit explicitement quels attributs sont requis pour un rôle donné. Les informations détaillées sur chaque attribut peuvent être trouvées en consultant la documentation de chaque rôle et/ou chaque attribut : 

Des attributs sont souvent requis pour les alertes, les boîtes de dialogue, les menus, les barres de progression, les info-bulle et d'autres widgets...

Lorsque les attributs d'état et de propriété requis pour des rôles spécifiques (et des rôles de sous-classe) ne sont pas présents, les lecteurs d'écran peuvent ne pas être en mesure de transmettre la définition du rôle de l'élément aux utilisateurs.

Nombre d'éléments role sans les aria-* requis

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les attributs ARIA requis doivent être fournis

#113 StructureUtiliser les attributs scope ou headers sur les cellules d'entêtes en référence à des cellules de données NA x 2

L'attribut scope spécifie si une cellule d'en-tête th est un en-tête pour une colonne, une ligne ou un groupe de colonnes ou de lignes. Et l'attribut headers spécifie une ou plusieurs cellules d'en-tête auxquelles une cellule est liée. Attention, ces deux attributs ne doivent pas être utilisés en combinaison l'un de l'autre.

Ces deux attributs n'ont aucun effet visuel dans les navigateurs Web ordinaires, mais peuvent être utilisés par les lecteurs d'écran qui ajoutent des fonctionnalités permettant de naviguer plus simplement dans les tableaux.

Cette bonne pratique vérifie que chaque cellule d'en-tête est référencée comme en-tête d'une colonne ou d'une ligne.

En vous assurant que les en-têtes de tableaux fassent toujours référence à un ensemble de cellules spécifique, vous pourrez améliorer l'expérience des utilisateurs de lecteurs d'écran. 

Nombre d'éléments non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les en-têtes de tableau d'un tableau de données doivent faire référence à des cellules de données, Opquast règle n°236

#114 StructureRespecter la structure des entêtes de tableau NA x 2

L'attribut scope spécifie si une cellule d'en-tête th est un en-tête pour une colonne, une ligne ou un groupe de colonnes ou de lignes. Et l'attribut headers spécifie une ou plusieurs cellules d'en-tête auxquelles une cellule est liée. Attention, ces deux attributs ne doivent pas être utilisées en combinaison l'un de l'autre.

Ces deux attributs n'ont aucun effet visuel dans les navigateurs Web ordinaires, mais peuvent être utilisés par les lecteurs d'écran qui ajoutent des fonctionnalités qui permettent de naviguer plus simplement dans les tableaux.

Utilisez au moins une en-tête pour chaque cellule d'un grand tableau au moins trois cellules en largeur et en hauteur.

Cette bonne pratique vérifie que la structure d'en-tête et le balisage sémantique des tableaux sont corrects.

 Vous pouvez améliorer l'expérience des utilisateurs de lecteurs d'écran en vous assurant que les éléments td d'un grand tableau sont associés à un en-tête de tableau.

Nombre d'éléments non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les éléments <td> non vides dans une <table> plus grande doivent avoir un en-tête de tableau associé, Les cellules de tableau qui utilisent l'attribut headers doivent uniquement faire référence aux cellules du même tableau., Opquast règle n°236

#115 StructureNe pas utiliser de cellules avec l'attribut colspan pour indiquer une légende NA x 1

L'HTML définit un sens sémantique aux balises. Une mauvaise pratique courante consiste à utiliser les premières cellules d'un tableau pour y mettre un titre. Généralement, il s'agit d'un élément td avec un attribut colspan.

Lorsque les tableaux ne sont pas balisés avec un élément de légende réel, au lieu d'utiliser un attribut colspan sur les cellules pour indiquer visuellement une légende, les utilisateurs de lecteurs d'écran ne peuvent pas percevoir correctement l'objectif du tableau.

Vous devez utiliser l'élément caption pour définir un titre ou une légende à un tableau.

Vous pouvez améliorer l'expérience des utilisateurs de lecteurs d'écran en vous assurant que les tableaux utilisent bien l'élément de sous-titres au lieu de cellules avec l'attribut colspan.

Nombre d'éléments non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les données ou les cellules d’en-tête ne doivent pas être utilisées pour donner une légende à un tableau de données.

#129 StructureAjouter une balise main sur le contenu de la page NA x 2

L'un des repères principaux permet aux utilisateurs de lecteurs d'écran de naviguer sur une page Web. [En savoir plus sur les repères](https://dequeuniversity.com/rules/axe/4.7/landmark-one-main)

NaN  1 0 0

Cette bonne pratique est aussi recommandée par :.

Contenu 100

Certains éléments nécessitent d'avoir un contexte pour pouvoir être compris (placement dans la page, couleur, icône, usage etc), hors l'ensemble des utilisateurs n'ont pas toujours accès à ce contexte. Prévoir un libellé textuel accessible pour chaque élément assure une compréhension du site internet à l'ensemble des utilisateurs.

#79 ContenuRenseigner un nom accessible pour les éléments avec role button, link ou menuitem NA x 2

Il ne suffit pas de renseigner l'attribut role d'un élément html pour le rendre accessible. Il faut à minima que ceux-ci aient un nom qui le soit, un nom accessible donc. Notamment pour les rôles button, link et menuitem.

Il y a 4 méthodes pour renseigner ce nom :

  • un texte intérieur visible pour les lecteurs d'écran.
  • un attribut title non vide.
  • un attribut aria-label non vide.
  • un attribut aria-labelledby pointant vers un élément avec un texte perceptible par les lecteurs d'écran.

Ce nom doit décrire clairement la destination, le but, la fonction ou l'action pour les utilisateurs de lecteurs d'écran.

Nombre d'éléments role sans noms accessibles

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les commandes ARIA doivent avoir un nom accessible, Opquast règle n°132

#86 ContenuRenseigner un nom accessible pour les éléments avec un role de champs de saisie NA x 3

Il ne suffit pas de renseigner l'attribut role d'un élément html pour le rendre accessible. Il faut à minima que celui-ci ait un nom accessible. Cela concerne notamment les rôles de champ de saisie suivants :

  • combobox
  • listbox
  • searchbox
  • slider
  • spinbutton
  • textbox

Qui sont souvent nécessaires pour rendre accessible des composants réalisés en JavaScript.

Lorsqu'un champ de saisie n'a pas de nom accessible, les lecteurs d'écran l'annoncent avec un nom générique, ce qui le rend inutilisable pour les personnes qui se servent de tels outils. 

Nombre d'éléments non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les champs de saisie ARIA doivent avoir un nom accessible

#87 ContenuRenseigner un nom accessible pour les éléments avec role de champs d'activation/désactivation NA x 3

Il ne suffit pas de renseigner l'attribut role d'un élément html pour le rendre accessible. Il faut, a minima, que celui-ci ait un nom accessible. Cela concerne notamment les rôles sémantiques suivants :

  • checkbox
  • menu
  • menuitemcheckbox
  • menuitemradio
  • radio
  • radiogroup
  • switch

Lorsqu'un champ d'activation ou de désactivation n'a pas de nom accessible, les lecteurs d'écran l'annoncent avec un nom générique, ce qui le rend inutilisable pour les personnes qui se servent de tels outils.

NOMBRE D'ÉLÉMENTS NON CONFORMES

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les champs à bascule ARIA doivent avoir un nom accessible

#88 ContenuRenseigner un nom accessible aux boutons 100 x 5

Lorsqu'un bouton n'a pas de nom accessible, les lecteurs d'écran annoncent simplement qu'il s'agit d'un "bouton", ce qui le rend inutilisable pour les personnes qui se servent de tels outils.

Plusieurs méthodes permettent de renseigner un nom accessible :

  • un texte intérieur visible pour les utilisateurs de lecteurs d'écran,
  • un attribut non vide title,
  • un attribut non vide aria-label,
  • un attribut aria-labelledby pointant vers un élément avec un texte perceptible par les utilisateurs de lecteurs d'écran.

Nombre de boutons sans nom accessible

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les boutons doivent avoir un texte visible

#89 ContenuRenseigner un nom accessible pour les éléments avec un role=dialog ou role=alertdialog NA x 3

Il ne suffit pas de renseigner l'attribut role d'un élément html pour le rendre accessible. Il faut à minima que celui-ci ait un nom qui le soit, un nom accessible donc. Notamment pour les rôles de boîte de dialogue :

  • dialog
  • alertdialog

Vérifiez que chaque élément avec role="dialog"ou role="alertdialog" possède l'une des caractéristiques suivantes :

  • un attribut non vide aria-label.
  • un attribut aria-labelledby pointant vers un élément avec un texte perceptible par les utilisateurs de lecteurs d'écran.

Les éléments de boîte de dialogue ARIA sans nom accessible peuvent empêcher les utilisateurs de lecteurs d'écran de comprendre la fonction de ces éléments. 

NOMBRE D'ÉLÉMENTS NON CONFORMES

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les nœuds de dialogue ARIA et de dialogue d'alerte doivent avoir un nom accessible

#92 Contenu/ SEORenseigner un contenu pour tous les titres Hn 100 x 5

Les éléments h1 à h6 constituent la hiérarchie de contenu d'une page. Chacun correspond à un niveau d'importance, le niveau 1 étant le plus important et le niveau 6 le moins important.

L’utilisation de ces balises a un impact direct sur le référencement naturel. Cela permet aux crawlers (robots d’exploration comme Googlebot) de comprendre plus rapidement le contenu de la page Web en lui indiquant votre titre principal (le h1) et vos autres sous-titres (du h2 au h6). Bien entendu, la balise h1 est la plus importante !

Il est donc primordial qu'elles contiennent un contenu et accessoirement les mots-clés que vous ciblez, et donc ne pas être vides.

En termes d'accessibilité, les lecteurs d'écran alertent les utilisateurs de la présence d'une balise de titre. Si le titre est vide ou si le texte n'est pas accessible, cela pourrait soit dérouter les utilisateurs, voire les empêcher d'accéder aux informations sur la structure de la page.

Nombre de titres vides

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les titres ne doivent pas être vides

#95 Contenu Renseigner un nom accessible pour les éléments avec un role progressbar NA x 2

L'élément progressbar en html permet de représenter une barre de progression. Il n'existe que depuis HTML5. Certaines interfaces vont plutôt utiliser un attribut role="progressbar" pour cet usage sur une div par exemple.

Dès lors, pour le rendre accessible, il convient de lui définir un nom avec : 

  • un attribut non vide title;
  • un attribut non vide aria-label;
  • aria-labelledby pointant vers un élément avec un texte perceptible par les utilisateurs de lecteurs d'écran.

Lorsqu'un élément progressbar n'a pas de nom accessible, les lecteurs d'écran l'annoncent avec un nom générique, ce qui le rend inutilisable pour les personnes qui se servent de tels outils. 

NOMBRE D'ÉLÉMENTS NON CONFORMES

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les nœuds de la barre de progression ARIA doivent avoir un nom accessible

#96 ContenuRenseigner un nom accessible pour les éléments avec un role meter NA x 2

L'élément meter en html permet de représenter une jauge mesurant une valeur comprise entre un minimum et un maximum. Il n'existe que depuis HTML5. Certaines interfaces vont plutôt utiliser un attribut role="meter" pour cet usage sur une div par exemple.

Dès lors, pour le rendre accessible, il convient de lui définir un nom avec : 

  • un attribut non vide title;
  • un attribut non vide aria-label;
  • aria-labelledby pointant vers un élément avec un texte perceptible par les utilisateurs de lecteurs d'écran.

Lorsqu'un élément meter n'a pas de nom accessible, les lecteurs d'écran l'annoncent avec un nom générique, ce qui le rend inutilisable pour les personnes qui se servent de tels outils. 

NOMBRE D'ÉLÉMENTS NON CONFORMES

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les nœuds de compteur ARIA doivent avoir un nom accessible

#97 ContenuRenseigner un nom accessible pour les éléments avec un role tooltip NA x 2

Il ne suffit pas de renseigner l'attribut role d'un élément html pour le rendre accessible. Il faut, à minima, que ceux-ci aient un nom qui le soit, un nom accessible donc. Notamment avec le role tooltip.

Notez qu'il n'existe pas de syntaxe HTML pour définir une tooltip. 

Vérifiez que chaque élément avec role="tooltip" possède l'une des caractéristiques suivantes :

  • un texte intérieur visible pour les utilisateurs de lecteurs d'écran.
  • un attribut non vide title.
  • un attribut non vide aria-label.
  • aria-labelledby pointant vers un élément avec un texte perceptible par les utilisateurs de lecteurs d'écran.

Les éléments de tooltip sans nom accessible peuvent empêcher les utilisateurs de lecteurs d'écran de comprendre la fonction de ces éléments.

NOMBRE D'ÉLÉMENTS NON CONFORMES

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les nœuds d'info-bulle ARIA doivent avoir un nom accessible

#101 ContenuRenseigner un titre aux frames et iframes 100 x 3

L'ajout de titres descriptifs et uniques via l'attribut title permet aux utilisateurs de lecteurs d'écran de trouver rapidement le cadre dont ils ont besoin.

Si aucun titre n’est présent, la navigation peut rapidement devenir difficile et déroutante. Si aucun titre n'est répertorié, les lecteurs d'écran donneront à la place des informations telles que « cadre », le nom du fichier ou l'URL. Dans la plupart des cas, ces informations ne seront pas très utiles.

Nombre d'iframes sans titre

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les cadres doivent avoir un nom accessible

#102 ContenuRenseigner un nom accessible pour les éléments avec un role=treeitem NA x 2

Il ne suffit pas de renseigner l'attribut role d'un élément html pour le rendre accessible. Il faut à minima que ceux-ci aient un nom qui le soit, un nom accessible donc. Notamment pour le role treeitem qui définit un élément d'arborescence.

Dès lors pour le rendre accessible, il convient de lui définir un nom avec : 

  • un texte intérieur visible pour les utilisateurs de lecteurs d'écran.
  • un attribut non vide title.
  • un attribut non vide aria-label.
  • aria-labelledby pointant vers un élément avec un texte perceptible par les utilisateurs de lecteurs d'écran.

Les éléments avec role treeitem sans nom accessible peuvent empêcher les utilisateurs de lecteurs d'écran de comprendre la fonction de ces éléments.

NOMBRE D'ÉLÉMENTS NON CONFORMES

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les nœuds d'arbre ARIA doivent avoir un nom accessible

#103 ContenuRenseigner un nom visible aux liens 100 x 5

Les liens inaccessibles constituent des obstacles à l’accessibilité, car ils constituent un élément fondamental d’un site Web.

Pour les utilisateurs s'appuyant uniquement sur le clavier, un lien qui ne peut pas recevoir le focus programmatique est inaccessible. Toutes les autres méthodes de mise en évidence comme le mouseover ne sont pas des solutions. De même pour les lecteurs d'écrans vous devez indiquer où pointe le lien.

Chaque lien doit donc posséder un contenu texte, 

  • Soit avec un texte dans le balise : <a href="">Texte du lien</a>
  • Soit via un attribut title="" : <a href="" title="Texte du lien"></a>
  • Soit via un attribut aria-label="" : <a href="" aria-label="Texte du lien"></a>

Les boutons avec une seule icône sont un cas de figure courant de lien sans texte. Une icône seule est invisible pour les lecteurs d'écrans. 

Nombre de liens sans nom visible

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les liens doivent avoir un texte visible, Opquast règle n°131

#106 ContenuN'utilisez pas les mêmes libellés de liens pour plusieurs fonctions différentes NA x 3

Cette bonne pratique est importante car l'intention est d'aider les utilisateurs à comprendre le but de chaque lien dans le contenu, afin qu'ils puissent décider s'ils souhaitent le suivre

Or si deux liens avec le même libellé dirigent vers 2 urls différentes cela peut être confusant. De plus, étant donné que le but d'un lien peut être identifié à partir de son texte, les liens peuvent être compris lorsqu'ils sont hors contexte, par exemple lorsque l'agent utilisateur fournit une liste de tous les liens sur une page.

Dans le cas d'un libellé du type "en savoir plus" récurrent sur une liste d'articles, vous pouvez utiliser un attribut title pour préciser la fonction du lien. Exemple :

<a href="[URL]" title="en savoir plus sur l'article du 18 juin 2020 traitant de l'appel du Général de Gaulle". >en savoir plus</a>

Nombre d'éléments non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les liens portant le même nom doivent avoir un objectif similaire

#107 ContenuRenseigner l'attribut aria-label avec le même texte que celui visible NA x 2

Dans tous les cas où vous décidez d'utiliser un attribut aria-label notamment sur un lien, il est recommandé que le nom accessible commence par le texte visible. Exemple :

<a href="[URL]" aria-label="en savoir plus sur l'article du 18 juin 2020 traitant de l'appel du Général de Gaulle". >en savoir plus</a>

Notez qu'il est déroutant pour les utilisateurs de saisie vocale de prononcer le texte visible qu'ils voient, mais la commande vocale ne fonctionne pas car l'attribut aria-label qui définit l'appel du composant ne correspond pas au texte visible.

Nombre d'aria label incorrect

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les éléments doivent avoir leur texte visible dans le cadre de leur nom accessible

#110 ContenuRenseigner un nom visible aux inputs de type button, submit ou reset NA x 3

NB : Depuis HTML5, nous recommandons d'utiliser l'élément button en lieu et place de l'input type button, submit ou reset.

Les utilisateurs de lecteurs d'écran ne peuvent pas comprendre le but d'une bouton sans un nom textuel discernable et accessible. 

Plusieurs méthodes sont possibles pour renseigner un nom accessible :

  • un attribut non vide value.
  • un attribut non vide title.
  • un attribut non vide aria-label.
  • un attribut aria-labelledby pointant vers un élément avec un texte perceptible par les utilisateurs de lecteurs d'écran.

NOMBRE D'inputs type BUTTON SANS NOM ACCESSIBLE

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les boutons de saisie doivent avoir un texte visible

#116 ContenuRenseigner un contenu différent pour l'attribut summary et l'élément caption d'un tableau NA x 1

L'attribut summary définit un texte alternatif à utiliser afin de décrire le tableau. Un tel texte peut être utilisé par un agent utilisateur qui ne pourrait pas afficher le tableau, mais n'est pas affiché sur les navigateurs standards.

L'élément caption définit la légende (ou le titre) d'un tableau pour tous les utilisateurs.

Lorsque les tableaux comportent un summary et un caption identiques, les utilisateurs de lecteurs d'écran peuvent être confus et avoir du mal à connaître le nom et l'objectif du tableau.

NB : l'attribut  summary a été déprécié depuis 2010, il ne doit pas être utilisé. Il faut soit utiliser uniquement l'élément caption, utiliser un élément details dans le caption ou mettre le tableau dans un élément figure contenant la description souhaitée.

Nombre d'éléments non conformes

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : les tableaux ne doivent pas avoir le même résumé et la même légende

Alternative 100

Selon le contexte de navigation d'un site web (problème de chargement, lecteur d'écran, ressources manquantes, etc.), l'ensemble des éléments n'est pas forcément visible pour un utilisateur. Prévoir une alternative pour les éléments visuels assure une transcription du contenu aux utilisateurs, quel que soit leur contexte d'usage.

#108 AlternativeFournir un élément de retranscription pour les videos NA x 5

L'élément HTML track est utilisé comme élément fils d'un élément audio ou video et permet de fournir une piste texte pour le média. Cette piste de texte peut avoir 5 valeurs :

  • subtitles (la valeur par défaut) pour des sous-titres, voire une traduction.
  • captions pour une retranscription avec les informations non verbales importantes comme des indications musicales ou des effets sonores, ou encore la source du bruit.
  • descriptions pour une description textuelle du contenu vidéo.
  • chapters  pour les titres de chapitre utilisés lorsque l'utilisatrice ou l'utilisateur navigue au sein du média.
  • metadata pour une utilisation par des scripts, elle n'est pas visible pour l'utilisatrice ou l'utilisateur.

Si une vidéo n’a pas de sous-titre, les utilisateurs sourds ont un accès limité, voire inexistant, aux informations qu’elle contient. Même si une piste de sous-titres est disponible, assurez-vous qu'elle contient toutes les informations significatives de la vidéo, pas seulement les dialogues.

L'idéal étant de fournir une retranscription complète de la partie audio que vous définissez avec l'attribut kind = captions sur l'élément track qui pointe vers le texte comme ceci : 

<video width="300" height="200">
    <source src="myVideo.mp4" type="video/mp4">
    <track src="captions_en.vtt" kind="captions" srclang="en" label="english_captions">
    <track src="captions_es.vtt" kind="captions" srclang="es" label="spanish_captions">
</video>

Nombre de videos sans retranscription

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les éléments <video> doivent avoir des légendes, Opquast règle n°116

#109 AlternativeRenseigner un texte de substitution pour les éléments object NA x 2

Les éléments object ne peuvent pas forcément être lus dans tous les navigateurs. Pire, les lecteurs d'écran n'ont aucun moyen de traduire le contenu non textuel en texte annoncé aux utilisateurs. Au lieu de cela, ils lisent un texte alternatif. 

Pour définir ce texte alternatif, il suffit de renseigner au moins l'un de ces attributs :

  • aria-label,
  • aria-labelledby,
  • title,
  • role.

 

Nombre d'objet sans alternative textuelle

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les éléments <object> doivent avoir un texte alternatif, Opquast règle n°115

#111 AlternativeRenseigner une alternative textuelle aux inputs de type image NA x 2

NB : Depuis HTML5, nous recommandons d'utiliser l'élément button en lieu et place de l'input type image.

Comme pour une image, Un input type="image" doit avoir un texte alternatif, sinon les utilisateurs de lecteurs d'écran ne connaîtront pas l'objectif du bouton. Même si l'image ne contient que du texte, elle nécessite toujours un texte alternatif, car un lecteur d'écran ne peut pas traduire les images de mots en sortie.

Vous devez définir un attribut alt aux inputs de type image. La valeur de l'attribut alt doit être fournie, et elle doit être claire, concise et représentative de l'action effectuée lorsque le bouton est activé par l'utilisateur et non une description de l'image elle-même.

NOMBRE D'INPUTS TYPE IMAGE SANS ATTRIBUT ALT

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les boutons d'image doivent avoir un texte alternatif

#112 AlternativeNe pas répéter les alternatives textuelles des images 100 x 2

La valeur de l'attribut alt sur une image ou un input type=image ne doit en aucun cas être répétée devant ou derrière celle-ci. Car un lecteur d'écran va répéter la même chose.

Par exemple, étant donné le balisage d'une image<img alt="Page d'accueil"/>, avec un texte adjacent qui indique également « Page d'accueil ». Alors, un lecteur d'écran annoncera ce contenu à l'utilisateur sous la forme : « Page d'accueil de la page d'accueil ». La redondance est inutile et potentiellement erronée... 

Nombre d'éléments non conformes

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Le texte alternatif des images ne doit pas être répété sous forme de texte, Opquast règle n°112

Navigation 100

Penser non pas une, mais des navigations de son site internet assure un usage pour le plus d'utilisateurs possible.

#55 Navigation/ SEO Eviter les liens avec un texte générique 100 x 3

Le texte descriptif, autrement nommé texte d’ancrage, est le texte visible et cliquable utilisé pour créer des liens vers des pages internes à votre site ou externes. Il est utile pour les utilisateurs et pour les moteurs de recherche auxquels il donne une meilleure idée du contenu qu’ils trouveront dans le document. 

Lorsque vous créez un lien vers une page, le texte d’ancrage que vous utilisez donne de la crédibilité à la page vers laquelle vous créez un lien. Par conséquent, utilisez les ancres appropriées pour la page Web vers laquelle vous pointez.

Ainsi, tous les textes génériques du type "En savoir plus", "En lire plus" ou "Cliquez ici" sont à éviter. Variez-les en complétant le sujet de la page, par exemple : "Lire la suite de l'article : Intégrateur Web : un superhéros !"

En termes d'accessibilité, le texte descriptif des liens aide les utilisateurs de lecteurs d'écran et les personnes souffrant de troubles cognitifs à différencier les liens. Les utilisateurs de lecteurs d'écran interagissent souvent avec la page en parcourant les titres et les liens. Si la page entière est un mur de liens "en savoir plus", alors il devient fastidieux de trouver quel lien se rapporte à quoi. 

Pour intégrer du contenu propre à chaque lien, plusieurs méthodes sont possibles :

  • Ajouter un attribut title="" : <a href="" title="En savoir plus sur l'article : Intégrateur Web : un superhéros !">En savoir plus</a>
  • Ajouter un attribut aria-label="" : <a href="" aria-label="En savoir plus sur l'article : Intégrateur Web : un superhéros !">En savoir plus</a>
  • Ajouter une balise dont le contenu ne sera visible qu'aux lecteurs d'écrans : 
    <a href="">En savoir plus <span class="screen-reader">sur l'article : Intégrateur Web : un superhéros !</span></a>

L'ajout d'une classe dédiée aux lecteurs d'écrans permet d'enrichir le contenu HTML sans dénaturer le design côté front. 

.screen-reader {
    position:absolute;
    left:-10000px;
    top:auto;
    width:1px;
    height:1px;
    overflow:hidden;
}

Note : tout élément mis en display: none ne sera pas lu par les lecteurs d'écrans.

 

Nombre de liens avec un texte générique

0 1 5

Lighthouse retourne le nombre de liens avec texte générique

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les liens n'ont pas de texte descriptif

#69 NavigationUtiliser des valeurs uniques pour les attributs accesskey NA x 1

L'attribut universel accesskey réalise un raccourci clavier pour l'élément portant cet attribut, permettant aux utilisateurs de positionner rapidement le curseur dans une partie spécifique de la page. La valeur de cet attribut est généralement un seul caractère.

Pour activer ce raccourci, il faut utiliser une combinaison de touches incluant ce caractère. La combinaison de touches utilisée pour le raccourci clavier dépend du navigateur et du système d'exploitation utilisés.

  • Sous Windows ou Linux :
    • Pour Firefox : Alt + Shift + touche
    • Pour Chrome et Edge : Alt + touche
  • Sous Mac :
    • Pour Safari et Chrome : Control + Alt + touche

La duplication des valeurs pour les attributs accesskey crée des effets inattendus qui rendent finalement la navigation compliquée et donc la page moins accessible.

Nombre d'accesskey dupliqués

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : La valeur de l'attribut accesskey doit être unique

#70 Navigation/ SEO Organiser les titres et sous-titres séquentiellement par ordre décroissant 100 x 4

Les niveaux de titres indiqués avec les éléments h1 à h6 doivent être correctement classés en respectant les niveaux pour fournir une structure sémantiquement valide de la page. Vous ne pouvez pas, par exemple, passer d'un titre de niveau 1 à un niveau 3 sans avoir au préalable intercaler un niveau 2.

  • Mauvais :  h1>h3
  • Bon : h1>h2>h3

Avec une structure logiquement hiérarchisée de titres, les utilisateurs de lecteurs d’écran peuvent naviguer dans la page notamment en indiquant quel titre atteindre.

Cela signifie aussi qu'il faut veiller à la rédaction des titres pour qu'ils soient les plus explicites possible.

 

Éléments non conformes

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Les niveaux de titre ne devraient augmenter que d'un, Opquast règle n°227

#71 NavigationAssocier une étiquette à chaque champ de formulaire NA x 3

Chaque champ de formulaire doit posséder une étiquette permettant de comprendre la nature de l'information attendue. Plusieurs méthodes existent pour associer une étiquette à un champ de formulaire.

La plus courante et sémantiquement correcte : associer un élément "label" possédant un attribut for="" identique à l'élément id="" de l'input qu'il représente. Notez que cliquer sur le label met le focus sur le champ associé.

<label for="nom">Nom : </label> <input type="text" id="nom">

D'autres méthodes sont possibles :

  • attribuer un attribut aria-label à l'input,
  • attribuer un attribut aria-labelledby à l'input, la valeur de l'attribut correspond à l'id de l'élément étiquette

Les éléments de formulaire nécessitant une étiquette :

  • Champs de saisie de texte, par exemple <input type="text">, <input type="password"> et <textarea>
  • Champs de saisie de nombre, par exemple <input type="date">, <input type="number">
  • Champs de sélecteurs, par exemple <input type="radio">, <input type="checkbox">, <select>

Les champs de type="button" et type="hidden" n'en ont pas besoin.

Les étiquettes sont nécessaires pour rendre les formulaires accessibles. En effet, les lecteurs d'écran ont besoin des étiquettes pour identifier sans ambiguïté les champs de formulaire. 

L'absence d'étiquette empêche les champs de formulaire de recevoir le focus lorsqu'ils sont lus par des lecteurs d'écran, et les utilisateurs dont le contrôle moteur est altéré ne bénéficient pas d'une zone cliquable plus grande pour le contrôle, car cliquer sur l'étiquette active le contrôle.

Nombre de champs de formulaire sans label

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les éléments du formulaire doivent avoir des étiquettes, Opquast règle n°67

#74 NavigationNe pas utiliser de balise meta http-equiv="refresh" 100 x 5

La redirection temporisée meta refresh indique au navigateur web de recharger la page visitée ou de charger une autre page au bout d’une durée définie.

Étant donné que les utilisateurs ne s’attendent pas à ce qu’une page soit actualisée automatiquement, une telle actualisation peut être désorientante. L'actualisation déplace également le focus car le curseur est aussitôt repositionné en haut de la page. Cela pose des problèmes à bien des égards aux utilisateurs en situation de handicap.

Le moins qu'on puisse dire, c'est que cela génère de la frustration et perturbe l'expérience utilisateur.

NB :  on autorise l'usage de cette meta avec une temporisation supérieure ou égale à 20 heures.

Présence d'une meta refresh inferieure à 20 heures

0 1 1

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : L’actualisation différée de moins de 20 heures ne doit pas être utilisée

#94 NavigationNe pas utiliser de valeur tabindex supérieure à 0 100 x 4

Certains éléments interactifs peuvent être parcourus via la navigation au clavier au moyen de la touche Tab. Chaque élément sera atteint selon son ordre d'apparition dans le code de la page.

Avec l'attribut tabindex, on peut redéfinir cet ordre et cette navigation selon la valeur indiquée : 

  • 0 : l’élément peut être atteint via la navigation au clavier,
  • une valeur positive : l’élément peut être atteint via la navigation au clavier et les éléments seront parcourus dans l’ordre croissant des valeurs de l’attribut,
  • -1 : l’élément ne peut être atteint via la navigation au clavier, à moins qu'une méthode JavaScript autorise la focalisation sur la tabulation et modifie la valeur de -1 à 0.

Cela pose des problèmes d'accessibilité, notamment un ordre de tabulation inattendu qui semble ignorer certains éléments ou les tabuler après ceux sans tabindex...

Bien que cela soit valide d'un point de vue technique, cela crée souvent une expérience frustrante pour les utilisateurs qui s'appuient sur des technologies d'assistance.

NB : L’utilisation de tabindex n’est pas recommandée ; il est préférable de disposer les éléments dans un ordre logique dans le code HTML.

Nombre de tabindex non conformes

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les éléments ne doivent pas avoir un tabindex supérieur à zéro

#130 NavigationPrévoir des options de contournement des contenus répétitifs NA x 3

Étant donné que les sites Web affichent souvent du contenu secondaire et répété sur plusieurs pages, comme un header de présentation, un menu de navigation, etc, prévoir un ou plusieurs repères pour les contourner permet : 

  • un accès plus rapide et plus direct au contenu principal d'une page pour les utilisateurs utilisant uniquement le clavier,
  • donc de réduire les frappes au clavier et minimiser la douleur physique associée en évitant à un utilisateur de clavier de devoir parcourir un grand nombre de liens et/ou de boutons dans l'en-tête ainsi que la navigation principale de la page.

Pour créer une solution de contournement, il existe  plusieurs méthodes complémentaires :

  • Utiliser une structure sémantique à base d'éléments header, nav, main, section, aside et footer.
  • Inclure un lien vers le contenu principal de la page Web directement après l'ouverture de l'élément body, avec un libellé explicite ( « Passer la navigation » ou « Aller au contenu principal »)
  • Mettre des titres pour chaque section et ainsi permettre d'aller à une section précise sans forcément passer par les autres.

Présence au moins une méthode de contournement

NaN  1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : La page doit avoir des moyens pour contourner les blocages répétés, Opquast règle n°159

Interface 100

L'utilisation d'un site internet se fait via son interface, son design donc. Celui-ci ne doit pas simplement être beau, il se doit d'être le plus inclusif possible pour assurer un confort d'utilisation à tous les utilisateurs.

#61 Interface/ SEOUtiliser des tailles de police lisibles 100 x 3

La taille de police par défaut dans tous les navigateurs est d'environ 16 pixels. C'est généralement la taille de texte minimum recommandé par les UX designers.

Environ 1 lecteur sur 10 a des problèmes de vue. Pour les autres utilisateurs, la plupart devront fournir un effort pour lire un texte inférieur à 16 pixels sans forcément s'en rendre compte. Soit ils se rapprochent de leur écran,  soit ils "pincent" l'écran pour zoomer et lire le texte.  

De son côté, Google Lighthouse considère que les tailles de police inférieures à 12 pixels sont trop petites pour être lisibles.

Voilà pourquoi il est important de respecter une taille minimum pour vos polices.

Ne pas respecter cette bonne pratique, peut nuire à votre référencement car votre page ne sera pas considérée comme Mobile-Friendly. Or les sites mobile friendly sont privilégiés par Google.

Pourcentage de texte lisible (>= 12px)

100 % 90 60 50

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Le document n'utilise pas de tailles de police lisibles

#64 Interface/ SEOUtiliser des éléments tactiles dimensionnés correctement 100 x 4

Pour qu'un utilisateur puisse facilement interagir avec un élément sur un écran tactile, celui-ci doit être suffisamment large ou avoir assez d'espace autour de lui pour effectuer l'interaction voulue et pas celle d'à coté. 

La hauteur cible tactile minimale recommandée est d'environ 48 pixels indépendamment de l'appareil pour un site avec une meta viewport mobile correctement définie. 

Pour résoudre ce type d'anomalie, il faut ajuster les CSS en jouant sur les propriétés "width", "height" mais aussi "padding". Vous pouvez aussi cibler vos ajustements avec la mediaquerie : @media (any-pointer: coarse) qui définit les écrans ayant un pointeur "grossier" (doigt plutôt que la souris).

Un taille correcte pour tous vos éléments tactiles profite à tous les utilisateurs, mais est particulièrement utile pour toute personne ayant une déficience motrice.

Enfin, ne pas respecter cette bonne pratique peut nuire à votre référencement car votre page ne sera pas considérée comme Mobile Friendly. Or les sites mobile friendly sont privilégiés par Google.

Eléments tactiles incorrects

0 3 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Les cibles tactiles ne sont pas dimensionnées correctement, Opquast règle n°181

#75 InterfaceUtiliser des éléments interactifs dimensionnés correctement NA x 0

Pour qu'un utilisateur puiss facilement interagir avec un élément, celui-ci doit être suffisamment large ou avoir assez d'espace autour de lui pour effectuer l'interaction voulue et pas celle d'à coté. 

La taille minimale recommandée par les référentiels d'accessibilité est de 24 pixels.

Disposer de cibles d'une taille suffisante  ou d'un espacement des éléments interactifs suffisant peut aider tous les utilisateurs susceptibles d'avoir des difficultés à cibler ou à utiliser de petites zones d'interaction.

Cela comprend aussi bien les utilisateurs de souris ou de stylet qui peuvent avoir difficultés de motricité que les utilisateurs d'écran tactile.

NB : Cette recommandation est complémentaire à la bonne pratique "Utiliser des éléments tactiles dimensionnés correctement", qui préconise une taille minimale de 48 pixels. Etant donné que cette dernière est plus contraignante, le score de cette bonne pratique ci présente a juste valeur d'information.

ELÉMENTS INTERACTIFS INCORRECTS

NaN  0 20 100

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Toutes les cibles tactiles doivent mesurer 24 px de large ou laisser suffisamment d'espace, Opquast règle n°181

#77 InterfaceNe pas compter que sur la couleur pour distinguer les liens NA x 5

Il y a près de trois fois plus de personnes malvoyantes que de personnes totalement aveugles. Une personne sur douze souffre d'un déficit de couleur. Une personne malvoyante ou daltonienne est incapable de distinguer un texte sur un arrière-plan sans contraste suffisant ou un lien sans style distinctif au milieu d'un texte.

Les utilisateurs souffrant d'une déficience visuelle ne pourront donc pas distinguer un lien qui ne dispose que d'une simple différenciation de couleur.

On considère qu'un lien est bien distinct et donc accessible du texte environnant si :

  • si le lien présente une différence de contraste de couleur d'au moins 3:1 avec le texte environnant
  • s'il est souligné
  • s'il y a un style de police spécifique
  • et/ou de bordure
  • et/ou de couleur d'arrière-plan.

NB : il est d'usage de réserver le soulignement aux liens.

Nombre de liens non distinctibles

NaN  0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les liens doivent être distinguables sans compter sur la couleur, Opquast règle n°135, Opquast règle n°137

#78 InterfaceRendre les liens d'évitements focusables NA x 5

Lorsqu'un site web comprend des liens d'évitements permettant d'accéder directement au contenu de la page, ceux-ci doivent être focusables. Ils ne doivent donc pas être mis en display: none ou visibility: hidden.

Les liens d'évitement doivent se trouver en haut de page, juste après l'ouverture de la balise <body>.

Pour les rendre focusables, deux méthodes existent : 

  • Rendre les liens d'évitement visibles en permanence
  • Utiliser une feuille de style CSS pour masquer les liens hors de l'écran jusqu'à ce qu'ils soit mis en évidence par le clavier, afin de les rendre visible pour tous les utilisateurs.
<div id="skip">
    <a href="/#content">Accéder au contenu</a>
</div>

Et le CSS : 

#skip a {
    display: block;
    position: absolute;
    left: -999px;
    top: -999px;
}

#skip a:focus {
    left: 0;
    top: 0;
}
NaN  1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Les liens d'évitements doivent être présents et focusables., Opquast règle n°160

#80 InterfaceAssurer un contraste suffisant entre le premier plan et l'arrière-plan NA x 0

Il y a près de trois fois plus de personnes malvoyantes que de personnes totalement aveugles. En moyenne, une personne sur douze ne peut pas voir le spectre complet des couleurs. Une personne malvoyante ou daltonienne est incapable de distinguer un texte sur un arrière-plan sans contraste suffisant.

NB : Parce que ce test est imparfait et qu'il génère souvent des faux positifs, la note indiquée est présente à titre d'information et n'est pas prise en compte dans la note globale de la catégorie accessibilité.

Contraste Suffisant

NaN  1 0 0

Test binaire LightHouse qui compare les valeurs de couleurs dans les fichiers CSS.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Les éléments doivent respecter les seuils minimaux de rapport de contraste des couleurs, Opquast règle n°177

#82 InterfaceNe pas utiliser user-scalable="no" ou mettre l'attribut maximum-scale inférieur à 5. 100 x 3

Via la meta viewport, il est possible de définir le comportement des fonctions de zoom natives d'un terminal tactile. Désactiver ces fonctions peut être problématique pour les utilisateurs qui souffrent d'une déficience visuelle et qui ont besoin d'agrandir le contenu d'une page web pour en saisir le sens.

Certains développeurs bloquent ces fonctionnalités pour "corriger" des erreurs d'affichage quand le contenu dépasse de la zone visible. Même si cela règle le problème cela n'est en rien une bonne pratique même pour un utilisateur sans déficience visuel.

Meta viewport sans bloquage du zoom

1 0 0

On test si la balise meta viewport a soit l'attribut user-scalable="no" et/ou l'attribut maximum-scale inférieur à 5. Si c'est le cas le test échoue.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : Le zoom et la mise à l'échelle ne doivent pas être désactivés, Opquast règle n°188

Langue 100

Fournir des informations sur la langue utilisée dans un site participe à sa compréhension pour les robots et tous les utilisateurs.

#98 Langue/ SEOSpécifier la langue du document 100 x 3

Pour spécifier la langue d'une page web, il suffit de renseigner l'attribut lang au niveau de l'élément Html lui-même. 

<html lang="fr">

La valeur de cet attribut doit contenir un code de deux ou trois lettres (généralement en minuscules) correspondants aux abréviations de langues selon la norme ISO639.

Il peut contenir deux sous-codes :

  1. le système d'écriture utilisé par la langue défini par un code de 4 lettres comme pour le japonais écrit avec l'alphabet Katakana, le code sera lang="ja-Kana".
  2. le code pays défini par deux lettres en majuscules selon la norme ISO3166. Exemple avec la version canadienne du français,  lang="fr-CA".

Exemple complet avec la version canadienne du braille français, lang="fr-Brail-CA".

NB : Si vous utilisez une langue qui s'écrit de droite à gauche, veillez à le préciser à l'aide de l'attribut dir, soit dir="rtl" (right to left).

Le fait de spécifier une langue permet d'aider les lecteurs d'écran à énoncer correctement le texte.

Attribut lang valide

2 1 1

0 : l'attribut n'est pas présent
1 : l'attribut est présent mais invalide
2 : l'attribut est présent et valide

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : L'élément html doit avoir une valeur valide pour l'attribut lang, Opquast règle n°125

#99 LangueSpécifier une valeur valide aux attributs lang 100 x 3

Au sein d'un document, une portion de texte peut être d'une langue différente de celle définie pour la page. Dans ce cas-là on utilise l'attribut universel "lang".

La valeur de cet attribut doit contenir un code de deux ou trois lettres (généralement en minuscules) correspondant aux abréviations de langues selon la norme ISO639.

Il peut contenir deux sous-codes :

  1. le système d'écriture utilisé par la langue défini par un code de 4 lettres comme pour le japonais écrit avec l'alphabet Katakana, le code sera lang="ja-Kana".
  2. le code pays  défini par deux lettres en majuscules selon la norme ISO3166. Exemple avec la version canadienne du français, lang="fr-CA".

Exemple complet avec la version canadienne du braille français, lang="fr-Brail-CA".

NB : Si vous utilisez une langue qui s'écrit de droite à gauche, veillez à le préciser à l'aide de l'attribut dir, soit dir="rtl" (right to left).

Le fait de spécifier une langue permet d'aider les lecteurs d'écran à énoncer correctement le texte.

Nombre d'attributs lang invalides

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : l'attribut lang doit avoir une valeur valide

#100 Langue/ SEORenseigner l'attribut xml:lang comme l'attribut lang NA x 1

L'attribut xml:lang n'est pas obligatoire en tant que fichier HTML. Mais il le devient en tant que fichier XML.

Quand on s’appuie sur des analyseurs XML (comme la fonction lang() de XSLT), l’attribut lang n'est pas reconnu. Dans ce cas-là, il faut définir l'attribut xml:lang.

Si vous servez le document en XHTML (soit en HTML et XML en même temps), vous devez définir les deux attributs lang et xml:lang de manière identique. À l'inverse si vous servez votre page uniquement en tant que XML (par exemple à l’aide du type MIME application/xhtml+xml), vous n’avez pas besoin de l’attribut lang. Seul l’attribut xml:lang suffira.

En bref, la valeur de l'attribut xml:lang, s'il est inclus dans l'élément html, doit être exactement identique à la valeur de l'attribut lang.

Si la langue de la page Web n'est pas spécifiée de manière cohérente, le lecteur d'écran risque de ne pas énoncer correctement le texte de la page.

Validité de l'attribut XML:LANG

NaN  1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les éléments HTML avec lang et xml:lang doivent avoir la même langue de base

SEO (22 bonnes pratiques)

Le SEO (Search Engine Optimization : Optimisation pour les moteurs de recherche) a quelques critères techniques à respecter, qui peuvent être audités par un algorithme. La plupart des bonnes pratiques ci-dessous sont issues de Lighthouse, l'outil de test et de recommandations de Google. Ne pas les respecter ne serait pas de bon augure pour votre positionnement, notamment parce que Google a clairement indiqué que certains critères comptent pour le positionnement au sein de ses résultats.

Positionnement 100

Voir l'analyse

Le positionnement représente l'étape de classement d’une page d'un site (crawlable et indexable) dans les pages de résultats des moteurs de recherche ou l’ensemble des actions visant à améliorer sa position dans ceux-ci.

De nombreux paramètres influent sur la position d'une page sur une requête, dont des aspects techniques, lexicaux et de popularité (netlinking).

#52 Positionnement/ Ecoconception/ AccessibilitéRenseigner une balise "title" 100 x 5

La balise "title" doit être présente dans le head du document. Elle contient un texte court et descriptif résumant le contenu de la page.

L'intérêt du title est multiple, car :

  • il définit le titre de l'onglet courant ou de la fenêtre du navigateur,
  • il donne un titre à la page lorsqu'elle est ajoutée aux favoris,
  • il est utilisé par les moteurs de recherche pour déterminer la pertinence du contenu proposé et lors de l'affichage des résultats,
  • et il est le premier élément entendu par les utilisateurs de lecteurs d'écran

En termes d'écoconception, la pertinence du titre évite une visite inutile à l'utilisateur, raccourcit le temps de recherche et réduit la charge des serveurs nécessaires.

Essayez de rendre le titre aussi précis et significatif que possible ! Toutefois quelques règles à respecter :

  • Au sein d'un même site, rendez chaque titre unique - ne dupliquez pas les titres d'une page à l'autre, même si elles sont similaires.
  • Généralement, les outils SEO recommandent d'écrire un title avec un nombre de caractères compris entre 30 et 60 afin qu'il s'affiche correctement dans les résultats de recherche.
  • Faites en sorte que le titre de la page corresponde au titre supérieur (idéalement étiqueté h1) de votre page. Ceux-ci n'ont pas besoin d'être identiques, mais il est souvent logique de les rendre très similaires pour confirmer au moteur de recherche la pertinence du sujet traité.
  • Utilisez vos mots-clés mais sans faire de bourrage de mots-clés non plus.

Présence d'un title dans le head

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Les documents doivent avoir un élément "title" pour faciliter la navigation, CNumR - BP#4015, Opquast règle n°97, Opquast règle n°98

#53 Positionnement/ EcoconceptionRenseigner une balise "meta description" 100 x 3

La balise HTML "meta description" est utilisée par les moteurs de recherche pour décrire le contenu d’une page web. Dans les résultats des moteurs de recherche, cette description s’affiche sous le titre et l’URL de votre page.

NB : Google a tendance à prendre le texte de la description de cette balise, mais si cette dernière s'avère non informative, le moteur de recherche peut également utiliser le contenu de votre page pour générer un extrait. 

Ne pensez pas vos "meta description" comme étant uniquement destinées aux moteurs de recherche. Avec l'usage abusif des mots-clés dans ce champ de texte, Google a décidé de retirer la balise "meta description" de ses critères de pertinence, comme indiqué sur blog officiel de Google en 2007 : "il convient de noter que même si des méta-descriptions précises peuvent améliorer le taux de clics, elles n'affecteront pas votre classement dans les résultats de recherche."

Toutefois, si votre description est attractive et décrit ce qu’ils recherchent, les utilisateurs cliqueront sur le lien proposé par le moteur de recherche pour voir votre page. Google ne peut pas savoir si votre page est attractive depuis la "meta description" mais sait compter ce sur quoi les utilisateurs cliquent.

Donc, pour améliorer votre CTR (Click Through Rate : taux de clic), soignez le texte de vos "meta description" pour être attractif. Pour vous guider, vous pouvez prendre en compte ces quelques conseils :

  • Rédigez un texte suffisamment long. Toute description de moins de 50 caractères est signalée comme « trop courte » dans Google Search Console. Dans la pratique, il est recommandé de respecter une taille minimum de 90 caractères et un maximum de 250.
  • Au sein d'un même site, rendez "chaque meta description" unique - ne dupliquez pas les titres d'une page à l'autre, même si elles sont similaires.
  • Utilisez vos mots-clés mais sans faire de bourrage de mots-clés non plus.

En termes d'écoconception, la pertinence de la description évitant une visite inutile à l'utilisateur, raccourcit le temps de recherche et réduit la charge des serveurs nécessaires.

Présence de la meta description

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, CNumR, Opquast.
Article de référence(s) : Le document n'a pas de méta description, CNumR - BP#4015, Opquast règle n°3

#55 Positionnement/ Accessibilité Eviter les liens avec un texte générique 100 x 4

Le texte descriptif, autrement nommé texte d’ancrage, est le texte visible et cliquable utilisé pour créer des liens vers des pages internes à votre site ou externes. Il est utile pour les utilisateurs et pour les moteurs de recherche auxquels il donne une meilleure idée du contenu qu’ils trouveront dans le document. 

Lorsque vous créez un lien vers une page, le texte d’ancrage que vous utilisez donne de la crédibilité à la page vers laquelle vous créez un lien. Par conséquent, utilisez les ancres appropriées pour la page Web vers laquelle vous pointez.

Ainsi, tous les textes génériques du type "En savoir plus", "En lire plus" ou "Cliquez ici" sont à éviter. Variez-les en complétant le sujet de la page, par exemple : "Lire la suite de l'article : Intégrateur Web : un superhéros !"

En termes d'accessibilité, le texte descriptif des liens aide les utilisateurs de lecteurs d'écran et les personnes souffrant de troubles cognitifs à différencier les liens. Les utilisateurs de lecteurs d'écran interagissent souvent avec la page en parcourant les titres et les liens. Si la page entière est un mur de liens "en savoir plus", alors il devient fastidieux de trouver quel lien se rapporte à quoi. 

Pour intégrer du contenu propre à chaque lien, plusieurs méthodes sont possibles :

  • Ajouter un attribut title="" : <a href="" title="En savoir plus sur l'article : Intégrateur Web : un superhéros !">En savoir plus</a>
  • Ajouter un attribut aria-label="" : <a href="" aria-label="En savoir plus sur l'article : Intégrateur Web : un superhéros !">En savoir plus</a>
  • Ajouter une balise dont le contenu ne sera visible qu'aux lecteurs d'écrans : 
    <a href="">En savoir plus <span class="screen-reader">sur l'article : Intégrateur Web : un superhéros !</span></a>

L'ajout d'une classe dédiée aux lecteurs d'écrans permet d'enrichir le contenu HTML sans dénaturer le design côté front. 

.screen-reader {
    position:absolute;
    left:-10000px;
    top:auto;
    width:1px;
    height:1px;
    overflow:hidden;
}

Note : tout élément mis en display: none ne sera pas lu par les lecteurs d'écrans.

 

Nombre de liens avec un texte générique

0 1 5

Lighthouse retourne le nombre de liens avec texte générique

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les liens n'ont pas de texte descriptif

#59 Positionnement/ AccessibilitéRenseigner un attribut "alt" sur chaque image 100 x 3

L'attribut "alt" doit être obligatoirement présent sur l'élément HTML "img". Cet attribut fournit une description textuelle de l'image. Il peut être vide mais est extrêmement utile pour l'accessibilité et le SEO. 

En effet, les outils de lecture d'écran utilisent cette description pour la lire afin que les personnes qui ne peuvent pas la voir sachent ce que l'image représente. In extenso, un robot d'un moteur de recherche "ne voit pas" l'image mais peut utiliser sa description quand l'attribut "alt" est renseigné.

Pour bien optimiser votre référencement, utilisez les attributs "alt" pour faire des descriptions précises de vos images en restant sous les 100 caractères et profitez-en pour placer vos mots clés de manière naturelle.

Si une image est purement décorative, l'attribut alt doit être vide (alt="") afin que les lecteurs d'écran et robots l'ignorent simplement.

Nombre d'images sans attribut ALT

0 3 10

Cette bonne pratique est aussi recommandée par : Opquast, Google Lighthouse.
Article de référence(s) : Règle n° 111 - Chaque image décorative est dotée d'une alternative textuelle appropriée, Les images doivent avoir un texte alternatif, Opquast règle n°111, Opquast règle n°112, Opquast règle n°113

#70 Positionnement/ Accessibilité Organiser les titres et sous-titres séquentiellement par ordre décroissant 100 x 4

Les niveaux de titres indiqués avec les éléments h1 à h6 doivent être correctement classés en respectant les niveaux pour fournir une structure sémantiquement valide de la page. Vous ne pouvez pas, par exemple, passer d'un titre de niveau 1 à un niveau 3 sans avoir au préalable intercaler un niveau 2.

  • Mauvais :  h1>h3
  • Bon : h1>h2>h3

Avec une structure logiquement hiérarchisée de titres, les utilisateurs de lecteurs d’écran peuvent naviguer dans la page notamment en indiquant quel titre atteindre.

Cela signifie aussi qu'il faut veiller à la rédaction des titres pour qu'ils soient les plus explicites possible.

 

Éléments non conformes

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Les niveaux de titre ne devraient augmenter que d'un, Opquast règle n°227

#92 Positionnement/ AccessibilitéRenseigner un contenu pour tous les titres Hn 100 x 4

Les éléments h1 à h6 constituent la hiérarchie de contenu d'une page. Chacun correspond à un niveau d'importance, le niveau 1 étant le plus important et le niveau 6 le moins important.

L’utilisation de ces balises a un impact direct sur le référencement naturel. Cela permet aux crawlers (robots d’exploration comme Googlebot) de comprendre plus rapidement le contenu de la page Web en lui indiquant votre titre principal (le h1) et vos autres sous-titres (du h2 au h6). Bien entendu, la balise h1 est la plus importante !

Il est donc primordial qu'elles contiennent un contenu et accessoirement les mots-clés que vous ciblez, et donc ne pas être vides.

En termes d'accessibilité, les lecteurs d'écran alertent les utilisateurs de la présence d'une balise de titre. Si le titre est vide ou si le texte n'est pas accessible, cela pourrait soit dérouter les utilisateurs, voire les empêcher d'accéder aux informations sur la structure de la page.

Nombre de titres vides

0 2 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Les titres ne doivent pas être vides

Crawl 100

Voir l'analyse

Le crawl d’un site web est la première action mise en place par les moteurs de recherche pour découvrir votre site. Pour constituer leur base de données de pages connues (index), les moteurs de recherche ont besoin d’atteindre un maximum de pages du web. Pour cela, ils utilisent des robots d'exploration, aussi appelés spiders ou crawlers.

Celui de Google s’appelle Googlebot. Il est essentiel que votre site ne possède pas de facteurs limitants ou bloquants pour simplifier cette exploration dans l'intérêt de votre référencement naturel. Sans crawl préalable, il est impossible qu’une page ressorte dans les résultats de recherche par la suite.

#51 CrawlRenseigner correctement la balise meta "viewport" 100 x 1

Le viewport est la zone d'affichage de la fenêtre du navigateur. Toutefois, la notion de viewport sur smartphone est différente de celle sur un écran d'ordinateur. Un écran de smartphone a une définition différente de sa résolution... En effet, la définition correspond aux capacités réelles de l'écran, alors que la résolution dépend du navigateur. Par exemple : un iPhone 12 a une définition de 1 170 x 2 532 pixels et Safari iOS utilise par défaut une fenêtre avec une résolution de 390 x 844 pixels. Le rapport entre cette définition et cette résolution est appelé pixel ratio et peut servir de discriminant en CSS ou pour les images responsives.

Par défaut, un navigateur adapte sa résolution de manière à ce que toute la surface du contenu présent dans la page soit visible à l'écran. Ce qui pose un problème de lisibilité, puisque la page web peut paraitre minuscule au sein d'un écran déjà pas très grand. Cela rend alors les contenus illisibles.

La méta viewport permet de s'affranchir de ce comportement de zoom initial en imposant la taille de la surface du viewport au navigateur. L'idéal est non pas de définir une largeur d'affichage propre à son contenu, mais d'utiliser la résolution par défaut du navigateur. La méta viewport doit donc être définie comme ceci :

<meta name="viewport" content="width=device-width, initial-scale=1.0">

La largeur d'affichage est alignée sur celle par défaut avec un niveau de zoom à 1. 

Ne pas respecter cette bonne pratique, peut nuire à votre référencement car votre page ne sera pas considérée comme Mobile Friendly. Or les sites mobile friendly sont privilégiés par Google.

En termes de performance, cette méta permet aussi de réduire le délai de traitement d'une interaction de zoom, autrement dit le zoom par pincement sur écran tactile. 

Présence d'une Meta Viewport valide

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : N'a pas de balise <meta name="viewport"> avec width ou initial-scale

#54 CrawlRépondre avec un code HTTP de réussite 100 x 4

Lorsqu'une ressource est demandée à un serveur, celui-ci commence par répondre avec un code de statut HTTP. Ces codes sont envoyés par le serveur HTTP au navigateur afin de permettre à ce dernier de déterminer automatiquement si une requête a réussi, et sinon de connaître le type d'erreur. Ces codes sont spécifiés dans le document RFC 7231 par l'IETF (Internet Engineering Task Force). 

Les codes les plus courants sont :

  • 200 : succès de la requête ;
  • 301 et 302 : redirection, respectivement permanente et temporaire ;
  • 401 : utilisateur non authentifié ;
  • 403 : accès refusé ;
  • 404 : ressource non trouvée ;
  • 500, 502 et 503 : erreurs serveur ;
  • 504 : le serveur n'a pas répondu.

Ainsi le serveur doit renvoyer un code d'état

  • dans les 200 pour toutes les URL valides;
  • dans les 300 pour une ressource qui est redirigée vers une autre URL.

Les pages renvoyant des codes d'état HTTP d'échec au-delà de 400 ou, pire, 500 peuvent ne pas être indexées correctement. 

Code HTTP Valide

1 0 0

Le test échoue si le code de statut HTTP de l'url testée est supérieur à 400.

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : La page a un code d'état HTTP d'échec

#56 CrawlPermettre l'exploration des liens 100 x 3

Google ne peut explorer un lien que s'il s'agit d'un élément HTML "a" et que celui-ci dispose d'un attribut href. La plupart des liens dans d'autres formats ne seront pas analysés ni extraits par les robots d'exploration de Google.

Un lien sans attribut href, ou tout autre élément avec un attribut href ne peut pas être utilisé de manière fiable par Google. Cela concerne notamment les liens créés avec JavaScript. Quelques exemples de liens non exploitables : 

  • <a href="javascript:window.location.href='/products'">
  • <a href="javascript:goTo('products')">
  • <a onclick="goto('https://example.com')">
  • <span href="https://example.com">

Depuis 2019, Google indexe par défaut la version mobile d'un site. Les sites mobiles sont souvent des versions de bureau réduites avec beaucoup moins de liens, ce qui empêche Google de découvrir et d'indexer ces pages exclues.  Veillez à rendre exploitable vos liens autant sur mobile que sur desktop.

Nombre de liens non explorables

0 3 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Permettre l'exploration de vos liens

#58 CrawlUtiliser un fichier robots.txt valide 100 x 2

Un fichier robots.txt indique aux robots d'exploration d'un moteur de recherche les URL auxquelles il peut accéder sur votre site. Son objectif principal est d'éviter de surcharger votre site de demandes.

Au-delà de son objectif, son interprétation présente quelques failles :

  • Les instructions du fichier robots.txt ne peuvent pas obliger le robot d'exploration à respecter les règles qui y  sont inscrites. Il appartient au robot d'exploration de s'y conformer. 
  • Une page non autorisée dans le fichier robots.txt peut toujours être indexée si d'autres sites la référencent (pour cela,  utiliser la balise meta noindex ou l'en-tête de réponse équivalente).

Heureusement, la plupart des robots d'exploration sérieux suivent les directives du fichier robots.txt. Encore faut-il encore respecter la syntaxe appropriée. Si votre fichier robots.txt n'est pas écrit correctement, il se peut que les robots d'exploration ne puissent pas comprendre comment votre site Web doit être exploré ou indexé. 

Robots.txt Valide

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Comment Google interprète la spécification robots.txt, Opquast règle n°212

#61 Crawl/ AccessibilitéUtiliser des tailles de police lisibles 100 x 1

La taille de police par défaut dans tous les navigateurs est d'environ 16 pixels. C'est généralement la taille de texte minimum recommandé par les UX designers.

Environ 1 lecteur sur 10 a des problèmes de vue. Pour les autres utilisateurs, la plupart devront fournir un effort pour lire un texte inférieur à 16 pixels sans forcément s'en rendre compte. Soit ils se rapprochent de leur écran,  soit ils "pincent" l'écran pour zoomer et lire le texte.  

De son côté, Google Lighthouse considère que les tailles de police inférieures à 12 pixels sont trop petites pour être lisibles.

Voilà pourquoi il est important de respecter une taille minimum pour vos polices.

Ne pas respecter cette bonne pratique, peut nuire à votre référencement car votre page ne sera pas considérée comme Mobile-Friendly. Or les sites mobile friendly sont privilégiés par Google.

Pourcentage de texte lisible (>= 12px)

100 % 90 60 50

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Le document n'utilise pas de tailles de police lisibles

#63 Crawl/ EcoconceptionEviter les plugins 100 x 2

Évitez d’utiliser des plug-ins (machines virtuelles Flash Player, Java et Silverlight, etc.), pour plusieurs raisons : 

  • Les moteurs de recherche ne peuvent pas indexer le contenu des plug-ins.
  • De nombreux appareils limitent l'utilisation de ces derniers, voire ne les acceptent pas.
  • Pour limiter votre impact environnemental, car ils peuvent entraîner une lourde charge de ressources (processeur et RAM). Par exemple, le lecteur Flash d'Adobe qu’Apple a décidé de ne pas prendre en charge sur ses appareils mobiles afin de maximiser la durée de vie de la batterie.

NB : Depuis 2020, ce type de contenu est très marginal.

Plugin non détecté

1 0 0

Lighthouse détecte la présence des plugins Flash Player, Java et Silverlight. Si oui, le score est à 0.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, CNumR.
Article de référence(s) : Le document utilise des plugins, CNumR - ex BP#12 (supprimé du référentiel v4)

#64 Crawl/ AccessibilitéUtiliser des éléments tactiles dimensionnés correctement 100 x 1

Pour qu'un utilisateur puisse facilement interagir avec un élément sur un écran tactile, celui-ci doit être suffisamment large ou avoir assez d'espace autour de lui pour effectuer l'interaction voulue et pas celle d'à coté. 

La hauteur cible tactile minimale recommandée est d'environ 48 pixels indépendamment de l'appareil pour un site avec une meta viewport mobile correctement définie. 

Pour résoudre ce type d'anomalie, il faut ajuster les CSS en jouant sur les propriétés "width", "height" mais aussi "padding". Vous pouvez aussi cibler vos ajustements avec la mediaquerie : @media (any-pointer: coarse) qui définit les écrans ayant un pointeur "grossier" (doigt plutôt que la souris).

Un taille correcte pour tous vos éléments tactiles profite à tous les utilisateurs, mais est particulièrement utile pour toute personne ayant une déficience motrice.

Enfin, ne pas respecter cette bonne pratique peut nuire à votre référencement car votre page ne sera pas considérée comme Mobile Friendly. Or les sites mobile friendly sont privilégiés par Google.

Eléments tactiles incorrects

0 3 10

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Les cibles tactiles ne sont pas dimensionnées correctement, Opquast règle n°181

#66 Crawl/ Performance/ EcoconceptionEviter les erreurs graves de l'HTML selon le W3C 100 x 1

Même si la plupart du temps, les erreurs relevés par le W3C n'ont que peu d'impact sur le fonctionnement d'une page ; certaines erreurs sont rédhibitoires.

En effet, tout code HTML mal formé peut provoquer des bugs graphiques et dans certains cas empêcher la bonne indexation des pages dans les moteurs de recherche. 

Nous avons identifié les erreurs graves suivantes comme des erreurs devant être corrigées : 

  • Elément mal placé : par exemple un élément meta dans le body ne sera pas interprété.
  • Pas d'espace entre 2 attributs.
  • Ouverture d'un élément non fermé par la suite.
  • Fermeture d'un élément non ouvert au préalable.
  • Erreur fatale qui empêche le validateur de parcourir le code dans son intégralité. 

Article sur le sujet : 

Nombre d'erreurs graves selon le W3C

0 10 20

Cette bonne pratique est aussi recommandée par : CNumR.
Article de référence(s) : CNumR - BP#031

#68 CrawlRenseigner un sitemap correcte 100 x 2

Un sitemap est un fichier XML listant les URLs du site que les moteurs de recherche doivent explorer en vue de leur indexation. Ce protocole initié par Google en 2005 est désormais utilisé par les plus grands moteurs de recherche : Google, Bing, Baidu, Yandex, etc. Ce standard est défini sur le site officiel sitemaps.org.

Il peut y avoir plusieurs fichiers sitemaps pour un seul site. Il faut simplement que les robots puissent les trouver au sein d'un index de sitemaps qui listera donc tous ces fichiers. 

Un site peut diffuser  :

  • un maximum de 50 000 URLs par fichier sitemap,
  • de 50 000 fichiers sitemap
  • et un maximum de 500 fichiers d'index de sitemaps.

NB : soit une limitation globale de plus d'un milliard d'URls par site.

Pour faire connaître votre sitemap aux moteurs de recherche, il y a 3 solutions : 

  1. Par l'envoi de l'url du sitemap ou de l'index des sitemaps par le biais de l'interface de transmission du moteur de recherche. Par exemple : via la search console pour Google
  2. Par une indication dans le robots.txt.
    Par exemple : Sitemap: http://www.example.com/sitemap.xml
  3. A l'aide d'une requête HTTP. Le standard défini une requête de la forme suivant : <searchengine_URL>/ping?sitemap=sitemap_url 
    Par exemple pour Google : https://www.google.com/ping?sitemap=sitemap_url

La plupart du temps, le sitemap se trouve à la racine du site et se nomme sitemap.xml mais cela n'est pas une obligation. Avec WordPress et le plugin très répandu Yoast, il se trouve aussi à la racine et se nomme sitemap_index.xml. 

Quelques règles à respecter : Le fichier doit être encodé en UTF-8 et respecter le format XML. Il doit aussi fournir les informations liées au langues quand c'est nécessaire. Les URLs doivent être complètes (pas d'URL relative à la racine).

Préférez la création automatisée de votre sitemap par votre CMS, notamment pour les mises à jour automatiques des URLs qu'il fournit.

En termes de SEO, un sitemap accélère le crawl et donc l'indexation des nouvelles URLs mises en ligne.

NB : Google est très clair sur l'utilisation de ses rapports dans la Google Search Console : "Le rapport de couverture de l'index fonctionne mieux avec les sites qui envoient des fichiers sitemap. Les fichiers sitemap sont un excellent moyen de faire connaître aux moteurs de recherche les nouvelles URLs et les URLs mises à jour." 
source:  https://developers.google.com.

Sitemap

1 0 0

Cette bonne pratique est aussi recommandée par : google, Opquast.
Article de référence(s) : Opquast règle n°213

#117 Crawl/ SécuritéUtiliser uniquement des requêtes HTTPS 100 x 2

Tous les sites doivent être protégés par le protocole HTTPS, même ceux qui ne traitent pas de données sensibles.

Cela vaut autant pour la page elle-même que pour les ressources qu'elle intègrent. Sinon, vous risquez d'avoir ce qu'on appelle un contenu mixte. Dans ce cas, la demande d'une ressource à l'aide du protocole HTTP non sécurisé affaiblit la sécurité de la page entière. Cela peut permettre à des programmes mal intentionnés de suivre les utilisateurs, remplacer tout ou partie du contenu voire prendre le contrôle total de la page.

Bien que de nombreux navigateurs signalent des avertissements de contenu mixte à l'utilisateur, au moment où cela se produit, il est trop tard : les requêtes non sécurisées ont déjà été effectuées et la sécurité de la page est compromise. Même si les navigateurs bloquent de plus en plus les contenus mixtes, éviter d'en avoir garantit que le contenu reste intègre et assure mieux la sécurité de vos utilisateurs.

De plus, utiliser HTTP/S est une condition préalable à l'utilisation de HTTP/2. Et utiliser exclusivement l'HTTP/S est souvent requis par de nombreuses API de plates-formes Web.

NOMBRE de Requêtes HTTP

0 1 5

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : N'utilise pas HTTPS, Opquast règle n°192

#128 Crawl/ SécuritéRediriger le protocole HTTP vers HTTPS 100 x 2

Il est possible pour des raisons diverses, qu'un internaute ou un programme malveillant lance une requête sur votre page avec le protocole HTTP. Par définition, celui-ci n'est pas sécurisé !

Il convient de rediriger toutes les URLs du site et toutes requêtes dans l'absolu vers le protocole HTTPS qui lui est sécurisé.

Accessoirement, plusieurs technologies requièrent HTTPS comme les service workers. Si cette redirection n'est pas en place, ce type de technologie ne fonctionnera pas pour l'utilisateur consultant le site en HTTP...

NB : Pour tester, méfiez vous Chrome redirige automatiquement vers HTTP/S. Préférez tester avec Firefox qui ne fait pas cette redirection. Ce qui vous permet de vérifier que la redirection est bien faite coté serveur. 

Redirection HTTP vers HTTPS

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Ne redirige pas le trafic HTTP vers HTTPS

Indexation 100

Voir l'analyse

L’indexation en référencement naturel (SEO) désigne la procédure par laquelle un moteur de recherche stocke et répertorie dans une base de données les pages précédemment crawlées qui sont suffisamment pertinentes pour être sauvegardées. Ainsi, l'index d'un moteur de recherche représente une copie du web qu'il connaît et dans laquelle il pourra trouver les informations à fournir à ses utilisateurs. Il est important de s'assurer que les pages indexées de votre site soient bien des pages stratégiques pour votre visibilité.

#57 IndexationNe pas bloquer l'indexation de la page 100 x 3

Il est possible de bloquer l'indexation d'une page par les moteurs de recherche en lui passant des instructions précises. Vous pouvez avoir besoin de le faire pour un site en cours de développement ou pour un contenu sur lequel vous ne voulez pas que les moteurs de recherche s'attardent.

NB : en effet, les moteurs de recherche ne parcourent pas vos pages indéfiniment. Ils allouent un temps ou un nombre de pages à leurs robots pour parcourir votre site selon un intervalle régulier. C'est en ce sens qu'il peut être intéressant de les laisser se concentrer sur ce qui est important.

Ce blocage ne doit toutefois pas être la normalité. Pour que vos pages soient indexées correctement veillez à ne pas les bloquer avec soit une "meta noindex" soit avec une réponse HTTP équivalente.

On constate souvent cette anomalie lors d'une mise en ligne d'un site WordPress où la case "Demander aux moteurs de recherche de ne pas indexer ce site" est restée cochée depuis la période de développement.

Présence de mentions noindex

1 0 0

Lighthouse vérifie les en-têtes ou les éléments meta qui bloquent tous les robots des moteurs de recherche.

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : L'indexation de la page est bloquée

#60 Indexation Utiliser des attributs "hreflang" valides 100 x 2

Une page web peut avoir des déclinaisons dans plusieurs langues. Et chaque déclinaison peut indiquer l'URL des autres versions en spécifiant leurs langues. Pour cela, on insère dans le head un élément "link" avec l'attribut "hreflang".  Avec ces informations, les moteurs de recherche peuvent afficher la version correcte pour chaque langue ou région.

La valeur de l'attribut "hreflang" peut être constituée uniquement du code langue selon la liste des codes ISO 639-1, comme par exemple hreflang="en", hreflang="es" ou hreflang="fr".

Et cette valeur peut aussi intégrer un code région selon la norme ISO 3166-1 alpha-2. Dans ce cas-là, les deux codes sont séparés par un tiret. Exemples : hreflang="en-GB", hreflang="en-US" ou hreflang="en-AU".

Nombre d'attribut Hreflang invalide

0 1 2

Lighthouse compte les attributs "hreflang" dans les éléments "links" avec des codes de langue non valides.

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Le document n'a pas de hreflang valide

#62 IndexationUtiliser un attribut rel=canonical de manière valide 100 x 4

Si une de vos pages web est accessible via plusieurs URLs, ou si différentes pages de votre site présentent un contenu similaire, son contenu peut être considéré comme doublon par les moteurs de recherche. L'une de vos pages ou même l'ensemble des doublons pourraient être moins bien indexé.

C'est pour régler ce problème qu'il vaut mieux définir l'URL canonique. Cela représente plusieurs intérêts : 

  • Pour définir l'URL que vous souhaitez voir affichée dans les résultats de recherche.
  • Pour simplifier le suivi des statistiques d'un seul produit/sujet. Avec différentes URL, il est plus difficile d'obtenir des données regroupées pour un contenu spécifique.
  • Pour que Googlebot exploite au mieux votre site :  il est préférable que Googlebot passe du temps à explorer les nouveaux contenus (ou les pages mises à jour) de votre site, plutôt que d'explorer les doublons d'une même page.

La solution la plus simple consiste a insérer un élément "link" dans le head de la page originale et de ses doublons avec les attributs "rel" et "href" comme ceci : 

<link rel="canonical" href="https://example.fr/mon-contenu-original" />

L'URL du "href" devant être celle de la page original bien évidemment.

Canonical Valide

1 0 0

Le test de Lighthouse échoue si :

  • Il existe plusieurs liens canoniques.
  • Le lien canonique n'est pas une URL valide.
  • Le lien canonique pointe vers une page pour une région ou une langue différente.
  • Le lien canonique pointe vers un domaine différent.

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Le document n'a pas de rel=canonical valide

#98 Indexation/ AccessibilitéSpécifier la langue du document 100 x 2

Pour spécifier la langue d'une page web, il suffit de renseigner l'attribut lang au niveau de l'élément Html lui-même. 

<html lang="fr">

La valeur de cet attribut doit contenir un code de deux ou trois lettres (généralement en minuscules) correspondants aux abréviations de langues selon la norme ISO639.

Il peut contenir deux sous-codes :

  1. le système d'écriture utilisé par la langue défini par un code de 4 lettres comme pour le japonais écrit avec l'alphabet Katakana, le code sera lang="ja-Kana".
  2. le code pays défini par deux lettres en majuscules selon la norme ISO3166. Exemple avec la version canadienne du français,  lang="fr-CA".

Exemple complet avec la version canadienne du braille français, lang="fr-Brail-CA".

NB : Si vous utilisez une langue qui s'écrit de droite à gauche, veillez à le préciser à l'aide de l'attribut dir, soit dir="rtl" (right to left).

Le fait de spécifier une langue permet d'aider les lecteurs d'écran à énoncer correctement le texte.

Attribut lang valide

2 1 1

0 : l'attribut n'est pas présent
1 : l'attribut est présent mais invalide
2 : l'attribut est présent et valide

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG, Opquast.
Article de référence(s) : L'élément html doit avoir une valeur valide pour l'attribut lang, Opquast règle n°125

#100 Indexation/ AccessibilitéRenseigner l'attribut xml:lang comme l'attribut lang NA x 2

L'attribut xml:lang n'est pas obligatoire en tant que fichier HTML. Mais il le devient en tant que fichier XML.

Quand on s’appuie sur des analyseurs XML (comme la fonction lang() de XSLT), l’attribut lang n'est pas reconnu. Dans ce cas-là, il faut définir l'attribut xml:lang.

Si vous servez le document en XHTML (soit en HTML et XML en même temps), vous devez définir les deux attributs lang et xml:lang de manière identique. À l'inverse si vous servez votre page uniquement en tant que XML (par exemple à l’aide du type MIME application/xhtml+xml), vous n’avez pas besoin de l’attribut lang. Seul l’attribut xml:lang suffira.

En bref, la valeur de l'attribut xml:lang, s'il est inclus dans l'élément html, doit être exactement identique à la valeur de l'attribut lang.

Si la langue de la page Web n'est pas spécifiée de manière cohérente, le lecteur d'écran risque de ne pas énoncer correctement le texte de la page.

Validité de l'attribut XML:LANG

NaN  1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse, WCAG.
Article de référence(s) : Les éléments HTML avec lang et xml:lang doivent avoir la même langue de base

Sécurité (13 bonnes pratiques)

La sécurité d'un site internet est essentielle. Les bonnes pratiques ci-dessous ont pour objectif de sécuriser votre site en signalant les simples bugs ou l'obsolescence de certaines pratiques, mais aussi de rassurer vos utilisateurs et de gagner leur confiance en préservant la confidentialité de leurs données, tout en évitant d'être trop intrusifs dans leur vie "numérique".

Protocole 65

#46 Protocole/ PerformanceUtiliser la version la plus récente du protocole TLS 0 x 1 alerte

TLS est le protocole qui assure la confidentialité des échanges HTTP/S sur Internet entre les utilisateurs et les serveurs. Lorsqu'un serveur et un client communiquent, TLS s'assure qu'aucun tiers ne peut intercepter ni falsifier un message.

Ce protocole est très largement utilisé et la plupart des navigateurs sont aussi des clients TLS. Les versions 1.0 et 1.1 sont obsolètes. Depuis 2020, les navigateurs ne supportent plus ces anciennes versions. En effet, elles ne sont pas sûres, si ce n'est pas le cas il vous faut passer à minima à la version 1.2.

La version 1.3 de TLS en plus d'être plus sécurisée, effectue une négociation "handshake" en moins d'étapes et est donc plus rapide que le TLS 1.2. 

NB : Faire du HTTPS avec la version 1 d'HTTP est une hérésie en termes de performance.

 

Nombre de domaines qui utilisent des versions TLS< 1.3

18  0 5 15

alerte Cette métrique a atteint une valeur au-delà du seuil d'anomalie. Ce qui signifie qu'il existe un problème réel dont vous devriez vous préoccuper.

Compte le nombre de domaines qui utilisent des versions TLS < 1.3. 

Cette bonne pratique est aussi recommandée par : YellowLab Tools.

#117 Protocole/ SEOUtiliser uniquement des requêtes HTTPS 100 x 2

Tous les sites doivent être protégés par le protocole HTTPS, même ceux qui ne traitent pas de données sensibles.

Cela vaut autant pour la page elle-même que pour les ressources qu'elle intègrent. Sinon, vous risquez d'avoir ce qu'on appelle un contenu mixte. Dans ce cas, la demande d'une ressource à l'aide du protocole HTTP non sécurisé affaiblit la sécurité de la page entière. Cela peut permettre à des programmes mal intentionnés de suivre les utilisateurs, remplacer tout ou partie du contenu voire prendre le contrôle total de la page.

Bien que de nombreux navigateurs signalent des avertissements de contenu mixte à l'utilisateur, au moment où cela se produit, il est trop tard : les requêtes non sécurisées ont déjà été effectuées et la sécurité de la page est compromise. Même si les navigateurs bloquent de plus en plus les contenus mixtes, éviter d'en avoir garantit que le contenu reste intègre et assure mieux la sécurité de vos utilisateurs.

De plus, utiliser HTTP/S est une condition préalable à l'utilisation de HTTP/2. Et utiliser exclusivement l'HTTP/S est souvent requis par de nombreuses API de plates-formes Web.

NOMBRE de Requêtes HTTP

0 1 5

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : N'utilise pas HTTPS, Opquast règle n°192

#128 Protocole/ SEORediriger le protocole HTTP vers HTTPS 100 x 1

Il est possible pour des raisons diverses, qu'un internaute ou un programme malveillant lance une requête sur votre page avec le protocole HTTP. Par définition, celui-ci n'est pas sécurisé !

Il convient de rediriger toutes les URLs du site et toutes requêtes dans l'absolu vers le protocole HTTPS qui lui est sécurisé.

Accessoirement, plusieurs technologies requièrent HTTPS comme les service workers. Si cette redirection n'est pas en place, ce type de technologie ne fonctionnera pas pour l'utilisateur consultant le site en HTTP...

NB : Pour tester, méfiez vous Chrome redirige automatiquement vers HTTP/S. Préférez tester avec Firefox qui ne fait pas cette redirection. Ce qui vous permet de vérifier que la redirection est bien faite coté serveur. 

Redirection HTTP vers HTTPS

1 0 0

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Ne redirige pas le trafic HTTP vers HTTPS

Entêtes 67

#119 EntêtesDéfinir une entête CSP (Content Security Policy) 100 x 1

Une politique de sécurité du contenu (CSP : Content Security Policy) permet de garantir que tout contenu chargé dans la page est approuvé par le propriétaire du site. 

Il s'agit d'une en-tête HTTP à configurer directement dans la réponse HTTP soit dans une "meta http-equiv". Préférez la réponse dans l'entête HTTP car une injection JavaScript avant la balise meta pourrait contourner les règles définies dans la CSP.

Voici la liste des directives disponibles : 

  • default-src
    La directive default-src définit la politique par défaut pour récupérer des ressources telles que JavaScript, Images, CSS, Fonts, Requêtes AJAX, Frames, HTML5 Media.
    NB : Toutes les directives ne se replient pas sur default-src.
  • script-src
    Définit les sources valides de JavaScript.
  • style-src
    Définit les sources valides des feuilles de style ou CSS.
  • img-src
    Définit les sources d'images valides.
  • connect-src
    S'applique à XMLHttpRequest (AJAX), WebSocket, fetch(), <a ping> ou EventSource. S'il n'est pas autorisé, le navigateur émule un code d'état HTTP 400.
  • font-src
    Définit les sources valides des ressources de polices (chargées via @font-face).
  • object-src
    Définit les sources valides des plugins, par exemple <object>, <embed> ou <applet>.
  • media-src
    Définit les sources valides d'audio et de vidéo, par exemple les éléments HTML5 <audio>, <video>.
  • frame-src
    Définit les sources valides pour le chargement des trames. CSP niveau 2, frame-src a été déprécié au profit de la directive child-src  mais il continuera à fonctionner si child-src n'est pas présent.
  • sandbox
    Active un sandbox pour la ressource demandée similaire à l'attribut iframe sandbox. Le bac à sable applique une même politique d'origine, empêche les popups, les plugins et l'exécution des scripts est bloquée.
  • child-src
    Définit des sources valides pour les travailleurs Web et les contextes de navigation imbriqués chargés à l'aide d'éléments tels que <frame> et <iframe>
  • form-action
    Définit les sources valides qui peuvent être utilisées comme action HTML <form>.
  • frame-ancestors
    Définit les sources valides pour intégrer la ressource à l'aide de <frame> <iframe> <object> <embed> <applet>. Définir cette directive sur 'none' devrait être à peu près équivalent à X-Frame-Options : DENY
  • plugin-types
    Définit les types MIME valides pour les plugins invoqués via <object> et <embed>. 
  • base-uri
    Définit un ensemble d'URL autorisées pouvant être utilisées dans l'attribut src d'une balise de base HTML.
  • worker-src
    Restreint les URL pouvant être chargées en tant que Worker, SharedWorker ou ServiceWorker.
  • manifest-src
    Restreint les URL auxquelles les manifestes d'application peuvent être chargés.
  • prefetch-src
    Définit des sources valides pour la prélecture et le prérendu des requêtes, par exemple via la balise de lien avec rel="prefetch" ou rel="prerender":

Les options sont donc nombreuses et précises et devraient vous permettre de mieux sécuriser vos pages web. Plus d'infos ici : https://content-security-policy.com/.

Présence de l'entête CSP

1 0 0

Ne test que la présence d'une CSP. Voir la BP#203 pour les éventuelles failles.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Assurez-vous que CSP est efficace contre les attaques XSS, Opquast règle n°207

#120 EntêtesEviter les failles dans l'entête CSP 0 x 1

La configuration d'un CSP implique l'ajout de l'en-tête HTTP Content-Security-Policy à une page Web et surtout la définition de valeurs pour contrôler les ressources que l'agent utilisateur est autorisé à charger pour cette page.

Si une CSP atténue les attaques de script intersite (XSS :Cross-Site Scripting) car ils peuvent bloquer les scripts dangereux injectés par les attaquants, elle peut facilement être contournée si les valeurs définies ne sont pas assez strictes. En effet, en plus de demander beaucoup de personnalisation, les CSP couramment basées sur des listes d'autorisation d'hôtes laissent souvent la page exposée à des attaques XSS car elles peuvent être contournées.

Pour éviter cela, vous pouvez utiliser une politique de sécurité du contenu basée sur des nonces ou des hachages :

  • Un nonce est un nombre aléatoire utilisé une seule fois qui peut être utilisé pour marquer une balise script comme étant de confiance.
  • Une fonction de hachage est une fonction mathématique qui convertit une valeur d'entrée en une valeur numérique compressée, un hachage. Un hachage (tel que SHA-256 ) peut être utilisé pour marquer une balise script en ligne comme fiable.

Mettre en place une CSP à la fois souple et fiable à 100% est rarement simple. Nous vous conseillons de faire appel à un spécialiste pour voir comment la mettre en place. 

Dans tous les cas, surveillez la métrique associée à cette bonne pratique pour qu'elle ne se détériore pas. 

Nombre de failles CSP

0 1 5

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Assurez-vous que CSP est efficace contre les attaques XSS

#121 EntêtesDéfinir une entête HSTS (HTTP Strict Transport Security) 100 x 1

Créée en 2012 par l'IETF, l'objectif de l'en-tête HSTS (HTTP Strict Transport Security) est de forcer un navigateur à utiliser des connexions sécurisées. 

L'idée étant de traiter les problématiques suivantes :

  • Toutes les tentatives de consulter les pages d'un site web avec HTTP doivent être automatiquement redirigées vers HTTPS.
  • Permet de vérifier la connexion. En cas de connexion non sécurisée, elle garantit que le certificat n'est pas altéré. Ainsi le navigateur affiche un message d'erreur et interdit à l'utilisateur l'accès au site.
  • Eviter les détournements de cookies. Un vol de cookie sur une connexion non sécurisée peut permettre à quelqu'un de récupérer des informations confidentielles comme des numéros de carte de crédit.

La mise en place de cette entête requiert les points suivants :

  • Votre certificat SSL doit être valide et couvrir tous les sous-domaines.
  • Tous les liens HTTP doivent avoir une redirection 301 (redirection permanente) vers HTTPS.
  • Le paramètre « Max-age » de l'entête doit être défini sur au moins 10886400 secondes ou 18 semaines.
  • La directive « includeSubDomains » doit, le cas échéant, être spécifiée !
  • La directive « preload » doit être spécifiée.

Au final votre entête HSTS doit ressemble à çà :
Strict-Transport-Security: max-age=106384710; includeSubDomains; preload

Présence de l'entête HSTS

1 0 0

Cette bonne pratique est aussi recommandée par : Opquast.
Article de référence(s) : Opquast règle n°194

#122 EntêtesDéfinir une entête X-Content-Type-Options 100 x 1

L'en-tête HTTP X-Content-Type-Options est utilisé par le serveur pour indiquer que les types MIME annoncés dans les en-têtes Content-Type doivent être suivis et non modifiés par le navigateur. 

En effet, le navigateur dispose d'une fonctionnalité qui lui permet de comparer le contenu qu'il récupère avec l'en-tête Content-Type fourni par le serveur et si cela lui semble incorrect de lui appliquer le type MIME qu'il juge le plus approprié.

L'inconvénient est qu'un programme malveillant peut utiliser ce "reniflage" de type MIME pour exécuter un code sur l'ordinateur d'un utilisateur en incitant le navigateur à interpréter un fichier comme un type MIME différent de ce qu'il est réellement. Par exemple, faire passer un script pour une image...

La déclaration d'une telle entête doit ressembler à ceci :
X-Content-Type-Options: nosniff

Présence de l'entête X Content Type Options

1 0 0

Cette bonne pratique est aussi recommandée par : Opquast.
Article de référence(s) : Opquast règle n°201

#123 EntêtesDéfinir une entête X Frame Options 100 x 1

L'entête HTTP X Frame Options indique au navigateur si la page web peut être afficher dans un autre contexte. C'est à dire, est-ce que la page peut utilisée au sein d'une iframe ou dans un plugin ?

Il faut définir cette en-tête car sans cela il est possible d'embarquer la page web dans une iframe et d'en modifier le comportement afin de récupérer des identifiants et mots de passe par exemple.

L'en-tête X Frame Options peut prendre trois valeurs :

  • Deny : interdit tout chargement de la page web à l'intérieur d'une iframe
  • Sameorigin : l'inclusion est autorisée seulement si la page appelante possède la même origine c'est à dire, même domaine, même protocole et même port.
  • Allow-from <url> :  permet d'autoriser explicitement des domaines qui incluraient la page dans une iframe.

Généralement, on utilise la deuxième valeur comme ceci :
X-Frame-Options : SAMEORIGIN

Présence de l'entête X Frame Options

1 0 0

Cette bonne pratique est aussi recommandée par : Opquast.
Article de référence(s) : Opquast règle n°206

#124 EntêtesNe pas utiliser d'entête X XSS Protection 0 x 1

L'en-tête HTTP X-XSS-Protection est une fonctionnalité d'Internet Explorer, de Chrome et de Safari qui empêche le chargement des pages lorsqu'elles détectent des attaques de type cross-site scripting (XSS).

Cependant, cet en-tête est désormais obsolète et la prise en charge a été supprimée de la plupart des navigateurs

Pire même, si cette fonctionnalité peut protéger les utilisateurs d'anciens navigateurs Web qui ne prennent pas encore en charge CSP, l'en-tête HTTP X-XSS-Protection peut créer des vulnérabilités dans des sites Web pourtant sécurisés.

Il convient donc de supprimer cette en-tête. Plus d'infos sur Developer.mozilla.org.

Présence de l'Entête XSS protection

0 1 1

Cette bonne pratique est aussi recommandée par :.

Confidentialité 100

#126 ConfidentialitéNe pas demander l'autorisation de géolocalisation au chargement de la page 100 x 1

Les utilisateurs peuvent être méfiants envers les pages qui demandent automatiquement leur emplacement lors du chargement de la page (et on les comprend !).

Pour respecter leur confidentialité, il est bon de respecter quelques règles :

  • Demandez toujours l'autorisation de géolocalisation après une action de l'utilisateur, et non au chargement de la page.
  • Indiquez clairement que l'action demandera une autorisation de géolocalisation.
  • Utilisez une "solution de secours" si les utilisateurs n'accordent pas l'autorisation de géolocalisation.

Demande d'autorisation de localisation au chargement

1 0 0

Lighthouse vérifie si les JavaScript exécutés lors du chargement de la page appellent geolocation.getCurrentPosition() ou geolocation.watchPosition() et que l'autorisation de géolocalisation n'a pas encore été accordée. Si tel est le cas, le test échoue.

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Demande l'autorisation de géolocalisation au chargement de la page

#127 ConfidentialitéNe pas demander l'autorisation de notification au chargement de la page 100 x 1

Les utilisateurs peuvent être méfiants envers les pages qui demandent automatiquement l'autorisation d'envoi de notifications dès le chargement de la page (et on les comprend !).

Depuis plusieurs années déjà, les chercheurs ont démontré les conséquences parfois dramatiques de la "sursollicitation numérique". Les utilisateurs veulent désormais diminuer leur charge cognitive. Ainsi, solliciter dès le chargement de la page une autorisation de notification, n'encourage pas vos utilisateurs à avoir confiance ni en vos pratiques plus ou moins responsables en termes de notification, et ni en vos contenus ou services...

Pour conserver la confiance de vos utilisateurs, nous vous recommandons les usages suivants  : 

  • Ne présentez la demande d'autorisations qu'une fois que les utilisateurs se sont explicitement inscrits au service de notification.
  • Dans la mesure du possible, proposez un choix spécifique de notification que ce soit le thème abordé ou la fréquence.

DEMANDE D'AUTORISATION DE NOTIFICATION AU CHARGEMENT

1 0 0

Lighthouse vérifie si les JavaScript exécutés lors du chargement de la page appellent notification.requestPermission() et que l'autorisation de notification n'a pas encore été accordée. Si tel est le cas, le test échoue.

Cette bonne pratique est aussi recommandée par : Google Lighthouse.
Article de référence(s) : Demande l'autorisation de notification au chargement de la page

Autres 100

#118 Autres Eviter les librairies JavaScript vulnérables 100 x 3

Comme tous les langages de programmation, JavaScript présente des risques de sécurité. L’exploitation des vulnérabilités JavaScript peut permettre de manipuler, modifier et voler des données, de rediriger des sessions, et bien plus encore. Bien que JavaScript soit généralement considéré comme une application client, ses vulnérabilités de sécurité sont également susceptibles d’avoir des répercussions côté serveur.

Les vecteurs d’attaque JavaScript les plus courants sont les suivants :

  • exécution de scripts malveillants,
  • vol de données de session établies par l’utilisateur ou de données provenant du stockage local (localStorage) du navigateur,
  • incitation des utilisateurs à effectuer des actions indésirables,
  • exploitation de vulnérabilités dans le code source des applications web.

Dès lors, si vous avez des librairies JS connues pour avoir des failles de sécurité, nous vous encourageons vivement à effectuer une mise à niveau vers des versions corrigées dès que possible.

Nombre de vulnérabilités détectées dans les librairies JS

0 1 5

Cette bonne pratique est aussi recommandée par : Snyk.

#125 AutresNe pas empêcher le copier/coller dans les champs de saisie 100 x 1

Vous verrez certainement des recommandations inverses ailleurs, mais artwaï recommande d'autoriser le copier/coller dans les champs de saisie même pour les champs de mots de passe !

Nous pensons que cela ne réduit pas la sécurité. Au contraire, cela l'améliore car cela permet l'utilisation de gestionnaires de mots de passe comme Keepass, LastPass, 1Password, etc...

Les gestionnaires de mots de passe génèrent des mots de passe forts pour les utilisateurs, les stockent en toute sécurité, puis les collent automatiquement dans les champs de mot de passe chaque fois que les utilisateurs doivent se connecter.

Cette approche est généralement plus sûre que de forcer les utilisateurs à saisir des mots de passe suffisamment courts pour être mémorisés.

Copier/Coller bloqué par JavaScript

1 0 0

Lighthouse rassemble tous les éléments "inputs" utilisable , colle du texte dans chaque élément, puis vérifie que l'événement "coller" (paste) n'a pas été empêché par un JavaScript personnalisé.

Cette bonne pratique est aussi recommandée par : Google Lighthouse, Opquast.
Article de référence(s) : Empêche les utilisateurs de coller dans les champs de saisie, Opquast règle n°90

Sources des données

Source Accès URL / ID Données stockées
API WebPageTest.org Général Clef API (artwaï) 250929_ZiDcXW_5TC JSON Global download
JSON ScriptTiming download
YellowLab.Tools
Instance privée artwaï
Privé 20250929-unqnscl JSON download
Lighthouse
Instance privée artwaï
Privé - JSON download
W3C
Généré à partir de Nu Html Checker
API Public - JSON download
API Alyze Clef API (artwaï) - JSON download
APIs SEO Clefs API (artwaï) - JSON Mozdownload
JSON Rapidapi (Majestic)download

Ce rapport a été généré en 3 minutes 46 secondes le 29/09/2025 14:18 et expirera au bout d'un an soit le 29/09/2026 14:18 (millecheck.ai version 4.9.5). Consulter le log download .

Performance

Avec ce score de Performance,
nos experts peuvent
peut-être certainement vous aider !

Depuis 2005, artwaï accompagne ses clients avec une démarche de qualité Web. Nos expertises couvrent la Web-performance, l'Écoconception, l'Accessibilité, et d'autres notamment dans des contextes WordPress.

Nous assurons des services de monitoring WebPerf et Tierces Parties, la mise en place de dashboard, en plus d'effectuer des audits et des POCs concrets pour résoudre les problématiques de nos clients.

Contactez-nous ! Gérer les préférences

Mille
Check

F EcoIndex

Faîtes un geste pour la planète :
nos experts peuvent vous aider
à diminuer votre empreinte carbone.

Depuis 2005, artwaï accompagne ses clients avec une démarche de qualité Web. Nos expertises couvrent la Web-performance, l'Écoconception, l'Accessibilité, et d'autres notamment dans des contextes WordPress.

Nous assurons des services de monitoring WebPerf et Tierces Parties, la mise en place de dashboard, en plus d'effectuer des audits et des POCs concrets pour résoudre les problématiques de nos clients.

Contactez-nous ! Gérer les préférences

Mille
Check

MilleCheck

Guide

Réglages

Contexte du test

URL de test :

https://mcetv.ouest-france.fr/

Configuration :

MOBILE / 4g Slow
Download : 2,0 Mbps / Upload : 1,0 Mbps / Latence : 100 ms
Localisation du serveur : Paris / Viewport : 412 x 767 (MotoGPower) / DPR : 1.75
Serveur Millecheck : chocolate

Anomalie liée à WebPageTest

Un problème est survenu lors de l'analyse WebPageTest et cette dernière n'a pu aboutir. Il y a deux raisons possibles : soit WebPageTest n'a pas détecté d'événement onload au bout d'une minute ; soit il détecte une activité réseau continue après ce même évènement.
Dans tous les cas, cela n'est pas bon signe pour la performance de votre page...

Mode avec CMP activé

Validation avec la cmp didomi.

Cookies

  • didomi_token : http://.ouest-france.fr/
  • euconsent-v2 : http://.ouest-france.fr/

Pour des raisons de confidentialité, la valeur des cookies prédéfinis n'est pas exposée.


Domaines First Party

  • *.ouest-france.fr

En première approche, MilleCheck considère comme First Party toutes les ressources requêtées depuis le domaine principal et ses sous-domaines.

Besoin d'un monitoring

MilleCheck peut mettre en place un dashboard de suivi de plusieurs URLs avec des rapports quotidiens.

Contactez-nous !

Préférences utilisateurs

Toutes les préférences ci-dessous sont stockées dans le localstorage de votre navigateur. Nous ne conservons aucune donnée (personnelle ou non) sur le serveur.

Vue préférée


La vue hiérarchique permet de visualiser les bonnes pratiques classées par catégorie et toujours dans le même ordre. Il est ainsi plus aisé de comparer deux rapports.


La vue priorisée ordre la liste des bonne pratiques par gain les plus intéressant à corriger dans la catégorie affichée. Comme son nom l'indique, cela permet d'afficher par ordre de priorité des bonnes pratiques à traiter.


Cette option permet de ne plus affichée les bonnes pratiques qui ne concernent pas l'analyse en cours.

Affichage de l'autopromo


MilleCheck

Guide

Mode d'emploi

Bonne pratique ?

Une bonne pratique selon artwaï est une pratique qui dispose de deux critères :

  • elle est recommandée par des acteurs reconnus du web,
  • et elle a prouvé son efficacité concernant l'amélioration du domaine de qualité auquel elle se réfère.

Ainsi, nos rapports utilisent des référentiels existant public et/ou open source pour tester ce qui l'est de manière algorithmique. Parmis ces référentiels on peut citer YellowLab.tools, CNumR, Google ou le WAI.

Chaque bonne pratique de ce rapport dispose donc d'une description des sources de ses recommandations et de la métrique testée pour valider son succcès avec les seuils correspondants.

Classement

Les domaines concernés sont : la performance, l'écoconception, l'accessibilité, le SEO et la sécurité. Une bonne pratique peut avoir un impact sur plusieurs domaines.

Chaque domaine constitue une catégorie de bonne pratiques pour laquelle nous déterminons une note à partir des notes de sous-catégories. Une sous-catégorie regroupe les bonnes pratiques de même nature et surtout d'impact similaire. Que cela soit pour une catégorie, une sous-catégorie ou une bonne pratique, les notes sont toujours calculées de 0 à 100.

Evaluation

Chaque bonne pratique est notée sur 100. Cette note est selon la valeur d'une métrique postionnée entre 2 seuils :

  1. Un seuil bas (A) au dessous du quel la note est de 100
  2. Un seuil haut (B) au dessus du quel la note est de 0

La note calculée varie de 0 à 100 selon la valeur de la métrique entre A et B

Représentation

Valeur A B C

Le seuil C représente le seuil d'anomalie : la mesure dépasse largement ce qui est recommandé et n'est pas habituel au regard de notre expérience.

Pondération

#4 Poids/ Ecoconception Activer la compression 66 x2

L'impact de la note de la bonne pratique est pondérée sur la note de la catégorie à laquelle elle appartient. Le Coefficient est indiqué à coté de la note comme sur l'exemple ci-dessus.

Code couleur

Toutes les notes respectent le même code couleur en référence à leur note mais 2 formalismes légèrement différents :

49 Rouge : Mauvais
De 0 à 49.

89 Orange : À améliorer
De 50 à 89.

100 Vert : Bon
De 90 à 100.


Exceptions

Certaines bonnes pratiques sont là à titre d'information. Dans ce cas là, la couleur appliquée est le bleu.

50 NA

De même, lorsque nous n'avons pas la métrique associée à une bonne pratique, la note n'existant pas, la mention "NA" pour "Non Applicable" la remplace en gris.