Inovia Blog

L’actualité des technologies innovantes

node.js ou le triomphe de JavaScript

Par Kadda SAHNINE

Publié le | 8 mars 2010 |

node_js_logo.jpgEn des temps préhistoriques (1996), l’emblématique mais défunte société Netscape commercialisait LiveWire, une implémentation du langage JavaScript intégrée au serveur web maison (Enterprise Server) dans le but d’unifier les langages de développement côtés client et serveur.
Le succès de la plateforme Java a eu raison de LiveWire et les quelques initiatives visant à promouvoir le langage Javascript comme un langage pivot du développement d’applications web a toujours suscité des sourires en coin ou des soupirs convenus…

Peut être est-ce toujours votre cas. Il est alors fort probable que vous n’ayez jamais entendu parlé du projet node.js dont nous pensons qu’il marquera l’agenda technologique de l’année 2010.
Cet article sera l’occasion d’oublier les préjugés et de porter un regard intéressé sur une initiative située à la périphérie des solutions établies.

Présentation

node.js est un framework JavaScript serveur construit au dessus de V8, le très performant moteur JavaScript open source soutenu par Google et utilisé notamment par le navigateur Chrome.
Peut être connaissez vous le serveur web Lighttpd, un compétiteur très performant du serveur web Apache. Contrairement à ce dernier où chaque requête est traitée par un processus dédié, Lighttpd n’utilise qu’un seul thread où le traitement des entrées sorties est non bloquants. Avec des I/O bloquantes (cas d’Apache), l’application cliente est bloquée tant que la communication est en cours et, dans certains cas d’utilisations comme le push de données, le serveur passe son temps à attendre la fin des opérations d’entrée/sortie.
Comme Lighttpd, node.js gère des entrées/sorties non bloquantes et supporte un modèle de programmation évènementiel ce qui en fait une excellente plateforme de développement d’applications orientées réseau (messagerie instantanée, systèmes de notification temps réel, etc.) performantes et scalables car pouvant gérer un nombre très important de requêtes simultanées.
En outre, grâce à son support des closures, l’usage du langage JavaScript est très adapté à la programmation évènementielle.
Sans surprises, c’est donc dans le champ des applications web temps réel ou asynchrones que node.js excelle.

Installation

Le code est constitué de 8000 lignes de sources C/C++ et 2000 lignes de JavaScript. Le mode opératoire d’installation à partir des sources du repository git est le suivant :

git clone git://github.com/ry/node.git
cd node; ./configure
make
sudo make install

Par défaut le binaire est installé sous /usr/local/bin. Faites un ./configure --prefix le cas échéant.

Prise en main

node.js est encore un projet très jeune et l’API évolue
substantiellement. Les exemples de code que nous fournirons sont
compatibles avec la version 0.1.31.

La programmation évènementielle est à la base de node.js. A titre d’illustration, le code source ci-après (tcpecho.js) implémente un serveur TCP écoutant sur le port 7000 et retournant en écho la saisie d’un utilisateur :

var tcp = require("tcp");
var server = tcp.createServer(function (socket) {
  socket.setEncoding("utf8");
  socket.addListener("connect", function () {
    socket.write("Bienvenuern");
  });
  socket.addListener("data", function (data) {
    socket.write("-> " + data);
  });
  socket.addListener("end", function () {
    socket.write("goodbyern");
    socket.close();
  });
});
server.listen(7000, "localhost");

La commande node tcpecho.js active le service, lequel est accessible via un telnet localhost 7000.
Notez que le code est d’une simplicité remarquable car vous n’avez pas à vous préoccuper de la gestion concurrente des accès, de gérer des threads ou des ressources critiques.

Un peu plus élaboré, l’exemple suivant (webdate.js) implémente un service web retournant la date du jour :

var http = require('http');
http.createServer(function (req, res) {
  setTimeout(function () {
    res.writeHead(200, {"Content-Type": "text/html"});
    res.write("node.js demo");
    var current_date = new Date();
    res.write("Date actuelle : " + current_date)
    res.close();
  }, 1);
}).listen(8080);

La commande node webdate.js active le service, lequel est accessible via l’URL http://localhost:8080.

Le code ci-dessus, entièrement écrit en JavaScript, est assez trivial. Il consiste à :

  • inclure la bibliothèque standard http
  • créer un serveur web écoutant sur le port 8080 et auquel on attache une routine gérant les appels entrants (le closure en paramètre de la méthode createServer())

Au delà des exemples

Nous n’avons fait que gratter la surface du champ d’application. node.js est un framework de bas niveau à portée générique pouvant adresser un très grand nombre de problématiques. Le framework peut être étendu par l’adjonction de modules spécialisés (templating, gestion de la persistance, parseurs, etc.).
On assiste donc au développement d’un dynamique (mais peu structuré) écosystème de frameworks spécialisés construits au dessus de node.js.

Des frameworks web

Qui peut le plus, peut le moins. Il est possible de développer des applications web avec node.js bien que nous pensons qu’il ne s’agit pas là de son domaine de prédilection.
Simon Willison a initié le projet djangode implémentant un framework web de type MVC et dont la conception s’inspire de Django. A noter l’initiative de Benjamin Thomas, créateur de Bomber, un autre framework web aux ambitions similaires.
Enfin, mentionnons le projet express, un framework web RESTful inspiré de Sinatra, son équivalent écrit en Ruby

Des frameworks pour le web asynchrone

Nous avons eu l’occasion de publier une étude très détaillée des techniques du web temps-réel (ou asynchrone). Elle mériterait d’être complétée car node.js est particulièrement bien adapté pour ce champ d’applications car il est, si l’on peut dire, Comet enabled.
Les initiatives fusent. Guillermo Rauch a initié le projet node.websocket.js permettant la mise en oeuvre d’un serveur implémentant le protocole WebSocket, alternative sérieuse à Comet. Jacek Becela a développé une librairie équivalente mais assez minimaliste.
Enfin, André Gonçalves a eu l’idée d’assembler le tout en proposant une application web affichant en temps réel l’activité d’un compte sur Twitter.

Plus intéressant, le projet Faye est une implémentation du protocole de Bayeux construite sur node.js. Pour mémoire, le protocole de Bayeux définit un modèle de programmation de type publish/subscribe pour la construction d’application web temps-réel. Nous vous renvoyons à notre étude pour de plus amples détails.

Mais encore

Vous pouvez implémenter aisément votre propre système de messagerie temps réel, ou implémenter un jeu multi joueurs et temps-réel.
node.js a aussi la prétention de rogner sur le terrain des ESBs. On peut citer par exemple un agrégateur de logs en temps-réel ou un système de notification de transfert de fichiers.

Attention : il est possible que les projets sus-cités utilisent une version de node.js non compatible avec la version actuelle de l’API.

Pour aller plus loin

Bien que ce billet d’introduction est d’une longueur honorable, nous n’avons fait que gratter la surface du sujet.
Hasardons cette prévision audacieuse : l’année 2010 verra vraisemblablement la consécration de ce projet et le développement d’un écosystème varié si l’API arrive à se stabiliser. Peut être contribuera il à légitimer l’utilisation de stacks JavaScript complètes (jQuery/node.js/couchDB), là où les cas d’utilisations sont les plus adaptés.
Nous publierons prochainement d’autres articles relatifs à node.js, assurément un des projets à suivre en 2010.

Abonnez vous !
  • RSS
  • Yahoo
  • Netvibes

Suivez l'auteur sur Twitter !
  • Suivre sur Twitter

A propos de l'auteur

Kadda SAHNINE
Architecte technique Java EE
#JavaEE #Linux #vim addict #OpenSoftware #OpenHardware
Voir le profil de Kadda Sahnine sur LinkedIn

Flux RSS

Rechercher

Administration