Deno – Retour d’expérience

By | 12 août 2020

Créé par le Ryan Dahl, aussi créateur de NodeJS, Deno est sortie le 14 Mai 2020 en version stable. Aujourd’hui nous en sommes à la version 1.2.3 et je vous propose un petit retour d’expérience sur ce moteur JavaScript comparé à NodeJS.

Introduction

Pour rappel, les objectifs de Deno sont :

  1. Sécurisé par défaut. Pas d’accès aux fichiers, au réseau, ou à l’environnement d’exécution. Cela doit être explicitement autorisé.
  2. Support natif de Typescript.
  3. Les programmes sont contenus dans un seul exécutable.
  4. Incorpore des outils comme l’inspecteur de dépendances ou le formateur de code.
  5. Dispose d’une bibliothèque standardisée.

Avantages sur Nodejs

Deno supporte nativement Typescript. Plus besoin d’installer et de configurer plusieurs packages npm comme typescript, ts-lib, ts-lib, ts-lint, … pour démarrer un projet via Typescript. Cela apporte un gain immédiat sur le démarrage d’un projet, et facilite la maintenance de celui-ci. Moins d’outils à gérer égale plus de temps à consacrer au développement.

Le formatage du code inclut dans Deno est un vrai plus. Cela évite de devoir réapprendre les codes et usages à chaque changement de projet. Plus besoin de configurer son IDE pour qu’il formate le code en fonction du linter utilisé sur le projet. Ici, tout le monde dispose de la même configuration. Il suffit de faire un petit deno fmt pour voir l’ensemble du code du projet rectifié.

Pour la livraison, cela est extrêmement simplifié. Plus besoin de minifier le projet ou de maintenir une configuration webpack. Un simple deno build et vous avez votre projet sous la forme d’un simple binaire prêt à être exécuté.

Un autre avantage, mais qui est un peu perturbant au démarrage, est la nécessité de spécifier des options pour lancer un exécutable faisant appel à certaines fonctionnalités. Par exemple, l’utilisation de Oak, un framework permettant de créer des API REST avec Deno, nécessite l’utilisation de l’option --allow-net pour avoir accès au réseau. Cela apporte néanmoins une plus grande sécurité en empêchant un programme d’accéder à des fonctionnalités non souhaitées.

Les inconvénients

Actuellement, Deno souffre encore de quelques faiblesses. Les bibliothèques et frameworks tierces sont encore peu nombreux comparé à NodeJS. L’équipe de Deno prévoit cependant de sortir un module de compatibilité permettant de faire fonctionner une bibliothèque NodejS sur Deno. Avant de commencer un projet, il faut donc s’assurer que des bibliothèques/frameworks sont bien présents pour répondre aux grosses problématiques que vous allez rencontrer.

Un autre problème, est qu’actuellement Deno est en évolution rapide. Une nouvelle version sort presque toutes les semaines et avec elle, des changements dans la bibliothèque standard. Certains modules tierces ont parfois du mal à suivre ces changements et cela peu occasionner quelques incompatibilités.

Deno dispose d’un framework intégré pour l’exécution des tests. Celui-ci ressemble grandement à mocha mais supporte beaucoup moins de fonctionnalités. Ainsi aucune gestion du cycle de test ( BeforeAll, BeforeEach…) n’est présente. Cela oblige à le mettre en place soi-même. De la même manière, seules les assertions sont disponibles à l’heure actuelle. Les amoureux du expect seront déçus.

Le support des IDEs est encore perfectible. Impossible pour moi de faire fonctionner le mode Debug pendant l’exécution des tests avec Webstorm par exemple.

La gestion des dépendances

Avec NodeJS, chaque dépendance devait être spécifiée dans un fichier package.json. Cela téléchargeait ensuite la dépendance dans un répertoire node_modules. Chaque dépendance pouvait à son tour télécharger d’autres dépendances, etc … C’est le fameux trou noir de Nodejs.

Avec Deno, les dépendances sont déclarées directement en en-tête de fichier. Deno s’occupe alors de télécharger les dépendances nécessaires et de les mettre en cache afin de ne plus avoir à les télécharger à nouveau. Cela permet de mettre à disposition les bibliothèques Deno avec un simple serveur web.

Le point le plus surprenant a été pour moi la gestion des montées de version. Avec nodejs, nous avions le choix entre faire un npm update si notre package.json était correctement configuré ou de faire un npm install ma_lib@latest pour mettre à niveau vers la dernière version. Avec Deno, il n’y a plus de point central de mise à jour. La manière la plus simple que j’ai trouvée semble être une banale « recherche et remplace » sur l’ensemble du projet. Pour monter de version avec le framework oak il suffit ainsi de remplacer https://deno.land/x/oak@v6.0.0/mod.ts par https://deno.land/x/oak@v6.0.1/mod.ts dans l’ensemble du projet. Je n’ai pour le moment pas trouvé de moyen plus simple et rapide pour monter de version.

Et l’intégration continue dans tout ça

J’ai personnellement testé l’intégration de Deno avec Drone CI. Des images docker existe déjà permettant l’exécution des tests sur la plateforme. J’ai également vu des projets utilisant Github avec succès. Si vous avez des retours sur des plateformes comme Gitlab ou Jenkins, vous pouvez les laisser en commentaire.

Conclusion

J’ai pris beaucoup de plaisir à développer avec Deno. Le support natif de Typescript et les outils intégrés ( tests, formatage, build ) permettent un réel gain de temps et une prise en main plus rapide. Cela rend aussi les projets Deno plus homogènes. Il a ainsi nécessité des années avant que les projets Nodejs se standardisent dans leur forme actuelle.

Néanmoins, je ne recommande pas actuellement Deno pour de gros projets, car il manque encore bon nombre de librairies tierces fiables et éprouvées pour être productif. A moins que vous ayez les moyens de développer ce qu’il vous manque en interne.

C’est la fin de ce retour d’expérience. Si vous avez aussi une expérience sur Deno, n’hésitez pas à commenter. Cela m’intéresse également.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.