Le point sur Node

le 18/07/2011 par Vincent Grastic
Tags: Software Engineering

Dans cet article, nous allons faire le point sur Node, une technologie serveur dont tout le monde parle et qui est devenue, en 2 ans seulement, le 3ème projet le plus suivi sur GitHub derrière Rails et jQuery.

Node en quelques mots

Node est une technologie créée en 2009 par Ryan Dahl et soutenue par Joyent qui permet de réaliser simplement des applications réseau asynchrones, performantes et scalables en JavaScript.

Pourquoi JavaScript ? Aujourd’hui, pour traiter un grand nombre de requêtes, la stratégie des serveurs haute performance, comme nginx par exemple, est d’utiliser un thread et une approche événementielle.

Node reprend ce principe et va plus loin en utilisant JavaScript: un langage conçu pour tourner au sein du navigateur dans un thread et une boucle événementielle asynchrone.

C’est également un choix qui simplifie les développements web puisque le langage côté navigateur et serveur est le même. Par la même occasion, cela ouvre de nombreuses perspectives en terme de partage de code entre ces deux mondes.

Exemple de code asynchrone affichant "hello world" en JS:

setTimeout(function () { console.log('world') }, 2000);
console.log('hello');

Comment ? Pour exécuter du code JS côté serveur, Node utilise le moteur V8 de Google.

C’est l’un des moteurs JS les plus performants grâce à de nombreuses optimisations (compilation du code JS en code machine, garbage collector, ...) dont on trouvera le détail ici.

Pour les aspects non pris en charge par JS et V8, Node implémente ses propres librairies non bloquantes (HTTP, TCP, FileSystem, etc...).

Rapide et léger Ces choix techniques font que les applications basées sur Node sont très performantes et capables de traiter efficacement un grand nombre de requêtes concurrentes tout en gardant une empreinte mémoire faible.

En pratique? Voici un serveur développé en JS et utilisant le module HTTP de Node. Les requêtes sont traitées de façon asynchrone dans un callback.

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337');

Node et Rails une histoire comparable ?

Pour bien comprendre le phénomène Node, il est intéressant de le mettre en perspective avec Rails à ses débuts.

Une adoption d’abord chez les développeurs A l’inverse de technologies poussées par des poids lourds, Rails est une technologie qui a d’abord été adoptée et popularisée par les développeurs.

De la même façon, Node est un projet open source qui a démarré sur la plateforme de social coding GitHub essentiellement fréquentée par des développeurs web.

Aujourd’hui, Node est le 3ème projet le plus suivi sur cette plateforme.

Les deux technologies répondent à une problématique de leurs temps Rails permettait de faire, beaucoup plus simplement que les autres, des applications web CRUD avec base de données. Ce type d'application était la tendance il y a quelques années.

Aujourd’hui, la tendance est au web temps réel et Node permet de le faire de façon performante mais surtout plus simplement que les autres.

Exemple: avec Node et le module NowJS, il est possible de faire un chat web en 12 lignes.

Il y a un module pour ça La force de Rails, hormis la qualité du framework, est l’éco-système de gems développées par la communauté. Sans celui-ci l’intérêt de Rails serait beaucoup plus limité.

On retrouve cela avec Node et de nombreux modules tiers sont disponibles. Il existe d'ailleurs un gestionnaire de paquet, Node Package Manager, similaire à RubyGems.

C’est cette capacité à être étendu et la communauté autour qui fait tout l’intérêt et le potentiel de Node.

Une précision toutefois, même si Node et Rails ont un début de parcours semblable, les deux technologies sont fondamentalement différentes techniquement et dans la réponse qu’elles apportent. Rails est un framework MVC, Node est une base sur laquelle d'autres modules sont développées, dont des frameworks web.

Où en est Node aujourd'hui ?

Node et son éco-système évoluent très rapidement, néanmoins voici plus ou moins l’état actuel.

Node Node est activement développé. C’est une technologie “from scratch” qui change encore beaucoup mais qui est utilisable et performante.

Node tourne sous MacOS, Linux et depuis peu Windows. Fait assez significatif, Microsoft a participé à ce portage.

Modules Les modules disponibles évoluent eux aussi rapidement.

Il y a eu un gros effort de développement fait par la communauté et on trouve maintenant des modules pour la plupart des besoins habituels (web temps réel, frameworks, persistance, templates, tests, DSL, …).

A titre d'exemples, on pourra aller voir: Express, Socket.IO, CoffeeScript, MongooseZombie.js, Vows,  ...

Globalement, c’est un éco-système qui se cherche encore mais qui évolue vite.

Il y aura, comme ce fut le cas avec la vague Rails et ses plugins, une "sélection naturelle" des modules.

Les applications qui utilisent Node Comme avec Rails au début, ce sont surtout des applications de développeurs ou des startups. On trouve également quelques sociétés comme Yammer, HP (webOS), 37signals (Pow).

Les cas d'utilisation sont assez variés: API, web temps réel, serveurs, etc...

Node est principalement utilisé sur les aspects nécessitant de traiter un grand nombre de requêtes avec des temps de réponse faible.

Aujourd'hui, ce qu’il manque surtout à Node pour passer sur le devant de la scène est une killer app grand public.

A retenir

Node est une nouvelle technologie qui suscite, à juste titre, beaucoup d’intérêt par ses performances et sa simplicité.

Mais Node s'inscrit aussi dans une tendance générale du web.

Depuis plusieurs années, on constate une montée en puissances de JS, notamment côté navigateur avec:

  • des moteurs de plus en plus rapides
  • des applications et des frameworks pour les développer de plus en plus évolués (BackBone, Sammy.js, ...)

Node en permettant d'utiliser le même langage côté serveur ouvre de nombreuses possibilités. Il n'est pas rare de voir des modules pouvant être exécuté côté navigateur ou serveur avec la même base de code.

Aujourd'hui, tous les éléments sont réunis pour voir émerger de nouveaux frameworks web basés sur Node permettant de faire simplement du JS de bout en bout:

Technique JS est présent à tous les niveaux, les briques de base côté Node sont développées (modules web temps réel, persistance, templates, …) et les performances sont suffisantes pour supporter les nouveaux usages web.

Communauté Grâce au choix du langage et à son faible coût d’entrée, Node bénéficie d’une communauté active, très importante et fortement orientée web.