NestJS est défini par ses créateurs comme étant “A complete development kit for building scalable server-side apps” (cf. google translate pour les non anglophones d’entre nous). Il s’agit donc encore d’un framework de développement d’applications web comme les nombreux autres qu’on peut trouver sur le web.
Cela fait plusieurs mois déjà que je travaille avec NestJS, et je me suis dit que ce ne serait pas une si mauvaise idée que ça de commencer à en parler (écrire plus précisément).
… Sans plus tarder, passons à la première des raisons.
1. C’est du JavaScript, mais en mieux — TypeScript
JavaScript est un des langages les plus utilisés dans le monde du développement de nos jours, mais ce n’est pas le premier auquel on penserait en parlant de langage pour le développement backend.
Certains pourraient arguer que c’est parce que JavaScript n’est pas un langage assez strict pour les besoins de développement backend. Pour ceux-là, Typescript est la réponse qui redistribue les cartes.
TypeScript augmente les capacités de JavaScript en y ajoutant un lot de fonctionnalités plutôt pratiques pour les besoins de développement backend, notamment de l’inférence de types, de la validation de cohérence de types lors de la compilation (car TypeScript est compilé), les interfaces, les génériques, et bien d’autres…
2. C’est du Node.js, avec une boîte à outils bien fournie
Vu que le mot JavaScript est apparu, vous avez sûrement déjà deviné qu’un serveur Node.js se cache derrière ce framework; cependant, il ne se contente pas de ça.
NestJS inclut plein d’outils pratiques tels que :
- les middlewares et les interceptors, qui aident à mieux traiter les entrées et sorties de l’application,
- les exception filters qui définissent un système global de gestion des erreurs, et donc d’avoir un peu moins à s’en soucier,
- les pipes, qui pourront être utilisés pour transformer le contenu des requêtes à la volée,
- les guards, qui aident à mettre en place un système d’authentification et d’autorisation robuste,
- … et il ne s’agit ici que de quelques élément de la liste
En plus de ces points, NestJS fonctionne sur une architecture en modules qui vous permet d’organiser et de trier les fonctionnalités de votre plateforme à souhait ; le tout tenant bien en place grâce au système d’injection de dépendances intégré.
3. Ai-je dit injection de dépendances ?
Oui, NestJS implémente un système d’injection automatique de dépendances très intuitif et facile à utiliser.
Il vous suffit juste d’annoter vos modules en précisant :
- les autres modules dont il dépend
- les services définis dans le module
- les contrôleurs
- les services à exporter pour d’éventuels autres modules dépendants de celui-ci
Une fois cette définition effectuée, tout objet nécessaire au fonctionnement de l’application sera automatiquement instancié à son lancement, en se basant sur les types des paramètres de constructeurs et les décorateurs dans les modules.
4. Adapté aussi bien pour les applications monolithiques que pour celles qui sont distribuées
NestJS utilise la librairie Express.js par défaut, mais elle est intégrée via des interfaces qui font qu’il est très aisé de changer de librairie pour passer par exemple à Fastify. Ce qui facilite la mise en place de l’architecture MVC de votre choix par exemple, en choisissant le moteur de templating qui vous plait et la méthode qui vous convient pour récupérer vos données.
Vous pouvez aussi créer des microservices avec NestJS. Pour NestJS, un microservice est tout simplement une application qui utilise un protocole de communication autre que HTTP.
Vous pouvez donc facilement créer un groupe d’applications NestJS qui communiqueraient entre elles dans le but de résoudre les problèmes dont votre plateforme est la solution.
Par défaut, les microservices utilisent la couche TCP comme transport, mais il est tout à fait possible de définir un tout autre canal compris dans la liste : Redis, MQTT, NATS, RabbitMQ, Kafka et gRPC.
Il est également aisé d’implémenter des WebSockets avec NestJS.
Nota : toutes les fonctionnalités mentionnées au point 2 sont aussi applicables pour les microservices et les WebSockets.
5. La persistance de données
NestJS inclut TypeORM par défaut. Pour peu qu’on lui fournisse le connecteur correspondant à notre système de gestion de base de données, TypeORM permet relativement aisément de faire toute modification nécessaire sur les schémas et les données.
Il permet de définir des entités ainsi que les relations entre elles en utilisant des décorateurs intuitifs, de mettre en place des patrons de conception courants tel que le pattern Repository, met à votre disposition un query builder qui permet d’interagir aisément avec la base de données pour des cas plus précis ; et enfin, il intègre un système de migrations versionnées.
Si vous avez une préférence pour Sequelize, il est très aisé de l’intégrer aussi.
… En plus des cinq raisons que je viens d’énumérer, on pourrait aussi mentionner l’utilitaire de commandes qui permet de générer automatiquement les squelettes de fichiers tels que les modules, services, contrôleurs et autres fournis avec. Assez pratique dans certains cas.
En définitive, après une année passée à construire une plateforme de microservices qui comprend à ce jour une douzaine d’applications et une gateway d’API personnalisée avec NestJS, je dirai que ce framework vaut largement la peine d’être essayé.