Si vous aimez Node.js mais pas son gestionnaire de paquets npm, ou si vous voulez un environnement runtime pour JavaScript plus sécurisé que Node.js, le projet open source Deno - anagramme de Node – pourrait vous intéresser. Par contre, si vous utilisez Node.js en production, passez votre chemin : Deno est encore « en phase de développement très précoce ». Deno permet d'exécuter du code JavaScript et TypeScript en dehors du navigateur. Son auteur n’est autre que Ryan Dahl, qui a fondé le projet Node.js en 2009. Son objectif ? Essayer de réimaginer Node.js à la lumière des progrès réalisés en JavaScript depuis 2009, y compris pour le compilateur TypeScript. Comme Node.js, Deno est essentiellement un shell autour du moteur JavaScript de Google V8. Mais contrairement à Node.js, il inclut le compilateur TypeScript dans son image exécutable.

Deno et JavaScript avancé

Selon Ryan Dahl, en 2009, plusieurs fonctionnalités qui auraient été utiles pour Node.js étaient absentes de JavaScript. Certaines ont été ajoutées au langage au fil des ans dans le cadre du standard ECMAScript (ES), et d’autres ont été ajoutées à TypeScript. Depuis toujours, les événements et les callbacks ou fonctions de retour font partie de JavaScript, mais ils peuvent conduire à un code assez compliqué, en particulier quand on veut enchaîner des actions asynchrones. Heureusement, les promesses de Javascript, ajoutées en 2015, rendent la syntaxe un peu plus lisible. Une promesse est un objet retourné représentant l'achèvement ou l'échec éventuel d'une opération asynchrone, à laquelle on peut attacher des callbacks, par opposition au passage de callbacks dans une fonction.

Déclarer une fonction asynchrone simplifie encore plus la syntaxe, car elle permet d'utiliser l’opérateur await au sein de la fonction pour faire une pause de manière non-bloquante jusqu'à ce que la résolution de la promesse. Au moment de la création de Node.js, CommonJS était la norme de facto pour les modules JavaScript, celle que supporte le gestionnaire de paquets npm. Mais depuis, le comité ECMAScript a officiellement approuvé une norme différente, ES Modules, celle que supporte jspm, le gestionnaire de paquets construit sur les bases du système de modules ECMAScript 6 (ou ES6).

Deno prend en charge les modules ES

Les tableaux typés (typed arays) sont des objets API ES6 semblables à des tableaux qui permettent d'accéder à des données binaires brutes, ce que Node.js aurait pu utiliser. Mais l'absence de prise en charge des données binaires a entraîné quelques problèmes de conception de Node.js. Quand il doit manipuler des données binaires brutes, Deno utilise des tableaux typés. Node.js prend désormais en charge les tableaux typés pour le code utilisateur. TypeScript est un sur-ensemble de JavaScript typé qui se compile en JavaScript simple (ES3 ou supérieur ; il est configurable). TypeScript ajoute des types, des classes et des modules optionnels à JavaScript, et prend en charge des outils pour les applications JavaScript à grande échelle. (Anders Hejlsberg l'appelle « JavaScript à l’échelle ».) Comme mentionné précédemment, Deno contient une image du compilateur TypeScript dans son runtime. Si l’on transmet un fichier TypeScript à Deno, il le compilera d'abord en JavaScript et le transmettra ensuite au moteur V8.

Défauts de conception de Node.js

Selon Ryan Dahl, concepteur à la fois de Node.js et de Deno, Node.js souffre de trois problèmes de conception majeurs :

- un système de modules mal conçu, avec une distribution centralisée ;

- un grand nombre d'API héritées qui doivent être prises en charge ;

- un manque de sécurité.

Selon lui, Deno résout ces trois problèmes.

Exécution sécurisée de Deno

Par rapport à Node.js, Deno améliore la sécurité de manière très simple : par défaut, il ne laisse aucun programme accéder au disque, au réseau, aux sous-processus ou aux variables d'environnement. Quand on doit autoriser l'un de ces accès, on peut le faire avec un drapeau de ligne de commande, et ce drapeau peut-être aussi granulaire que nécessaire, par exemple --allow-read=/tmp ou --allow-net=google.com. Une autre amélioration de sécurité apportée par Deno, c’est qu’il stoppe toujours l’exécution sur des erreurs non capturées, contrairement à Node.js, qui permet de poursuivre l'exécution après une erreur non capturée, et le risque d’obtenir des résultats non-prévisibles.

Les modules Deno

Dans Node.js, les modules CommonJS sont chargés en utilisant le mot-clé « require » et tous, qu'ils soient standards ou de tierce partie, proviennent implicitement de npmjs.com. Dans Deno, les modules ES sont chargés en utilisant le mot-clé import et l’URL est explicitement indiqué. Par exemple : import * as log from "https://deno.land/std/log/mod.ts" ;

Les modules Deno peuvent être hébergés n'importe où - il n'existe pas de référentiel centralisé pour les modules tiers. De plus, les modules sont toujours mis en cache et compilés localement, et ils ne sont pas mis à jour à moins de demander explicitement un update. Par conséquent, chacun devrait être en mesure d’exécuter les programmes Deno déjà présent sur son notebook, à condition que toutes les importations aient été résolues une fois, même si l’on est dans un avion sans connectivité. Deno dispose d'une série de modules standard qui n'ont pas de dépendances externes et qui sont examinés par l'équipe de Deno. Ces modules se trouvent sur le serveur deno.land. La série de modules deno_std résulte d’un portage libre de la bibliothèque standard de Go.

Concernant ce choix de modèle pour la bibliothèque, Ryan Dahl raconte qu’il a écrit le prototype de Deno principalement en langage Go, mais qu’il a découvert des conflits potentiels entre les ramasse-miettes de Go et de V8. Avec ses collaborateurs, il a réécrit proprement Deno avec V8, Rust, et le paquet d'entrées/sorties asynchrones Tokio de Rust. Ensuite, ils ont implémenté la bibliothèque standard de Deno dans TypeScript. À ce stade, on peut raisonnablement utiliser l’environnement Deno pour construire de petits projets de script privés en TypeScript. Selon Ryan Dahl, Deno ne détrônera jamais Node.js. Mais, quand la version 1.0 de Deno sera prête, elle pourrait bien offrir une alternative viable pour développer des projets plus importants.