Ce billet est une traduction simplifié de Best Practices for Speeding Up Your Web Site du YAHOO! Developer Network, un article remplis de conseils bien pensés pour accélérer l’affichage d’un site Internet et diminuer l’utilisation de la bande passante utilisé sur le serveur.
J’y ai appris beaucoup de petites astuces et je tenais à vous les faire partager !
Minimiser le nombre de requêtes HTTP
Le navigateur passe du temps à charger chaque éléments d’une page, demander un fichier, établir la connexion, le télécharger.., il est primordial que le premier accès à une page, avant que le navigateur mette en cache les fichiers, se fasse rapidement.
Sprites CSS :
Combiner les images de fond en un fichier et utiliser les propriétés CSS background-image et background-position.
Image maps :
Pour les images alignés, comme une barre de navigation, n’utiliser qu’un fichier et définir les liens avec des coordonnées.
Inline image :
Intégrer le contenu d’une image dans le code html, mais tout les navigateurs ne le gèrent pas.
Utiliser un réseau de distribution de contenu
80 à 90% du temps passé pendant le chargement d’une page sert à télécharger des images, c’est aussi ce qui charge le plus le serveur en bande passante.
Un Content Delivery Network (CDN) en anglais, sers a délocaliser tout les fichiers static sur un réseau de serveurs spécialisé, redirigeant automatiquement vers le serveur le plus rapide pour l’utilisateur.
Les plus connus sont Akamai, Mirror Image ou Limelight, mais ils ont un coût, il existe aussi le réseau Coral DN gratuit.
Ajouter des en-têtes Expires et Control-Cache
Les navigateurs et les proxies utilisent ces en-têtes pour mettre en cache les fichiers et ne plus les demander au serveur.
Il est possible d’utiliser un cache à durée indéterminé, ExpiresDefault "access plus 10 years" pour Apache, mais il faut alors faire attention lors d’une mise à jour à ne pas utiliser le même nom !
Control-Cache permet de sécuriser le contenu pour un site demandant une authentification.
Gzip
Utiliser la compréssion gzip au niveau du serveur réduit globalement le traffic de 70%, 90% du traffic sur internet l’utilise !
Pour Apache 2 il faut utiliser le module mod_deflate.
Le serveur utilise ou non la compression en fonction du type de fichier, elle sera utilisée pour les fichiers texte html, xml, json, et ne le sera pas sur les images jpg ou les fichiers pdf pour ne pas utiliser le processeur inutilement.
Mettre les feuilles de style en haut de page
Les feuilles de style CSS doivent être chargé dans la section HEAD de la page HTML, sur certains navigateurs, comme Internet Explorer, la page ne commence pas à s’afficher avant d’avoir reçus la feuille de style.
La positionner en début de page permet un affichage progressif.
Mettre les scripts en fin de page
Les spécification HTTP/1.1 conseillent aux navigateurs de ne pas télécharger plus de deux fichiers simultanément par utilisateur.
Pendant que le navigateur télécharge le fichier de scripts il ne chargera pas d’autre fichier, en placant les scripts en fin de page on accélère le chargement de la page.
Ne pas utiliser les expressions CSS
Une expression css est un code javascript inclus dans un css comme dans cet exemple:
background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );
Le problème est que l’expression est recalculé sur n’importe quel événement tel qu’un défilement de la page ou pire un mouvement de la souris.
Utiliser des JavaScript et CSS externe
En incluant dans une page les javascript et les css ils sont renvoyé au navigateur à chaque chargement.
En les plaçant dans des fichiers externe le navigateur les met en cache et n’aura plus à les recharger.
Réduire le nombre de requêtes DNS
Une requête DNS prend entre 20 et 120ms en moyenne, mettre ses fichiers sur plusieurs domaine favorise les téléchargements simultanés mais en utiliser trop augment le nombre de requêtes DNS, il est conseillé d’en utiliser deux.
Compresser les fichiers JavaScript et CSS
Ces fichiers contiennent en général de nombreux caractères inutiles qui peuvent être supprimé.
Il existe des outils permettant d’automatiser cette tâche comme JSMin et YUI Compressor qui gère aussi les css.
Eviter les redirections
Une redirection est une réponse du serveur indiquant au navigateur d’aller sur une autre page, qui coûte du temps.
Peut de développeur savent que lorsque l’on souhaite aller sur le site http://example.com/blog l’utilisateur est redirigé vers http://example.com/blog/.
La première chose à faire est d’utiliser des liens correcte, il est aussi possible de configurer le serveur Apache avec mod_rewrite et Alias pour que l’adresse sans slash fonctionne aussi.
Celà peut aussi être fait sur le serveur DNS en ajoutant un enregistrement CNAME redirigeant vers la bonne adresse.
Configurer les ETags
Entity Tags (ETags) est une en-tête HTTP permettant de vérifier que le cache du navigateur correspond avec le cache du serveur grâce à un identifiant unique pour chaque fichier.
Si on utilise un cluster de serveurs web, l’identifiant sera différent sur chaque serveur et le cache ne fonctionnera plus comme il faut.
Il faut alors soit configurer les ETags correctement, soit ne pas s’en servir du tout et utiliser l’en-tête Last-Modified.
Rendre les requêtes Ajax cachable
Les sites utilisant des fonctions Ajax permettent de ne pas recharger la page à chaque action, mais ces requêtes sont nombreuses et il faut faire attention à ce que les en-têtes HTTP pour l’utilisation du cache soient bien utilisé.
Il en va de même pour le Gzip, la compression textuelle, etc ..
Vider le buffer tôt
La plupart des langages utilisé pour le web permettent de vider la buffer de la page vers le navigateur avant la fin du calcul de la page.
En PHP c’est la commande flush().
En utilisant cette fonction juste après la section HEADER de la page html le navigateur va pouvoir charger les fichiers externe alors que la page n’est pas encore complètement créé.
Utiliser GET avec Ajax
Une requête POST se fait en deux temps: en-têtes, puis les données, alors qu’une requête GET se fait en une fois. La réactivité est alors amélioré.
Charger des images après la page
Sur une page web il est fort probable que des images ne soient pas visible dès l’ouverture de la page, placé plus bas. Il est possible de retarder leur chargement à l’aide de JavaScript et d’outils tel que YUI ImageLoader
Pré-charger les images
A l’opposé de ce qui a été écris ci-dessus mais pour un autre but, il est possible de charger des images qui ne sont pas affiché du tout sur la page, mais le seront sur la suivante, pour que le navigateur les mettent déjà en cache.
Cette technique peut aussi être utile avant un changement du design d’un site web, on pré-cache les images pour que l’utilisateur n’ait pas l’impression que le nouveau design est plus que l’ancien déjà caché.
Réduire le nombre d’éléments DOM
Une page complexe c’est plus de données à charger et des javascripts plus long à trouver les éléments d’une page.
Si la page contient trop d’éléments DOM peut être que le code HTML est mal pensé ou que les css ne sont pas bien utilisé.
Le framework css blueprint permet de placer ses éléments sur une grille pour simplifier la structure de la page.
Eviter les erreurs 404
Les pages introuvable ne servent à rien :)
Il faut surtout l’éviter sur les appels de scripts, le navigateur tente d’interpréter la page d’erreur comme si c’était un javascript ce qui fait perdre des ressources et du temps.
Mettre les fichiers statics sur un domaine sans cookies
En utilisant un sous-domaine ou un domaine pour les fichiers static, différent de celui des pages, les cookies ne sont pas envoyé au serveur ce qui accélère le temps de réponse.
Réduire le nombre d’accès DOM
La recherche d’éléments DOM dans une page par un javascript est couteuse, il est préférable d’enregistrer dans des variables l’emplacement des éléments utilisé fréquemment.
Utiliser <link> à la place de @import
Avec Internet Explorer @import est équivalent de <link> pour charger les css, à la différence que le chargement se fait en fin de page, ce qui ralentit l’affichage comme dit plus tôt.
Optimiser les images
Vérifier que la palette utilisé pour un GIF ne comprend que les couleurs affichés, imagemagick le fait très bien
Convertir les GIF en PNG et voir si la taille est plus faible.
Optimiser les PNG, avec pngcrush par exemple :
pngcrush image.png -rem alla -reduce -brute result.png
Optimiser les JPG avec jpegtran :
jpegtran -copy none -optimize -perfect src.jpg dest.jpg
Optimiser les sprites CSS
Utiliser des fichiers PNG avec au maximum 256 couleurs et placer les sprites horizontalement donne de meilleurs résultats à la compression que verticalement.
Créer un favicon.ico petit et cachable
Tout les navigateurs demandent automatiquement un fichier favicon.ico à la racine du domaine.
Il faut en créer un, de taille 1K maximum, et le rendre cachable pour que le navigateur ne le demande pas sur chaque page avec une erreur 404.