Wednesday, 7 April 2010

Minimiser ses fichiers CSS et JS, quelles solutions ?

Bonjour à tous ! 

Je profite d'un article de Prélude sur l'optimisation par compression ou par minimisation pour présenter les différents moyens existants pour minimiser (ou minifier en mauvais français) les fichiers CSS et JS de votre site. 

Performances des pages web

Mais déjà, pourquoi faudrait-il minimiser vos fichiers ? Au débuts de l'Internet, on avait des débits ridicules, et il fallait donc réduire au maximum le poids de nos pages. Et puis, l'ADSL est arrivé et on a petit à petit oublié les limitations liées au débit. Ce fut une erreur, parce que les internautes détestent attendre. Aujourd'hui, on entend dire que Google va prendre en compte le temps de chargement des pages pour ses algorithmes de recherche. C'est une bonne chose, car cela ramène la question de la vitesse de chargement sur le devant de la scène du développement web. 

Vous trouverez déjà beaucoup d'articles sur le web qui parlent de performance. Il y a des sites entièrement dédiés à ce pan du développement, et Google saura vous les indiquer. Je ne vais donc pas répéter ce que d'autres expliquent mieux que moi, mais je vais vous présenter une façon d'améliorer ses performances que j'apprécie. 

Compression à la volée

Si vous suivez mon blog et mes projets, vous avez vu mon plugin Minifier pour Atomik Framework. Ce plugin permet de minimiser ses fichiers CSS au moment où ils sont demandés par l'internaute. Plusieurs intérêts à ça : réduire le nombre de requêtes HTTP, réduire la taille des fichiers CSS. Au final, l'utilisateur télécharge beaucoup moins de données inutiles, pour le même résultat affiché. 

J'avais découvert cette technique sur le blog de LateralCode (Stunningly Simple CSS Minifier), et j'ai vite accroché. Je ne suis pas fan de la minimisation avant l'envoi des fichiers sur le serveur, parce que ça oblige à avoir deux versions du code (une normale, une réduite), et surtout, ça oblige à re-minimiser les fichiers à chaque changement. Comme tout développeur, je suis faignant, donc ça ne me convient pas. 

La technique proposée par LateralCode consiste donc en une compression via un script PHP, donc directement sur le serveur. On spécifie les fichiers CSS à charger, le script PHP les ouvre, les compresse et les concatène, puis renvoie le résultat. C'est ce que j'ai fait avec Minifier, en ajoutant une fonctionnalité de mise en cache. 

Mise en pratique

Prenons un exemple pratique pour bien voir tout l'intérêt de ce système : j'ai un site avec trois pages. Sur chaque page, j'ai trois fichiers CSS communs : reset.css (un système de reset CSS comme celui d'Eric Meyer), global.css (qui définit des attributs sur mes éléments HTML, comme img { border: none; }) et main.css (qui définit le design général des pages). Ensuite, sur chaque page je charge un fichier particulier, correspondant au nom de la page, qui définit le style des éléments spécifiques à cette page. J'ai donc, sur chaque page, au moins 4 fichiers CSS différents. Ceci me permet d'avoir des fichiers proprement séparés, un code CSS réparti et donc mieux organisé, etc. Seulement, au niveau des performances, c'est pas le top, car 4 requêtes HTTP sont nécessaires pour charger le CSS de la page. 

L'utilisation du plugin Minifier, ou de tout autre système similaire, permet de faire ceci : 

  • génération du nom du fichier cache correspondant aux fichiers CSS demandés
  • si le fichier cache existe, et que les fichiers CSS sont moins récents que le fichier cache, on renvoi directement le fichier cache
  • sinon, compression de chaque fichier séparément (retrait des espaces, des retours à la ligne, des commentaires... )
  • concaténation des fichiers
  • enregistrement du résultat dans un fichier cache
  • renvoi du fichier cache

Au final, on aura donc sur notre serveur des fichiers toujours aussi propres, et on aura en cache un fichier CSS compressé par page. Les internautes ne reçoivent donc qu'un fichier compressé correspondant au code de la page visitée. 

Problématiques

Les systèmes de compression à la volée existent depuis quelques temps, mais je ne crois pas qu'ils soient très connus. L'inconvénient majeur, c'est le temps de compression et de mise en cache nécessaire quand on change un des fichiers. Cependant, la mise en cache permet de diminuer très fortement l'impact de ce comportement. Et puis, quand vous faites un changement sur votre site, vous vérifiez bien toutes les pages, non ? ;-)

Il y a cependant un gros reproche fait à la compression des fichiers en général : ça casse une des bases du web, le fait qu'il soit ouvert. Ainsi, on ne pourra que difficilement reprendre le code CSS d'un site qui compresse, et c'est donc un frein à l'innovation. Faut-il donc perdre en ouverture et en respect du web pour gagner en performance ? 

Je propose une solution simple pour répondre à cette problématique, mais qui ne marche que dans le cadre du système que je viens de présenter. Il suffit, au moment de la concaténation des fichiers compressés, d'ajouter un commentaire contenant des liens absolus vers les fichiers originaux. Ainsi, l'internaute qui s'intéresse à notre code pourra accéder aux fichiers CSS originaux, et récupérer, analyser, comprendre ce code. Les performances sont là (au dur prix de trois ou quatre lignes de commentaire), et le web est sauvé. 

J'envisage d'implémenter ceci dans la prochaine version de Minifier. Que pensez-vous de cette solution ? Avez-vous d'autres idées pour résoudre ce problème ?

Minifiers

Bon, je suis bien d'accord, mon plugin Minifier est absolument génial (lol), mais il n'est disponible que pour Atomik Framework. Sachez donc qu'il existe d'autres projets permettant de mettre en place le même genre de comportement sur votre site. Certains sont plus simples, d'autres bien plus complets. Je ne sais pas si ils fonctionnent exactement comme Minifier, je vous invite donc à les étudier avant de les implémenter.

Voici donc une liste de projets de minimisation de vos fichiers CSS ou JS à la volée : 

Je me rend compte que je n'en connais pas beaucoup, donc si vous en avez d'autres, faites m'en part en commentaire ! :)

N'hésitez pas non plus à troller intelligemment sur les avantages et les inconvénients de la compression des fichiers CSS et JS, ainsi que sur les différentes méthodes disponibles. 

Belle fin de journée à tous ! 

Crédits : Photo "Astronomical Clock" par simpologist

Friday, 8 January 2010

Mise à jour de Minifier, le plugin qui compresse vos fichiers CSS

Bien le bonjour ! 

Souvenez-vous, il y a quelques temps, je vous présentais Minifier, un plugin pour Atomik Framework qui compresse vos fichiers CSS directement sur votre serveur. Plusieurs avantages à cela : 

  • une seule requête HTTP sur chaque page, quel que soit le nombre de vos fichiers CSS
  • suppression des espaces superflus et des commentaires, donc des fichiers plus légers
  • moins de bande passante utilisée
  • une mise en cache des fichiers compressés, donc pas d'utilisation inutile des ressources

Seul "inconvénient", les utilisateurs reçoivent un fichier compressé et donc relativement illisible. Mais honnêtement, dans le cadre d'un site de taille respective, est-ce vraiment un problème ?

Petit rappel pour les gens qui découvrent : ce plugin s'utilise uniquement avec Atomik Framework, un framework PHP5 léger, gratuit, open source, et que j'apprécie beaucoup. 

Bien. Il se trouve que la première version de plugin ne marchait pas bien du tout, parce que j'utilisais des liens pour régler le problème des urls relatives des fichiers CSS. En gros, je créais dans le dossier assets/css/ un lien vers le fichier compressé, ainsi les url étaient prises en compte depuis le dossier assets/css/ et non depuis le dossier de cache. Mais faire des liens en PHP, c'est pas beau, et surtout ça ne marche que très peu sur les serveurs ! A côté de ça, j'avais aussi quelques problèmes au niveau de la manipulation des adresses des fichiers. 

Ce matin, j'ai eu une illumination en repensant à ces problèmes, et j'ai donc pu facilement résoudre le premier : il suffisait tout simplement de mettre les fichiers compressés dans un dossier situé au même niveau que le dossier contenant les CSS ! Par exemple, dans un dossier assets/css_cache/ ! J'ai donc fait ça, et j'en ai profité pour corriger les problèmes d'adresses et pour ajouter quelques fonctionnalités. Vous avez désormais trop moyens d'ajouter le <link>, comme décrit sur la page officielle du plugin. De plus, j'ai ajouté deux clés de configuration : 'cache/dir' contient l'adresse du dossier contenant les fichiers cachés (par défaut, assets/css_cache/), et 'force_css_link' qui force l'affichage de la balise <link> complète plutôt que le retour de l'url du fichier compressé. Des exemples d'utilisation sont disponibles sur la documentation de Minifier

J'espère que les utilisateurs d'Atomik Framework prendront plaisir à utilliser Minifier, et qu'il leur sera utile pour améliorer les performances de leurs sites ! 

Si vous avez des remarques ou des questions, n'hésitez pas à vous exprimer en commentaire ou en m'envoyant un mail

Quelques liens pour finir : 

Bonne journée !

Tuesday, 17 November 2009

Programmateur : les tweets de la semaine, du 8 au 14 novembre 2009

Salut à tous ! 

Bienvenue dans notre rendez-vous hebdomadaire : les tweets de la semaine de @programmateur ! Aujourd'hui, je vous la fait sans image (c'est long de faire tous les screens à la main, et en ce moment j'ai vraiment pas le temps). La forme est encore à bien définir, et j'aimerais d'ailleurs vos avis à ce propos : préférez-vous des liens avec images, comme les deux billets précédents, ou bien une liste (un peu à l'image des bons plans de la semaine d'Amicalement Web) ? Merci de me faire part de vos réponses en commentaires ! :)

Dimanche 8 Novembre 2009

Nice Quickie CSS3 Tricks with Fallbacks #css #css3 (via @smashingmag) - http://bit.ly/Slx0m Le 08/11/2009 à 15:00:00 par @formeolibre

Lundi 9 Novembre 2009

Synthèse du barcamp PHP Toulousain - http://bit.ly/3eCuiG Le 09/11/2009 à 10:00:00 par @methylbro

[en] Du cache en PHP avec Memcache - http://bit.ly/4ftHHI Le 09/11/2009 à 18:00:00 par @adriangaudebert

Mardi 10 Novembre 2009

[en] 3 new and amazing CSS tricks every web designer must know - http://bit.ly/32KA00 Le 10/11/2009 à 10:00:00 par @adriangaudebert

UwAmp : Nouveau serveur Apache MySQL PHP - http://bit.ly/3c7VFP Le 10/11/2009 à 18:00:00 par @methylbro

Mercredi 11 Novembre 2009

[fr] Ruby & Ruby on Rails VS PHP & Symfony - http://bit.ly/4ESl5t Le 11/11/2009 à 10:00:00 par @adriangaudebert

[en] Build a Simple Password Strength Checker - http://bit.ly/2ATkVP Le 11/11/2009 à 18:00:00 par @adriangaudebert

Jeudi 12 Novembre 2009

[fr] Krumo, une amélioration de print_r et var_dump en PHP - http://bit.ly/2zDF9o Le 12/11/2009 à 10:00:00 par @adriangaudebert

[en] 7 Things I Wish I Had Know About jQuery - http://bit.ly/1umXT6 Le 12/11/2009 à 18:00:00 par @adriangaudebert

Vendredi 13 Novembre 2009

[en] 10 Tips for Writing Better CSS - http://bit.ly/3VWIsM Le 13/11/2009 à 10:00:00 par @adriangaudebert

[fr] Une cheat sheet pour jQuery - http://bit.ly/4dy6yh Le 13/11/2009 à 18:00:00 par @adriangaudebert

Samedi 14 Novembre 2009

[en] Optimizing a php application in 5 minutes - http://bit.ly/1W8xq Hier à 15:00 par @adriangaudebert

A suivre... 

Si cette actualité vous a intéressé, n'hésitez pas à suivre @programmateur sur Twitter ! Et si vous estimez qu'une information devrait apparaitre sur @programmateur, proposez-la en utilisant l'interface du site ou en ajoutant #pgmt à votre tweet. 

Passez une bonne journée ! ;)

Tuesday, 10 November 2009

Programmateur : les tweets de la semaine, du 25 octobre au 7 novembre 2009

Salut à tous ! 

Un peu en retard cette semaine, voici le deuxième billet récapitulatif de l'actualité publiée sur @programmateur, le compte Twitter participatif sur le thème de la programmation. Chaque jour, des liens intéressants sont proposés par des utilisateurs de Twitter, soit en utilisant l'interface du site, soit en ajoutant le hashtag #pgmt aux tweets. Et chaque jour, je modère et publie les liens les plus pertinents, afin que vous les découvriez. 

Aujourd'hui, je vous livre les tweets des deux dernières semaines, j'ai raté le coche le weekend dernier pour cause de travail. Et puis aussi parce qu'il faut croire que je suis pas fait pour la régularité... Bref, du coup vous avez une double portion ! Profitez-en ! :D

Dimanche 25 Octobre 2009

[en] 10 ressources jQuery pour améliorer vos sites - http://bit.ly/2CmTVx Le 25/10/2009 à 15:00:00 par @adriangaudebert

Lundi 26 Octobre 2009

[fr] Floom, un slideshow Mootools de toute beauté - http://bit.ly/11l6eE Le 26/10/2009 à 10:00:00 par @adriangaudebert

Galerie DHTML - http://bit.ly/1gVCQT Le 26/10/2009 à 18:00:00 par @jordanevaspard

Mardi 27 Octobre 2009

Étude de cas PHP & MySQL : Connaître le nombre d’occurrences dans une table - http://bit.ly/1NeUnN Le 27/10/2009 à 10:00:00 par @methylbro

[en] Un site web de A à Z - http://bit.ly/4aHFc5 Le 27/10/2009 à 18:00:00 par @jordanevaspard

Mercredi 28 Octobre 2009

Nouvelle ressource pour développeurs (english only comme tout ce qui est de bon niveau) http://tekpub.com/  Le 28/10/2009 à 10:00:00 par @labilbe

[fr] HTML5 et le futur du Web, par Tim Wright - http://bit.ly/qTuBK Le 28/10/2009 à 18:00:00 par @adriangaudebert

Jeudi 29 Octobre  2009

[en] Autoload your PHP classes - http://bit.ly/3eKOdN Le 29/10/2009 à 10:00:00 par @adriangaudebert

Vérification d’adresse email en PHP - http://bit.ly/1o3G47 Le 29/10/2009 à 18:00:00 par @devzonefr

Vendredi 30 Octobre 2009

Tutoriel intéressant pour #debutant #php - http://bit.ly/4xf8Gg Le 30/10/2009 à 10:00:00 par @rkueny

[en] Menu, layouts et boxes uniquement en CSS. - http://bit.ly/3DTMRU Le 30/10/2009 à 18:00:00 par @jordanevaspard

Samedi 31 Octobre 2009

[fr] Mozilla Raindrop, it's raining mails ! - http://bit.ly/1Uz0Sr Le 31/10/2009 à 15:00:00 par @adriangaudebert

Dimanche 1 Novembre 2009

[fr] UserCake, espace membre Open Source en PHP - http://bit.ly/3YZDC1 Le 01/11/2009 à 15:00:00 par @adriangaudebert

Lundi 2 Novembre 2009

[fr] Chargement automatique de classes avancé avec PHP 5 - http://bit.ly/J8dVB Le 02/11/2009 à 10:00:00 par @adriangaudebert

[fr] Javascript, retour sur le serveur - http://bit.ly/2Fqoy6 Le 02/11/2009 à 18:00:00 par @adriangaudebert

Mardi 3 Novembre 2009

[en] Initiation à Git - http://bit.ly/Tv6QA Le 03/11/2009 à 10:00:00 par @adriangaudebert

[fr] Quel langage pour bidouiller le web ? - http://bit.ly/1k0fi2 Le 03/11/2009 à 18:00:00 par @adriangaudebert

Mercredi 4 Novembre 2009

Une base de données de fonctions php http://phpfonctions.frLe 04/11/2009 à 10:00:00 par @shackdown

Concours : Gagnez le livre PHP5 Avancé ! - http://bit.ly/3OwlyJ Le 04/11/2009 à 18:00:00 par @methylbro

Jeudi 5 Novembre 2009

Plugin jQuery : QueryLoader, précharger vos pages web - http://bit.ly/J332w Le 05/11/2009 à 10:00:00 par @devzonefr

Cheat Sheets des principaux protocoles :) http://bit.ly/79aSa  Le 05/11/2009 à 18:00:00 par @martiusweb

Vendredi 6 Novembre 2009

[en] Usability tips for visualizing Ajax requests - http://bit.ly/42IH6v Le 06/11/2009 à 10:00:00 par @adriangaudebert

[en] Migrer de MySQL vers CouchDB - http://bit.ly/3AM2Ta Le 06/11/2009 à 18:00:00 par @adriangaudebert

Samedi 7 Novembre 2009

[en] jQuery and General Javascript Tips to Improve Your Code - http://bit.ly/12OZso Hier à 15:00 par @adriangaudebert

A suivre... 

Si cette actualité vous a intéressé, n'hésitez pas à suivre @programmateur sur Twitter ! Et si vous estimez qu'une information devrait apparaitre sur @programmateur, proposez-la en utilisant l'interface du site ou en ajoutant #pgmt à votre tweet. 

Bonne journée à tous !

Sunday, 25 October 2009

Programmateur : les tweets de la semaine, du 18 au 24 octobre 2009

Bonjour à tous ! 

Voici le premier billet récapitulatif de l'actualité publiée sur @programmateur, le compte Twitter participatif sur le thème de la programmation. Chaque jour, des liens intéressants sont proposés par des utilisateurs de Twitter, soit en utilisant l'interface du site, soit en ajoutant le hashtag #pgmt aux tweets. Et chaque jour, je modère et publie les liens les plus pertinents, afin que vous les découvriez. 

Si vous n'avez pas de compte Twitter, que vous ne suivez pas (encore ^^) @programmateur ou que vous en avez raté des bouts, voici une piqure de rappel ! 

Dimanche 18 octobre 2009

[en] Top 20 Ways for Web Developers to Reduce Their Carbon Footprint - http://bit.ly/2AkVy1 Le 18/10/2009 à 14:00:00 par @adriangaudebert

Lundi 19 octobre 2009

[fr] Spree, solution e-commerce open source pour Ruby on Rails - http://bit.ly/1mu2rG Le 19/10/2009 à 10:00:00 par @adriangaudebert

Astuce #css pour afficher des icônes en fonction de vos liens - http://bit.ly/M15FO Le 19/10/2009 à 15:00:00 par @adriangaudebert

[fr] Ajax Queue avec jQuery - http://bit.ly/2pM57Z Le 19/10/2009 à 18:00:00 par @AnthorNet

Mardi 20 octobre 2009

PHP 5.3 : Résolution statique à la volée - Late Static Bindings - http://bit.ly/ljnON Le 20/10/2009 à 10:00:00 par @methylbro

[en] Creating a Crypter Class with PHP - http://bit.ly/BZ3Xv Le 20/10/2009 à 18:00:00 par @adriangaudebert

Mercredi 21 octobre 2009

[en] Browser support for HTML5 and CSS3 - http://bit.ly/2Xgnjj Le 21/10/2009 à 10:00:00 par @adriangaudebert

Drag to Share with jQuery UI - http://bit.ly/3IZjJv Le 21/10/2009 à 18:00:00 par @adriangaudebert

Jeudi 22 octobre 2009

Étude de cas : Stocker une date dans le système de fichiers en PHP - http://bit.ly/1uE0D1 Le 22/10/2009 à 10:00:00 par @methylbro

[en] Quelques bouts de code PHP utiles - http://bit.ly/2GyTID Le 22/10/2009 à 18:00:00 par @adriangaudebert

Vendredi 23 octobre 2009

[en] Avez-vous testé Rebol 3 ? - http://bit.ly/6PL4R Le 23/10/2009 à 10:00:00 par @iPoulet

[en] 8 façons d'afficher vos listes en #HTML et #CSS (avec des morceaux de #CSS3 dedans) - http://bit.ly/3TI46y Le 23/10/2009 à 18:00:00 par @adriangaudebert

Samedi 24 octobre 2009

[en] 5 règles pour écrire du CSS plus propre - http://bit.ly/SdFvd Le 24/10/2009 à 15:00 par @adriangaudebert

A suivre... 

Si cette actualité vous a intéressé, n'hésitez pas à suivre @programmateur sur Twitter ! Et si vous estimez qu'une information devrait apparaitre sur @programmateur, proposez-la en utilisant l'interface du site ou en ajoutant #pgmt à votre tweet. 

Bonne fin de weekend !

Saturday, 17 October 2009

[CSS] Astuce : ajouter des icônes à certains de vos liens

Salut la compagnie !

Aujourd'hui, une petite astuce CSS pour ajouter des icônes en fonction de vos liens. Par exemple, comme sur Wikipedia , on afficherait une icône comme celle-ci sur un lien externe. Mais on peut aussi mettre des icônes particulières en fonction du type du document lié. Par exemple, j'ai un lien qui pointe vers un document .pdf, et je veux le signaler à mes lecteurs,  comme ceci.

Le code CSS3 suivant vous permet d'arriver très simplement à vos fins :

a[href$=".pdf"]:before {
    content: url('images/doc_pdf.png');
    padding-right: 4px;
}

Le sélecteur CSS [href$=".pdf"] signifie que l'attribut "href" se termine par ".pdf".

Pour un ajout d'une icône sur tous vos liens externes, on suppose que ces liens commencent toujours par http://, on utilise donc le CSS suivant :

a[href^="http://"]:after {
    content: url('images/external.gif');
    padding-left: 4px;
}

Dans ce cas, on demande tous les liens dont l'attribut href commence par la chaine "http://".

Attention, ceci ne marche qu'avec CSS3, donc avec un navigateur récent (Firefox 3.5, Chromium, IE7+, et je suppose les dernières versions de Safari et Opera).

J'en profite pour faire un petit récap' des sélecteurs disponibles en CSS2 et 3. Avec la version 2, vous ne pouvez utiliser que =, ~= et |=. Avec CSS3, vous pouvez aller plus loin avec ^=, $= et *=. Je vous invite à lire les docs qui sont on ne peut plus claires sur l'utilisation de ces sélecteurs :

Pour aller plus loin...

Si vous souhaitez faire en sorte que votre code soit universellement fonctionnel (donc aussi sur IE6), le plus simple reste d'ajouter une classe à vos liens, par exemple external pour les liens externes, docpdf pour les documents pdf, etc. Mais c'est long et fastidieux, il faut reprendre tous vos liens, un travail que tout bon informaticien se refuse normalement de faire ! ;)

Et pour finir, l'article de Romy qui m'a inspiré : Signaler les liens externes par un picto

Note : J'utilise des icônes issues du pack par ted24.