URL: https://linuxfr.org/news/nodejs-passe-en-version-060-et-arrive-sous-windows Title: Node.js passe en version 0.6.0 et arrive sous Windows Authors: Bruno Michel Date: 2011年11月05日T14:58:33+01:00 License: CC By-SA Tags: nodejs et javascript Score: 27 _Node.js_ est un environnement JavaScript côté serveur, sous licence MIT. Sa particularité est son approche asynchrone pour faciliter la montée en puissance dans des contextes avec beaucoup d’entrées‐sorties, notamment réseau. En pratique, il se compose : * d’un interpréteur JavaScript, à savoir V8 ; * de `require()`, un chargeur de modules compatible [CommonJS](http://www.commonjs.org/specs/modules/1.0/) ; * d’une bibliothèque standard, volontairement restreinte (une sorte de _libc_ JavaScript où tous les appels sont asynchrones) ; * d’un ensemble de conventions : par exemple, les fonctions de retour indiquent toujours en premier paramètre si l’appel s’est bien passé, et dans le cas contraire, quelle a été l’erreur ; * et d’un exécutable, `« node »`, pour lancer tout ça. La version 0.6.0 est sortie aujourd’hui et apporte quelques nouveautés de taille (plus de détails en seconde partie) : * la prise en charge de Windows en utilisant les _I/O Completion Ports_ (IOCP) ; * un répartiteur de charge entre plusieurs processus _Node.js_ intégré ; * des moyens de communications entre des processus _Node.js_ plus efficaces ; * des améliorations du débogueur en ligne de commande ; * des _bindings_ pour la `zlib` ; * la mise à jour de V8, passant de la version 3.1 à la 3.6. La prise en charge de Windows, sans dégrader les performances pour les UNIX, a pris plus longtemps que prévu. Cela a fortement retardé la sortie de cette version, mais Ryan Dahl, son créateur, souhaite sortir la prochaine version stable de _Node.js_ (la v0.8.0) pour janvier 2012. ---- [Le site officiel de Node.js](http://nodejs.org/) [L’annonce de la sortie de la version 0.6.0](http://blog.nodejs.org/2011/11/05/node-v0-6-0/) [Les changements d’API à connaître pour porter du code Node.js de la v0.4 à la v0.6](https://github.com/joyent/node/wiki/API-changes-between-v0.4-and-v0.6) [DLFP : annonce de la sortie de la version 0.4.0](http://linuxfr.org/news/sortie-de-nodejs-040) [DLFP : les contenus taggés « nodejs »](http://linuxfr.org/tags/nodejs/public) ---- Prise en charge de Windows -------------------------- _Node.js_ 0.4 pouvait déjà tourner sous Windows avec MinGW, mais les performances n’étaient pas là. En effet, _Node.js_ utilise les bibliothèques [_libev_](http://software.schmorp.de/pkg/libev.html) et [_libeio_](http://software.schmorp.de/pkg/libeio.html), pour gérer sa boucle événementielle. Celle‐ci repose sur des mécanismes comme _epoll_ ou _kqueue_ sur les UNIX, qui restent efficaces même quand le nombre de descripteurs de fichiers est élevé (plusieurs milliers). En revanche, la version compilée pour Windows se retrouve à utiliser _select_, qui est lent dans ces conditions. Windows possède lui aussi un système capable de tenir efficacement de fortes charges avec une latence faible : les _I/O Completion Ports_, mais ceux‐ci ne sont pas basés sur des descripteurs de fichiers. Ryan Dahl a donc décidé d’écrire une bibliothèque, la [_libuv_](https://github.com/joyent/libuv), qui permet d’abstraire ces différences entre les différents systèmes d’exploitation. Ainsi, le code de _Node.js_ v0.6 est générique et toutes les différences de comportement entre Windows et les UNIX sont gérées au niveau de la _libuv_. Celle‐ci fait bien entendu appel aux bibliothèques _libev_ et _libeio_ sous UNIX, et aux _I/O Completion Ports_ sous Windows, pour garantir les meilleures performances dans les deux mondes. Répartition de charge entre plusieurs processus Node.js ------------------------------------------------------- Une instance de _Node.js_ tourne dans un seul fil d’exécution (_thread_) d’un seul processus, et ne peut donc pas tirer pleinement profit de la puissance de calcul des ordinateurs actuels qui possèdent plusieurs processeurs et plusieurs cœurs par processeur. La solution consiste à lancer plusieurs instances de _Node.js_ et, depuis la version 0.6, [l’API _cluster_](http://nodejs.org/docs/v0.6.0/api/cluster.html) permet de faire cela simplement. Elle offre la possibilité de créer plusieurs instances esclaves à partir d’une instance maître, et de partager des ports TCP entre les instances esclaves. Cela peut, par exemple, servir à répartir des requêtes HTTP entre les instances esclaves. Meilleure communication entre processus Node.js ----------------------------------------------- « [`child_process.fork`](http://nodejs.org/docs/v0.6.0/api/child_processes.html#child_process.fork) » lance un nouveau processus _Node.js_ et ouvre un canal de communication entre le processus courant et le nouveau processus. Ces processus peuvent s’envoyer des messages avec `send()`, sous la forme d’un objet JavaScript, et les recevoir avec `« on(message, callback) »` : ```js var cp = require('child_process'); var n = cp.fork(__dirname + '/sub.js'); n.on('message', function(m) { console.log('PARENT got message:', m); }); n.send({ hello: 'world' }); ``` Et on pourrait avoir le code suivant dans `« sub.js »` (qui va être exécuté par le fils) : ```js process.on('message', function(m) { console.log('CHILD got message:', m); }); process.send({ foo: 'bar' }); ``` Débogueur en ligne de commande amélioré --------------------------------------- _Node.js_ propose un débogueur en ligne de commande qui s’appuie sur celui de V8. Il permet d’attacher des points d’arrêt, d’avancer en pas à pas, d’afficher la _backtrace_ et le code en cours d’exécution, de montrer les valeurs des variables et d’exécuter du code JavaScript dans le contexte courant. La [documentation](http://nodejs.org/docs/v0.6.0/api/debugger.html) donne la liste détaillée de toutes les commandes. Bindings pour la zlib --------------------- Le nouveau module _zlib_ prend en charge les algorithmes de compression _gzip_ et _deflate_. Il fonctionne en utilisant [les flux de _Node.js_](http://nodejs.org/docs/v0.6.0/api/streams.html). Voici un exemple tiré de [la documentation](http://nodejs.org/docs/v0.6.0/api/zlib.html) : ```js var gzip = zlib.createGzip(); var fs = require('fs'); var inp = fs.createReadStream('input.txt'); var out = fs.createWriteStream('input.txt.gz'); inp.pipe(gzip).pipe(out); ``` Mise à jour de V8 ----------------- V8 est l’interpréteur JavaScript développé par Google pour Chrome et est au cœur de _Node.js_. La mise à jour de V8 apporte ainsi de meilleures performances (notamment au niveau du ramasse‐miettes _— garbage collector —_) et une stabilité accrue. À ce sujet, Ryan Dahl envisage de synchroniser les sorties de `Node.js` sur celles de V8, toutes les 6 semaines.