Informatique
Performances

Table des matières + X

Introduction

Attention, on va parler ici de performances front-end : il ne s'agit donc pas d'optimisation côté serveur, mais plutôt d'améliorer les temps de téléchargement et rendu côté client !

Malheureusement, alors que le sujet est assez populaire dans la communauté de concepteurs web au moins depuis 2007, les bonnes pratiques ne sont pas encore installées ! Et pourtant, bien souvent c'est bien là que les performances pèchent...
Voyez par exemple cette capture d'un site dynamique peu optimisé : le rendu total dure 1.21s, dont environ 300ms de rendu serveur... soit moins du quart !

Rendu d'un site peu optimisé

Pour optimiser son site, il faut travailler autour des 3 axes suivants... Les méthodes pour y parvenir sont détaillées ci-après.


Outils

Pour diagnostiquer, vérifier ce qui est mis en place etc il va falloir s'outiller ! Quelques exemples de logiciels importants :


Taille : compression des images

Quelque soit le format de l'image (PNG, JPEG, GIF, WebP), il y a possibilité d'optimiser la taille... ne serait-ce qu'en supprimant les métadonnées, et aussi bien sûr en faisant varier la compression pour s'approcher du meilleur compromis taille/qualité !

Plusieurs sites proposent ce service en ligne, et également des outils à installer. Citons en particulier PNGCrush et le site http://compresspng.com/.


Taille : minification, compression gzip

Généralités

Un moyen de réduire la taille des resources transmises est de supprimer les commentaires et caractères blancs (espaces, tabulations, ...). En particulier sur les fichiers CSS et JavaScript, le gain peut être important !

Il existe aussi la compression gzip. C'est un mécanisme présent depuis longtemps maintenant et par conséquent très largement supporté !
Voir cet article pour plus de détails : Cache et compression des pages web avec Gzip ou Deflate en HTTP - Alsacreations.

Plusieurs outils proposent de réaliser ces tâches de manière automatique, et il est bien sûr possible de le faire dynamiquement sur le serveur à chaque requête ou de l'intégrer à votre outil de build.

Mise en place

Sur le serveur de pages perso de Free malheureusement, il y a peu de latitudes de configuration. Mais il reste possible d'utiliser plusieurs mécanismes !
Cet article m'a donné toutes les clés pour avancer : Activer la compression sur les Pages Perso - Les Pages Perso Chez Free

Et j'ai donc mis en place une compression sur :

Les fichiers CSS et JS ont été minifiés et compressés en utilisant un site permettant d'utiliser l'excellent YUI Compressor en ligne : Online YUI Compressor.

Visualiser les taux de compression

Exemple de moyens disponibles au développeur :

Firefox
Dans les outils de développement Firefox la taille affichée est celle de la resource décompressée ! Un bug est saisi mais à cette date (août 2014) pas encore corrigé : 731318 – Display response size before and after content decoding).
Il faut donc se tourner vers l'extension Firebug, éventuellement accompagnée de l'excellent complément YSlow.
Chrome
Les outils de développement Chrome gèrent bien la compression - un bug existe également mais a été corrigé en avril 2011 : Issue 40502 - chromium - DevTools don't show compressed size of pages with chunked encoding - An open-source project to help move the web forward. - Google Project Hosting.
Outil en ligne
par exemple sur HTML Compression/GZIP Test | SeoSiteCheckup.com
Et aussi...
Dans les entêtes HTTP ! en particulier Content-Encoding :"gzip" et Content-Length

Nombre de requêtes HTTP : concaténation, CDN

Première chose à faire pour réduire le nombre de requêtes HTTP : regrouper le code ! En particulier en CSS et JavaScript (on verra au chapitre suivant que c'est possible pour les images également).

Aussi, on peut servir les resources depuis un domaine différent de la page : celà permet de contourner une limitation du navigateur. En particulier sur la GepapiR, plusieurs resources sont appelées sur les sites originaux :


Nombre de requêtes HTTP : CSS Sprites

Principe

Les CSS Sprites sont une technique permettant de réduire le nombre de resources à appeler dans une page : on regroupe en effet plusieurs images en une seule ! Cela permet aussi de mieux gérer la politique de cache, et parfois apporte des gains de taille de fichiers (un fichier regroupant plusieurs icones aura souvent une taille inférieure à la somme des petits fichiers de chaque icone).

Le principe est simple : plutôt que d'insérer avec la balise img, on crée un élément que l'on dimensionne à la taille de l'image, et on lui applique une image de fond. Cette image de fond regroupe les resources identiques, on sélectionne l'image voulue grace à background-position;.
Cet article chez Alsacreations explique bien la chose : Les sprites CSS - Alsacreations.

Mise en place

Sur la GepapiR, ce sont les séparateurs et les icones du menu de navigation qui utilisent cette technique (respectivement, mêmes largeurs et mêmes hauteurs).
Les images ont été regroupées grace à l'excellent Stitches !

Le code :


<!-- Séparateurs -->
<style>
hr.sep
{
clear: left;
margin: 4ex auto;
width: 630px;
border-style: none;
background-image: url("../images/separateurs/separateurs-sprites.png");
background-repeat: no-repeat;
box-shadow: 1px 1px 8px rgba(0,0,0,0.5);
}

/* Win 3.x */
hr.sep1
{
height: 23px;
background-position: 0 -59px;
}
</style>

<hr class="sep sep1">


<!-- Icone menu navigation -->
<style>
nav a>span.menu_icon
{
display: inline-block;
width: 15px;
height: 15px;
margin-right: 5px;
vertical-align: baseline;
background-image: url("../images/menu/menu-sprites.png");
background-repeat: no-repeat;
}

nav a#menu_accueil>span.menu_icon {
background-position: 0 0;
}
</style>

<a href="..." id="menu_accueil">
<span class="menu_icon"></span> Accueil</a>

Nombre de requêtes HTTP : cache

C'est un moyen simple de réduire le nombre de requêtes : permettre de mettre en cache sur le navigateur des resources, qui ne seront ainsi téléchargées que une seule fois !

Malheureusement sur le site des pages perso de Free il n'est pas possible d'utiliser les directives pour personnaliser le comportement du serveur... Aussi faut-il se contenter de la configuration par défaut, basée sur Etag et requêtes If-Modified-Since. En conséquent, si on gagne sur les données transférées, on a quand même toujours des requêtes http qui partent...

Le document d'absolu référence sur le sujet, qui vous fera tout comprendre du fonctionnement du cache sur HTTP, et vous permettra de décider quelle technique adopter pour vos besoins : Un tutoriel de la mise en cache pour les auteurs Web et les webmestres.


JavaScript

Chapitre à venir au prochain épisode ! :)


Pour aller plus loin...

Quelques sites pour en apprendre un peu plus :


Création le 13/08/2014
Dernière mise à jour le 29/08/2014

Un oubli, une erreur, une suggestion ? N'hésitez pas à me contacter sur pgoiffon -at- free.fr