Jusqu'à maintenant dans mon travail, j'ai optimisé les sites web en utilisant les suggestions provenant soit de l'extension YSlow de Yahoo!, soit de Page Speed de Google (soit dit en passant, les deux sont excellents pour l'apprentissage de bonnes pratiques). Compresser les librairies JavaScript et CSS (avec YUI Compressor), compression HTTP avec gzip, minimiser le nombre de requêtes HTTP et utiliser le cache ne sont que quelques exemples qui permettent d'accélérer le chargement des pages.
En toute honnêteté, le score maximum (depuis que je l'utilise) que j'ai obtenu dans l'analyse Page Speed sur la page principale d'un de mes projets avancés a été de 88/100. Impossible d'atteindre la perfection malgré tout le fine tuning.
Un des points proposés par PageSpeed est d'utiliser l'attribut defer dans la balise script des librairies JavaScript attachées à la page. Ceci permet d'indiquer au fureteur qu'il peut choisir de ne pas attendre que le code JavaScript soit fini d'être interprété pour poursuivre le chargement de la page, ce qui accélère l'affichage du contenu HTML. Bien entendu, il faut que le script ne crée aucun contenu, par exemple aucune instruction document.write().
Je n'avais pas l'habitude d'utiliser defer car seul Internet Explorer le supportait (depuis la version 4). Mais plus récemment, Firefox 3.5 et les versions suivantes tiennent compte de l'attribut defer. Sans surprise, des statistiques que j'ai consulté montrent que le pourcentage des développeurs qui utilisent defer est encore assez faible.
Faisons un essai avec le snippet HTML suivant :
<div id="myDiv"></div>Et un peu de JavaScript (avec jQuery) :
<button type="button" id="btn">OK</button>
<script type="text/javascript" src="js/jquery-1.4.min.js"></script>
<script type="text/javascript">
$j = jQuery.noConflict();
$j(document).ready(initialize);
function initialize(){
$j('#myDiv').html('Hello World');
$j('#btn').click( function(){ alert('Click'); } );
}
</script>
- Si je place un attribut defer="defer" sur le chargement de la librairie, la console Firebug de Firefox me lance l'erreur : jQuery is not defined. C'est normal, elle devrait être chargée à la fin, après le bloc de code JavaScript.
- Si j'ajoute defer="defer" au bloc de code, je n'ai pas plus de succès, la même erreur se produit.
- Si je retire defer du chargement de la libraire, tout se passe bien.
<script type="text/javascript" src="js/code-de-la-page.js" defer="defer"></script>De cette façon, on peut reporter l'interprétation de plusieurs scripts dépendants sans rencontrer de conflit. Mais le gain demeure assez peu significatif.
Je ne sais pas comment tu te débrouilles, je suis parti de 87/100 et j'ai fait 100/100 après quelques heures d'utilisation et de recherches et même avec un Wordpress je fais 97/100 !
Et non, PageSpeed ne dit pas d'utiliser defer, ils recommandent de différer le chargement de Javascript or il y a 2 autres méthodes pour ça !
N'oublie pas que le billet date de 2010 alors qu'on en était encore à Firefox 3.6. Il y a possiblement bien des choses qui ont changé pour en arriver à la version 10.
Justement, à l'époque il y avait bien moins de règles à PageSpeed donc faire un bon score était beaucoup plus simple, les algorithmes se sont bien complexifiés depuis... Et strictement aucun rapport avec Firefox (ou Chrome ou n'importe quel autre navigateur d'ailleurs).
Je viens de tester à nouveau quelques sites avec FF10 et PageSpeed pour voir quel score j'obtiens.
Un site compliqué come www.cyberpresse.ca obtient 87/100 avec 2 critères en rouge (Leverage browser caching + Combine images into CSS sprites) et 2 en jaune (Optimize images + Minimize redirects). Yahoo.ca fait 86%.
De notre côté, notre WordPress le plus simple obtient 85/100 avant optimisation et le seul défaut trouvé est Leverage browser caching. Même constat du côté d'un site normal, ce même défaut unique fait chuter la note à 87%. Pire, si je refresh quelques fois, la note varie d'un ou deux points en plus ou en moins.
Malgré sa simplicité, la page principale de google.ca fait 98% et la page d'accueil de Facebook fait 99% (dès qu'on entre, ça rebombe à 92%).
Si tu sais comment obtenir le score parfait avec des sites complexes, n'hésite pas à partager tes trucs avec nous, c'est l'endroit idéal pour ça :)
Il y a aussi ce code qui donne de très bon résultats proche des 100% :
< script type="text/javascript" src="/monjava.js" defer async>
Cependant, le code est tellement "déféré" qu'il ne fonctionne plus du tout !