NodeJS est une plateforme qui s’appuie sur le moteur JavaScript de Chrome permettant de développer rapidement des applications réseau rapides et évolutives. NodeJS utilise un modèle événementiel, aux E/S non bloquantes qui le rend léger et efficace, idéal pour les applications gérant d’importants volumes de données en temps réel sur des dispositifs distribués.
Je vous invite à lire un article où je fais mon mea culpa et avoue m’être converti à NodeJS, non sans réticence au début mais totalement séduit aujourd’hui !
Pourquoi NodeJs est-il de plus en plus utilisé ?
1) Une syntaxe bien connue des développeurs web
NodeJS utilise JavaScript, un langage très utilisé par les développeurs web dans les applications front-end, côté navigateur. L’interpréteur de syntaxe JavaScript NodeJS a été réécrit et compilé en C++ ce qui en fait un interpréteur JavaScript bien plus rapide que celui du navigateur.
2) Un système complètement ou partiellement asynchrone
Un système asynchrone permet d’accélérer les applications web. Il est par exemple facile de pousser de gros volumes de données via une requête sans bloquer le serveur qui reste ainsi disponible pour traiter d’autres tâches.
De plus, un système complètement asynchrone basé sur des événements garantit un feedback rapide et qualitatif.
3) Une gestion ASYNCHRONE d’upload pour les gros fichiers ou jeux de données importants
NodeJS présente de nombreux avantages, en voici quelques exemples :
Imaginons que vous ayez à construire une galerie où les gens postent des vidéos et que vous aimeriez poster des vidéos sur une page web, faire des vignettes, stocker des fichiers et lier des fichiers à une base de données où vous stockerez le nom / la description et les fichiers URL. Avec NodeJS vous pourrez facilement :
- Traiter les données du formulaire et les valider avant même que le fichier vidéo soit complètement uploadé sur le serveur.
- Vérifier que le fichier posté soit bien une vidéo dès les premiers octets transférés sans avoir besoin d’attendre l’upload complet du fichier.
- Faire une vignette de la vidéo dès les 2 premiers Mo reçus.
Ainsi, imaginons que l’utilisateur uploade un gros fichier (10 Mo et plus), il sera tout à fait possible de valider les autres données du formulaire immédiatement sans devoir attendre la fin du processus de téléchargement. Ceci s’avère très pratique dans les cas où les données saisies ne sont pas conformes car on peut alors simplement arrêter l’upload et afficher une page d’erreur.
4) NodeJS ne s’arrête pas là !
NodeJS est la solution idéale pour les applications web utilisant http et ws (web sockets). Avec NodeJS, la gestion des périphériques matériels via les différents ports série et protocoles de communication est très simple.
NodeJS permet également d’instancier plusieurs serveurs HTTP / WebSocket / FTP / telnet sur une même instance, et sur un seul et même processus. Ainsi, on peut permettre à un serveur d’accéder très rapidement aux mêmes références mémoire (RAM) sans devoir les stocker temporairement ou devoir construire des protocoles de partage compliqués entre les serveurs.
5) Protégez vos sources avec NodeJS !
La première chose à faire selon moi pour protéger les applications des attaques est de bien configurer les en-têtes HTTP. Je tiens à vous citer un package incontournable (Helmet) et un outil qui pourra se révéler bien utile pour faire un bilan de votre exposition à des attaques (Snyk).
Helmet est un module NPM qui propose 9 fonctions afin de sécuriser les en-têtes HTTP contre le cross-site scripting, le clickjacking ou encore les attaques d’intercepteur avec de faux certificats..
Snyk est une solution de protection d’open source qui recherche et corrige automatiquement les vulnérabilités des dépendances..
Nous pouvons également citer les cloud balancers, WAF et middlewares limitatifs pour protéger les applications des attaques DDoS.
6) NodeJS facilite la création des microservices
De plus en plus d’applications ont franchi le pas et ont abandonné l’architecture monolithique pour celle des microservices. Celle-ci ne manque pas d’arguments :
- Parce que chaque microservice est entièrement autonome avec sa propre base de données ou sous-modèle, la mise à jour de l’application est plus simple et rapide. Les risques de bugs et d’indisponibilité de l’application sont également réduits.
- Le cloisonnement de chaque microservice permet d’utiliser des technologies complètement différentes. On peut profiter des dernières avancées technologiques sans se soucier du langage, framework ou environnement.
- Les équipes de développeurs sont plus autonomes et productives car il n’est plus nécessaire de se consulter pour une quelconque compatibilité technique entre chaque module.
Netflix, Pinterest, Paypal ou encore GoDaddy ont choisi une architecture microservice en NodeJS et tirent les conclusions suivantes :
- la richesse de NodeJS évite des heures de développement et ses modules sont utilisables immédiatement. Avec un langage commun au front-end et au back-end, les développeurs peuvent intervenir plus rapidement, des modifications sont faites en moins de temps et avec moins de ressources humaines.
- Les microservices basés sur NodeJS (en particulier via Express) offrent un temps de réponse extrêmement rapide et à charge égale contre un autre langage, Node.js n’utilise que 10% du disque dur.
Pour ce faire, de nombreux frameworks NodeJS existent : Express, Restify, Koa, Loopback, ou encore HAPI.
7) Scrapez simplement avec NodeJS
NodeJS utilise le moteur JavaScript (sans doute l’un des langages de programmation les plus populaires et les plus utilisés mais aussi le plus controversé ?) pour exécuter différents codes afin de récupérer facilement du contenu web dynamique. Pour du scraping, les packages JavaScript ne manquent pas : Request, Cheerio, Osmosis, Puppeteer, ou Apify SDK.
Que dire d’autre sur NodeJS ? En fait, il s’agit tout simplement d’un concept de développement qui offre de nouvelles possibilités pour des développements plus rapides et de meilleure qualité. C’est pour cela que je pense que NodeJS a un avenir très prometteur dans le développement de nombreux projets ! Et d’ailleurs cela fait déjà près de 10 ans qu’il existe et résiste à toutes les critiques !!!
Note de l’auteur : l’article a été publié une première fois en 2014 et a été mis à jour au regard des nouvelles connaissances acquises sur le sujet.
Consultez aussi :
Frontend, je ne boirai pas de ton Node
NodeJS : la manière la plus intelligente de programmer des objets intelligents
Sébastien Louchart
mai 13, 2019 à 15:00Node.js est sur scène et en tournée depuis pas mal de temps maintenant. Cet article est bienvenu mais il arrive un peu après la bataille 😉 Mais il est toujours bon de faire une piqûre de rappel. Il existe un frein à l’adoption plus large de Node.js comme moteur de serveur web. Ce frein s’appelle Javascript. On pourra gloser tant et tant sur les qualités du langage mais le problème vient avant tout de l’organisation des équipes de développement web et des architectures figées : une équipe serveur qui développe en PHP et une équipe client qui développe avec HTML et Javascript. Ces derniers ont bien intégré l’aspect asynchrone et les fonctions de rappel (callback) qui sont à la base d’Ajax. Mais les premiers en sont restés au niveau synchrone (pour les E/S) et non-distribué (pour les processus). On voit ici que le principe de Conway est encore à l’oeuvre. Ainsi favoriser l’adoption de Node.js (ou des équivalents sous Python comme tornado, twisted ou asyncio) impose de repenser l’organisation des équipes de développement (1 architecte unique et des développeurs qui connaissent l’ensemble des technologies Js+html+css+backends). Un autre aspect de Node.js que l’article n’évoque pas c’est son apport en tant que technologie de développement rapide de web services REST ou de services multi-protocoles sans état. Lancer un serveur HTTP sous Node.js prend deux lignes de codes, créer un service REST nécessite 4 callbacks (GET, PUT, POST, DELETE). Le côté asynchrone des E/S de Node.js permet d’externaliser complètement l’état de l’application et du service dans les back-ends (comme REDIS et/ou MongoDB) et ainsi d’avoir des services très sûrs et parfaitement redémarrables. Et comme l’union fait la force, tous ces services qui sont autant de processus node.js peuvent être contrôlés par ZooKeeper pour encore plus de sûreté.
Sébastien Louchart
mai 13, 2019 à 15:10Une petite correction : Node.js ne permet pas d’instancier plusieurs sockets depuis un même processus s’ils partagent le même port (c’est possible mais c’est délicat). En revanche, il est possible d’instancier des processus enfants mais pourquoi s’embêter puisqu’on n’en a pas besoin grâce aux E/S asynchrones (du moins pour les tâches intensives en E/S). Certaines tâches intensives en calcul on besoin de parallélisme mais, dans ce cas, mieux vaux les déléguer à des services autonomes (et appelés de manière asynchrone) développés en Python et/ou C++, langages plus aptes pour le développement d’algorithmes gourmands en puissance CPU.