5160 sujets

Le Bar du forum

Bonjour à tous,

Je me demandais si certains avaient une expérience des mécanismes de mise en production de code JavaScript et CSS.

On a longtemps considéré que, le JS et le CSS étant interprétés par le client (navigateur), le code développé était un code «final», et qu'il n'y avait donc pas de séparation entre code de développement et code de production. Cette approche montre des sites de faiblesse pour des projets moyens ou grands, car elle répond mal aux deux besoins suivants:
- optimiser les performances;
- faciliter la maintenance et les évolutions.

Le code optimal pour la maintenance, c'est un code qui est organisé dans des fichiers séparés. On peut déployer des trésors d'ingéniosité, mettre des maousse commentaires, dresser des tables des matières, utiliser du code folding... une feuille de styles de 3000 lignes reste assez difficile à exploiter! C'est aussi un code qui est un minimum documenté lors que nécessaire, par des commentaires par exemple. J'ai déjà écrit une feuille de styles de correctifs pour IE6-7 pour une application web, ça faisait 9 ko, dont 2 de code et 7 de commentaires.

À l'inverse, pour les performances il faut a) des fichiers sans commentaires, b) le moins de fichiers possibles (sauf utilité particulière à séparer certains styles, par exemple si on veut isoler les styles d'une partie du site qui n'est visionnée que par le quart des visiteurs).

Je parle surtout de CSS, mais pour JavaScript c'est globalement le même combat.

La solution, c'est de séparer le code de développement (optimisé pour la maintenance et les évolutions) et le code de production (optimisé pour les performances). Et d'automatiser le passage de l'un à l'autre (moyennant un peu de configuration).

Dans les solutions qui vont bien:
http://developer.yahoo.com/yui/compressor/
http://crisp.tweakblogs.net/blog/1665/a-new-javascript-minifier-jsmin+.html
http://code.google.com/p/minify/

J'aimerais savoir:
- si vous avez connaissance d'autres outils intéressants;
- si vous les utilisez régulièrement;
- qu'est-ce que ça implique en termes de workflow.

Question subsidiaire: si vous livrez une intégration (ou design + intégration) à un client mais n'hébergez pas ou ne déployez pas le site vous-même, est-ce que vous proposer une méthode pour l'optimisation, ou livrez un code optimisé «à la main» (concaténer les fichiers qui vont bien, utiliser JSMin ou YUI Compressor ou autre...) en plus du code de développement, ou laissez le client se débrouiller?

J'essaie de mettre sur pied un workflow «standard» pour O2Sources, mais ce n'est pas évident de s'y retrouver. Smiley sweatdrop
Depuis un certain temps j'utilise quasi systématiquement cet outil http://farhadi.ir/works/smartoptimizer (avec quelque modification du htaccess pour ne pas compresser les images) et je trouve que ça marche très bien.
Tu peux garder ton code css ou jss avec tout les commentaires que tu veux et quand tu le lis de ton navigateur celui ci est automatiquement minifier et gzipper.
Je n'ai pas testé SmartOptimizer. D'après ce que j'ai lu, il est assez proche de Minify! (ou inversement). Des outils intéressants pour des petits et moyens sites, par contre pour des sites plus importants il est dommage de se passer de fichiers «en dur» prêt à envoyer, avec un impact beaucoup plus faible sur le processeur du serveur. Même avec une mise en cache sur disque, le script est tout de même appelé et doit vérifier que les fichiers source n'ont pas été modifiés, que le cache existe ou non, et enfin envoyer le cache.

En passant, dans les outils existants il y a aussi CSSTidy, même si je trouve que l'intérêt de ce logiciel est faible du moment qu'on peut mettre en place une compression gzip (mod_deflate c'est bien).
Modifié par Florent V. (17 Apr 2009 - 17:28)
En tant que linuxien je pense que c'est le genre de choses qui pourrait tout à fait tenir dans une librairie. Malheureusement le web est beaucoup trop coupé du desktop et c'est bien dommage.

Édit: l'exemple de CSSTidy montre bien cela d'ailleurs, ils sont "obligés" de développer une version PHP et une version C++. C'est le genre de problème que l'on aurait pas si les développeurs web utilisaient Python.
Modifié par Changaco (17 Apr 2009 - 18:08)
Changaco a écrit :
Édit: l'exemple de CSSTidy montre bien cela d'ailleurs, ils sont "obligés" de développer une version PHP et une version C++. C'est le genre de problème que l'on aurait pas si les développeurs web utilisaient Python.

Ou s'ils n'utilisaient que C++ ou que PHP. Smiley lol
Florent V. a écrit :
Je n'ai pas testé SmartOptimizer. D'après ce que j'ai lu, il est assez proche de Minify! (ou inversement). Des outils intéressants pour des petits et moyens sites, par contre pour des sites plus importants il est dommage de se passer de fichiers «en dur» prêt à envoyer, avec un impact beaucoup plus faible sur le processeur du serveur. Même avec une mise en cache sur disque, le script est tout de même appelé et doit vérifier que les fichiers source n'ont pas été modifiés, que le cache existe ou non, et enfin envoyer le cache.


A mon avis même pour des gros sites c'est un méthode intéressante. En effet, une fois en cache, le script utilise très peu de fonctions (filesmtime, gmdatestr et 2/3 conditions) pour vérifier la mise en cache, j'ai fait un test et cela lui prend 1ms (moyenne de 10 tests sur un serveur moyenne qualité). Je pense que le gain reste significatif.

C'est sur que les gros sites sont plus gourmands, donc doivent être mieux optimisés, par contre souvent ils sont plus régulièrement mis à jours, et je trouve ça un peu long de devoir passer par un compresseur à chaque fois que je met un fichier sur le serveur.

L'idéal serait que la fonction soit intégrer dans le programme ftp! Avec détection automatique du type de fichier bien sur Smiley biggrin .
Modifié par matmat (17 Apr 2009 - 18:54)
Florent V. a écrit :
Ou s'ils n'utilisaient que C++ ou que PHP. Smiley lol
Tout à fait. Smiley lol
Mais s'ils font une version PHP c'est probablement parce que ça permet de toucher un public plus large ...
Administrateur
Le problème peut être décomposé en plusieurs points

- Manque de temps (for ever)
- Manque de connaissance du sujet : les webmasters/intégrateurs/développeurs n'y sont pas formés
- Manque de considération / d'accès au niveau du serveur : ils ne sont pas admin donc ne surveillent pas forcément les performances ou ne peuvent pas les quantifier/monitorer
- Manque de mise en pratique : pour un petit/moyen site on fait confiance à la croissance de la puissance des ordinateurs et des serveurs plutôt que d'effectuer des optimisations au niveau atomique

=> C'est un sujet qui doit encore faire l'objet d'analyses, de verdicts, et de bonnes pratiques, qui deviendront des procédures applicables

Pour la V3 (et Changaco doit aussi s'en souvenir) le sujet avait été un peu abordé (notamment pour le cache), mais là aussi nous avons choisi de ne pas nous concentrer sur des optimisations "au quart de pixel microsecondien près" car il y a toujours une mesure entre performances / maintenabilité / temps de développement = efficacité.

En général less is more.
Modifié par dew (18 Apr 2009 - 00:35)
Yep,

Mais j'ai vu pas mal de «petites» applications web (donc pas Google Docs ou Facebook) avec 8 feuilles de styles appelées, et 20 scripts appelés. Si si. Pour des choses de ce genre, avec une bonne stratégie développement/prod, on peut avoir:

- une quinzaine de fichiers CSS bien organisés de 500 lignes chacun grand max (entre 100 lignes et 300 lignes pour la plupart) côté dev;
- toujours côté dev, une vingtaine de scripts JS;
- côté production, 3-4 feuilles de styles max (si on gère plusieurs médias, mais ça peut tomber à 1-2);
- et 3-4 scripts JS (un global, et certains modules conservés à part peut-être).

Pour un site moyen, au lieu d'éditer une feuille de styles de 1500-2000 lignes (j'ai déjà fait, même bien organisé c'est pas évident), on peut avoir 5-6 fichiers séparés côté développement, ça facilite quand même grandement la maintenance. Derrière, il «suffit» de mettre en place SmartOptimizer ou Minify! (pour site PHP).

Une question en passant: est-ce que quelqu'un sait comment sont téléchargées les feuilles de styles print et handheld par les navigateurs? Par exemple, d'après Firebug, sur www.alsacreations.com les trois premiers téléchargements effectués sont:
- styles.css
- print.css
- handheld.css

La troisième est inutile (Firefox 3.0 sur un laptop), la deuxième ne sera utile que dans le cas où on lance une impression (rare).

Si au moins la feuille de styles print va être téléchargée de toute manière par le navigateur, on aura alors peut-être intérêt à l'inclure dans la feuille de styles globale, avec un @media print {... mes styles ...}.
En parlant de requêtes je me demande quelles seraient les performances sur XMPP en faisant tout passer par la même fenêtre TCP.
Changaco a écrit :
En parlant de requêtes je me demande quelles seraient les performances sur XMPP en faisant tout passer par la même fenêtre TCP.

Heu... c'est un peu hors-sujet, là. Smiley cligne
Administrateur
Florent V. a écrit :
Si au moins la feuille de styles print va être téléchargée de toute manière par le navigateur, on aura alors peut-être intérêt à l'inclure dans la feuille de styles globale, avec un @media print {... mes styles ...}.


On a déjà essayé cette technique pour le media handheld mais il s'est avéré que c'était mal supporté globalement (par exemple sur un blackberry qui n'appliquait pas la directive). Donc là aussi un compromis a été fait.
Petit test de performance, attention le premier click est le bon!
Il y a 130k de script :
Gzipper avec smartyoptimizer : http://www.mozaik.com.mx/optimize/
Minifier : http://www.mozaik.com.mx/optimize2/
Pas minifier : http://www.mozaik.com.mx/optimize3/

Il manque le test avec un fichier gzipper servit directement qui serait sans doute le grand gagnant, mais on vois quand même qu' avec smartyoptimizer on obtient de très bon résultat, et cela tout en travaillant sur ces script sans se préoccuper ni des commentaires ni d'une optimization "manuelle" avec un autre programme.
Plop,

Etant tombé dans ces questions d'optimisations depuis quelques temps, je peux apporter un petit retour d'expérience. Pour les sites que je développe, j'ai souvent des dizaines de fichiers css et javascript, organisés dans différents dossier et abondamment commentés pour pouvoir m'y retrouver très facilement.

Comme j'utilise cakePHP (mais cela doit facilement se faire avec n'importe quel autre système), et grâce à l'utilisation de ses helpers je concatene et compresse tout ça avec CSSTidy et JSMin (qui ont tout les deux des versions PHP) avant de le ressortir pour mon user final. Je ne regenere de nouvelles versions que si les sources ont été modifiées depuis la dernière fois, chaque fichier ainsi généré est stocké sur le serveur avec un nom (md5 de la concatenation des sources) et un timestamp pour me permettre de checker très facilement si je dois le regen ou non, et surtout comme le nom change, je n'ai pas de problème de cache qui ne se mettrait pas à jour.

Pour ce qui concerne la feuille de style print, j'ai bien l'impression que sous FF toutes les feuilles de styles de tous medias sont chargées à chaque fois. Je n'ai pas testé sur les autres navigateurs, mais ca mérite inspection.
Hello,

Merci pour vos avis et retours d'expérience.

De mon côté, sur covertprestige.info je me suis amusé à mettre en place Minify!, mais d'une manière un peu spéciale: plutôt que d'utiliser Minify! gérer les appels aux styles ou scripts, je configure des groupes de fichiers à concaténer/minifier, et ensuite je fais un wget de l'URL qui va bien pour récupérer le contenu concaténé/minifié et l'écrire comme fichier statique.

Du coup j'ai un petit script shell qui donne:
#!/bin/sh

wget  http://example.com/min/?g=nom-du-groupe  -O public/css/global.css

S'il y a plusieurs groupes de fichiers CSS/JS à concaténer, je configure plusieurs groupes dans le fichier de configuration de Minify! (groupsConfig.php), et je rajoute une ligne au script shell, par exemple:
#!/bin/sh

# Minified CSS
wget  http://example.com/min/?g=css-global  -O public/css/global.css
wget  http://example.com/min/?g=css-admin  -O public/css/admin.css

# Minified JavaScript
wget  http://example.com/min/?g=js-global  -O public/js/global.js
wget  http://example.com/min/?g=js-admin  -O public/js/admin.js
wget  http://example.com/min/?g=js-home  -O public/js/home.js
(Exemple fictif)
Modifié par Florent V. (27 Apr 2009 - 19:41)