Ajax est déjà obsolète
Par Laurentj le jeudi, septembre 29 2005, 22:54 - Technologies Web - Lien permanent
À coté du buzz web 2.0 qui ne veut rien dire et ne sert à rien sinon à vendre du vent, il y a le buzz Ajax qui lui est un peu plus concret. Il fait fureur en ce moment, tout le monde veut faire de l'Ajax, et tout le monde trouve cette technologie révolutionnaire, malgré qu'elle soit vieille de plusieurs années. Mais personnellement, je trouve que cela ne va pas vraiment dans le bon sens, et qu'il serait préférable de s'orienter vers d'autres techniques plus efficace et simple pour avoir du contenu dynamique.
Qu'est que Ajax ?
Au départ, Ajax, pour Asynchronous JavaScript and XML désigne une technique qui est d'utiliser l'objet xmlhttprequest en javascript pour récupérer des données à partir d'un serveur web, puis de modifier le document courant en fonction de ces données, au moyen de l'api DOM xml. Rien de bien extraordinaire, au niveau du concept d'abord, puisqu'il s'agit d'utiliser ce qu'on appelle depuis quelques années les services web (que certains d'ailleurs ont renommé sous le nom ridicule de "Web 2.0 API", histoire de faire croire qu'ils font quelques choses de nouveau). Et ensuite au niveau des technologies puisque javascript, xmlhttprequest et DOM existent depuis des années déjà.
Cependant, avec la mode ajax, chez beaucoup de développeur, ce terme regroupe maintenant tout et n'importe quoi, à tel point que dés que l'on fait du drag and drop, ou que l'on fait du DOM, beaucoup croient qu'ils font de l'Ajax. (Pour ceux qui n'aurait pas compris : on fait de l'ajax quand on utilise xmlhttprequest, point barre).
C'est tout de même sympathique Ajax : modifier une partie d'une page sans tout recharger, meilleure expérience utilisateur etc. Il est vrai que du point de vue de l'internaute, c'est agréable. Il semble légitime alors que beaucoup de développeurs web s'extasient devant la magie d'Ajax (Et un certain illustre Gerard M. n'y est pour rien). Mais malheureusement, très peu s'interrogent sur les limites de cette technique, qui sont pourtant flagrantes et vite atteintes selon moi.
En effet, si on plonge dans le code javascript d'une page qui fait de l'ajax, on peut remarquer la chose suivante : c'est d'une complexité hallucinante par rapport à ce qui pourrait se faire. À moins d'être un développeur confirmé, c'est un parcours du combattant pour comprendre, analyser, modifier et maintenir le code. Du fait d'abord des différentes implémentations selon les navigateurs, mais aussi parce qu'il faut tout gérer : de la transaction HTTP avec le serveur (géstion du code retour, lecture du résultat), à la manipulation DOM (à moins d'utiliser le fameux innerHtml bien cra cra, mais pas toujours utilisable suivant les données que l'on récupère). Le debuggage, la maintenance, les temps de développements s'en trouve alors nettement alourdi et obscurci. Il est vraiment loin le temps des pages HTML simples.
Bien sûr, une alternative serait d'utiliser une de ces bibliothèques javascript toutes faîtes qui commencent à apparaître. Mais on se retrouve
- avec une nouvelle API à apprendre.
- avec des fonctionnalités qui ne sont pas forcément adapté à la prise en charge de service web existants.
- avec des pages bien alourdies de scripts dans tous les sens.
Bref, je trouve que cette technique laisse vraiment à désirer en terme de productivité et d'efficacité, et qu'il faudrait orienter les évolutions du web, non pas vers xmlhttprequest + DOM, mais vers d'autres concepts plus simple à utiliser dérivant de ceux que l'on trouve déjà dans... HTML !
Quand le html fait de l'ajax sans que vous le sachiez
La balise <a> en HTML par exemple. Pour comprendre, voyons comment elle fonctionne en gros :
- l'utilisateur clique sur la balise (ou l'active par un autre moyen)
- un événement DOM est envoyé sur la balise pour l'avertir de l'action
- sur l'arrivée de cet événement, la balise
<a>a un comportement par défaut, définit par le navigateur, qui est :- récupération de l'url située dans l'attribut href
- instanciation et utilisation d'un objet similaire à xmlhttprequest pour appeler le serveur web
- récupération du contenu
- remplacement du document courant par le contenu reçu
Ça ne vous rappelle rien ? À part le dernière étape qui est légèrement différente (seule une partie du document est complété ou remplacé), c'est ce qu'on fait en Ajax. Sauf qu'en Ajax, on s'embête à faire tout ça à la main, avec tous les risques de bugs que cela comporte.
Parce que c'est le navigateur qui fait tout avec cette balise de lien, on remarque donc qu'ici :
- c'est très simple à utiliser (mettre la balise et les attributs adéquates)
- c'est donc très rapide à développer avec une minimisation du risque de bug.
- ne nécessite pas 80ko de scripts additionnels.
En un mot : efficace. Ce que n'est pas Ajax.
L'idée serait donc de masquer toute la cuisine Ajax et ses 150 ko de javascript (oui, il y a inflation depuis 2 lignes, avec tout ce que mettent certains dans le sac Ajax..) et d'étendre le concept simple des balises <a> et <form> du HTML.
Des nouvelles balises magiques
Imaginons que le service web http://monsite.com/serviceweb/listeanimaux nous permette de récupérer une liste d'animaux, et renvoi donc par exemple ceci :
<animaux> <animal nom="girafe" /> <animal nom="éléphant" /> <animal nom="lion" /> </animaux>
Imaginons ensuite que l'on ait une balise <template>, que l'on pourrait utiliser comme cela :
<ul>
<template id="mylist" datasource="http://monsite.com/serviceweb/listeanimaux" format="XML" ref="animaux/animal">
<li><content value="@nom"/></li>
</template>
</ul>
Le navigateur, voyant la balise <template>, récupérerait le contenu situé à l'adresse indiquée dans l'attribut datasource, bouclerait sur chaque élément correspondant au chemin (au format xpath) indiqué dans ref, et pour chaque élément, générerait une balise <li> ayant pour contenu la valeur de l'attribut nom.
Vous voila donc avec du contenu généré automatiquement, à partir d'une source de donnée distante, sans une seule ligne javascript. Vous feriez alors de l'ajax sans le savoir. Comme avec la balise <a> ou la balise <form> du HTML.
Si à un moment ou à un autre (sur un clic de bouton par exemple), on veut modifier le contenu ou le rafraichir, il suffirait d'écrire une ligne javascript comme par exemple un document.elementById("mylist").datasource.reload() ou encore un document.elementById("mylist").datasource.href="http://monsite.com/serviceweb/listeanimaux?espece=poisson".
On pourrait aussi par exemple spécifier le type de format. Ici j'ai pris l'exemple du XML, mais ça pourrait être du JSON, un fichier CSV, du XML-RPC etc... La syntaxe des attributs ref et autre <content> ne serait alors certainement pas la même, mais on pourrait faire en sorte que cela soit proche de xpath. On pourrait aussi avoir une balise <conditions> qui nous permettrait de faire de la génération conditionnelle, ou d'autres comme dans ce que j'avais fait dans jsTemplateBuilder. Bien sûr, l'exemple présenté ici, qui pourrait être assimilé à un pseudo XSLT, est un peu léger, et pose certainement des problèmes dans certains cas. Ce n'est qu'un brouillon pour montrer le concept et ses avantages indéniables :
- comme je l'ai dit, facilité d'utilisation, prise en charge d'opérations bas niveau, donc moins de bugs potentiels, moins de maintenance, meilleure évolutivité etc..
- pages légères, sans 150ko de javascript à télécharger (et à maintenir).
- c'est certainement plus accessible qu'Ajax (qui, mal utilisé, ne l'est pas du tout). Un analyseur de document, grâce aux balises
templateconnaît les portions du document qui sont susceptibles d'être modifiées, donc peut surveiller ces modifications et en informer l'utilisateur (par synthèse vocale, via sa plage braille, ou visuellement). On pourrait même imaginer qu'un lecteur d'écran vocal lise l'attribut title de la balise parente (par exemple ici <ul title="liste des animaux">) et informe l'utilisateurla partie liste des animaux du document vient d'être modifiée, voulez vous la consulter ?
. Certes, il pourrait aussi surveiller dans un document classique les événements de mutations DOM mais le lecteur vocal ne pourrait tout de même pas informer l'utilisateur de chaque ajout/suppression/modification d'un élément ou attribut DOM, ça deviendrait vite un cauchemar.
Du rêve à la réalité
Là vous vous dites, Laurent, c'est sympa ton truc, ce serait sûrement chouette, mais c'est beau de rêver, car ça n'existe pas
. Vraiment ?
Pour être tout à fait honnête avec vous, je n'ai absolument rien inventé. En effet, ce système de template existe déjà. Et c'est ... Mozilla qui le propose depuis quelques années déjà : les templates XUL. Certes, pour le moment, le format des données est limité au RDF et c'est plus compliqué à utiliser que dans mon exemple, mais ça fonctionne et ça devrait s'améliorer dans le futur.
Ayant manipulé les templates XUL, je peux vous dire qu'Ajax est trop compliqué, et ne va pas nous amener bien loin, sauf au prix de d'efforts qui sont pour moi du gâchis. Ajax n'est pas adapté sur le long terme à du développement sérieux. Même si ça fonctionnera, vu tout le buzz et cet effet de mode qu'il y a autour. Mais ce n'est franchement pas la meilleure voie vers un web plus simple, plus sémantique, plus accessible...
Les contradictions du HTML et de l'ajax
Ce qui m'étonne, c'est que d'un coté, certains (comme Apple pour leur dashboard) prônent le HTML pour faire des interfaces d'applications web parce que soit-disant, le HTML c'est facile et tout le monde connaît, mais que d'un autre coté ils proposent de l'Ajax à toutes les sauces. Le résultat est que la simplicité du HTML est totalement masquée par la complexité d'Ajax au niveau développement. Alors qu'un peu de XUL...
Commentaires
Xul c'est (ce sera) bien mais tu oublies quand même l'avantage principal d'utiliser xmlhttprequest c'est que c'est supporté par plus de navigateurs et qu'ie7 va le supporter nativement (plus d'activex).
Donc pour les prochaines années je crois qu'il serait préférable de se concentrer sur la réalisation de lib js simple et légère (ça doit déjà exister en plus) plutôt que de vouloir réinventer encore un nouveau concept qui ne fonctionnera que sur une seule famille de navigateurs et qui au mieux ne sera disponible dans 3 ans...
Ben pour moi Ajax c'est l'avenir : la solution que tu proposes à base de XUL pourrait-être pas mal, mais je n'en suis plus à l'optimisation pour Gecko. xmlhttprequest() fonctionne avec IE 5, avec Mozilla, Safari, Opera, ...
Il y a effectivement un problème avec Ajax : il n'est pas encore assez mûr. (re)Découvert il y a 6 mois, les librairies existantes font vraiment uzinagaz. Ça s'améliorera sans aucun doute.
L'Ajax c'est l'avenir :-)
Je dois certainement mal m'exprimer Sam car tu n'as absolument pas compris mes propos. Je sais trés bien que pour l'instant ça ne fonctionne que dans Mozilla (comme si je ne le savais pas ... :-/)
Ce que je propose (relisez bien), est qu'il serait bien d'implementer dans tout les navigateurs, ce genre de solution afin d'éviter justement ces libraries js qui prennent de la place, qui sont sources potentielles de bugs, et qui rendent le developpement compliqué.
Ai-je le droit de proposer que l'on améliore les navigateurs ? qu'ils implementent des technos qui apportent un réèl plus plutôt que des trucs qui font bricolage et qui compliquent la vie de tout le monde ? Surtout quand lesdites technos existent déjà et ont fait leur preuve ?
Toi tu fait parti de ceux qui pensent "pourquoi faire simple quand on peut faire compliqué". Comme je l'ai dit, je pense le contraire, qu'il faudrait plutôt dépenser son énergie à intégrer des technos qui facilite le développement, qui cachent la mécanique, tout comme un a ou un form le font en HTML
à y reflechir, tu ne trouves pas que c'est plutôt ceux qui s'égosille à utiliser xmlhttprequest dans tout les sens qui réinvente le concept pour faire du contenu dynamique ? Alors qu'une solution plus simple existe à coté ?
Est-ce que les propositions du WhatWG comme celles-ci http://whatwg.org/specs/web-forms/current-work/#fetching-data - http://whatwg.org/specs/web-apps/current-work/#data-grids vont dans le sens que tu souhaites ? Je pense que si tu veux influer sur ce qui se trouvera dans les navigateurs de demain il faut le leur dire via ce genre de canal.
Benoit : oui ça va un peu dans le sens que je souhaite. Mais le problème c'est qu'ils se limitent aux formulaires. Les templates vont plus loin, car tu peux générer/remplir n'importe quoi.
Arretons de rever avec XUL, c'est peut être super mais ça ne marchera jamais sur tous les navigateurs. Microsoft n'implementera jamais cette technologie, donc l'AJAX est bien la méthode à utiliser pour nos sites. D'ailleur Microsoft est déjà en train de couper l'herbe sous le pied de XUL avec ces nouvelles techno que sont XAML et WPF/E, et les plugins correspondant pour les faire fonctionner sous d'autres OS. En plus, même si Firefox prend quelques part de marché à Internet Explorer, se sera toujours IE le navigateur le plus utilisé dans le monde par les personnes lambda. Donc pas de XUL, sauf pour des projets trés précis.
Loic : Sous pretexte que MS a le monopole et que IE est utilisé par une majorité d'internaute, il faudrait cesser d'innover et se contenter de ce que l'on a sous la main ?
Heureusement que les gars du WHATWG, du W3C, ou même de Mozilla ne pensent pas comme toi, sinon on en serait encore à faire du HTML 3.0 sans CSS...
Une petite remarque conçernant mon billet : je ne propose même pas d'implémenter le XUL partout. Juste un système de template similaire à ce qui se fait dans XUL ;-)
je ne sais pas si je suis de ceux qui préfère ce compliquer la vie mais ce que je dis c'est que en attendant que la majorité des navigateurs supporte une solution plus simple, je ne vois pas pourquoi les gens devraient se priver d'utiliser des technologies qui fonctionnent aujourd'hui...mais si elles sont "compliqués" à mettre en place.
au passage lorsque l'on veut "descendre" un truc, il ne faut pas exagérer ses défauts au risque de décridibiliser son message ;)
AJAX c'est lourd mais il existe des bibliothèques pas forcément difficile à mettre en place : XHRConnection
Je te rejoins pour XUL.
En gros c'est les outils qui s'adaptent aux technos et pas le contraire ! ;)
Et espérons que le web n'évolu pas avec Mircosoft, sinon on a pas fini.
Soyons pragmatiques 2 minutes. Je developpe une appli web. Quelques centaines/milliers de personnes s'en servent. Aujourd'hui, si je veux eviter que mes clients aient a recharger leurs pages sans arret, et ce pour tous mes clients, j'ai pas le choix, je n'ai que XMLHttpRequest comme solution (bon, j'evite de parler de Java ou Flash, faut etre un peu serieux quand meme ...) Je peux faire du XUL, mais environ 10% de mes clients seulements utilisent un navigateur base sur Gecko (en fait je serais plus proche des 3% personellement ...)
Regardons l'evolution des choses: hier ma limite numero un etait le navigateur (ie), aujourd'hui c'est une technologie particuliere implementee par tous les navigateurs ... les choses s'ameliorent. Aujourd'hui, si je fais mes pages en "ajax", je peux dire a mes clients: "vous pouvez utiliser le navigateur (recent) de votre choix".
A mon avis ce que la fondation Mozilla devrait s'atteler a faire c'est de pousser Mozilla et ses technologies dans les entreprises. Ca pourrait se faire par le biais des editeurs d'outils de developpement par exemple.
Si ma compagnie utilisent des produits Borland qui me donnent le choix entre developper du .Net ou du XUL, le choix sera vite fait et installer Firefox a travers mon entreprise representera une obligation pas trop contraignante par rapport aux avantages de R&D (y compris couts, maintenance etc).
Bien sur XULRunner va aider beaucoup a partir du moment ou les applications XUL pour le desktop commenceront a fleurir ici et la ...
Et un jour nous pourrons tous commencer a faire des versions XUL de nos sites web en se disant "la plupart des gens pourront le voir sans probleme ..."
En attendant ajax est un compromis pour les annees a venir.
Je dois certainement écrire en chinois, c'est pas possible autrement... Et tu n'as pas lu mes commentaires, en particulier celui-ci.
En substance, j'ai dit (je répète) : "Ajax n'est pas adapté sur le long terme à du développement serieux" ou encore "ce n'est franchement pas la meilleure voie vers un web plus simple, plus sémantique, plus accessible". Ai-je dit dans mes propos qu'il fallait abandonner Ajax maintenant ? Non. J'ai seulement dit qu'il existe une alternative actuellement, les templates, permettant de s'affranchir de la complexité d'Ajax, qui montre selon moi la voie vers un web plus simple, plus sémantique, plus accessible et qu'il serait bien que ce soit implémenté dans tous les navigateurs.
Ou vois-tu un manque de pragmatisme quelque part ?
la façon dont tu as tourné ton article peut préter a confusion et nous faire penser qu'on peut (qu'on doit ?) utiliser cette tehno maintenant. c'est tout. Il est vrai que si j'avais le choix j'utiliserai sans hésiter plus souvent XUL.