Temps de lecture : 13 minutes
Etant le langage de programmation le plus populaire, JavaScript est également l’une des technologies de développement de logiciels les plus universelles. Traditionnellement utilisé comme outil de développement frontal web, il est également devenu un outil majeur de développement mobile multiplateforme en tant que technologie de base pour un grand nombre de plateformes, comme Apache Cordova/PhoneGap, React Native, NativeScript, Appcelerator Titanium.
Mais les domaines d’application de JavaScript ne s’arrêtent pas là. Dernièrement, il y a eu beaucoup de buzz autour de l’utilisation de JavaScript pour la programmation côté serveur. L’un des outils qui a indiqué ce changement dans le développement web était Node.js.
- Qu’est-ce que Node.js?
- Les avantages de Node.js
- ⊕ Pile technologique robuste
- ⊕ Traitement rapide et modèle basé sur les événements
- ⊕ Technologie évolutive pour les microservices
- ⊕ Riche écosystème
- ⊕ Fort soutien de l’entreprise
- ⊕ Prise en charge transparente de JSON
- Les inconvénients de Node.js
- Θ Goulets d’étranglement des performances avec des tâches de calcul lourdes
- Θ Callback hell issue
- Θ Immaturité de l’outillage
- Θ Demande croissante de professionnels expérimentés
- Comment apprendre Node.js
- Node.js vs Ruby on Rails vs Django vs Symfony
- Faire briller Node.js
Qu’est-ce que Node.js?
Node.js n’est en fait pas un framework ou une bibliothèque, mais un environnement d’exécution, basé sur le moteur JavaScript V8 de Chrome.
La technologie a été présentée pour la première fois en 2009 par Ryan Dahl lors de la JSConf européenne annuelle et a été immédiatement reconnue comme « le logiciel unique le plus excitant de l’univers JavaScript actuel ».
En tant que projet open-source, Node.js a été sponsorisé par Joyent, un fournisseur de solutions de cloud computing et d’hébergement. L’entreprise a investi dans un certain nombre d’autres technologies, comme le framework Ruby on Rails, et a fourni des services d’hébergement à Twitter et LinkedIn. Ce dernier est également devenu l’une des premières entreprises à utiliser Node.js pour le backend de ses applications mobiles. La technologie a ensuite été adoptée par un certain nombre de leaders technologiques, comme Uber, eBay, Walmart et Netflix, pour n’en citer que quelques-uns.
Cependant, ce n’est que récemment que l’adoption à grande échelle du JavaScript côté serveur avec Node.js a commencé. L’intérêt pour cette technologie a atteint un pic en 2017, selon Google Trends, et reste élevé.
Téléchargements Node.js. Installez le support à long terme et les dernières versions de Node.js pour Windows et MacOS ici. Aussi, un rappel – npm est distribué avec Node.js out-of-the-box.
Documentation. Trouvez les docs et les guides de démarrage au lien.
Des IDEs Node.js . Presque n’importe quel éditeur de code populaire a un support et des plugins pour JavaScript et Node.js, donc il importe seulement comment vous personnalisez votre IDE à vos besoins de codage. Mais, de nombreux développeurs font l’éloge des outils spéciaux de VS Code, Brackets, Atom, et WebStorm.
Frameworks. L’utilisation d’intergiciels sur Node.js pur est une pratique courante qui facilite la vie des développeurs. Nous avons un article séparé comparant les frameworks Node.js populaires, où nous examinons Express.js, Meteor, Sales.js, Koa.js, Keystone.js et Loopback.js.
Pour plus d’outils de l’écosystème JavaScript utilisés avec Node.js, voir l’article dédié.
Les forces et les faiblesses de Node.js en font le sujet d’une discussion animée. Pour remettre les pendules à l’heure, nous avons analysé les deux – les avantages et les inconvénients de Node.js – pour tenter de savoir quels projets peuvent bénéficier de ce choix technologique. Alors, pourquoi utiliser Node.js?
Une explication rapide de ce qu’est Node.js (s’il vous plaît, abonnez-vous si vous voulez plus de contenu vidéo)
Les avantages de Node.js
⊕ Pile technologique robuste
JavaScript s’est avéré être un leader incontesté parmi les langages de programmation les plus populaires. À son tour, Node.js est devenu un nom à part entière dans l’industrie. Avec un total de 368 985 988 téléchargements et plus de 750 nouveaux contributeurs comme indiqué dans le rapport Node-by-numbers 2018, le projet semble être plus fort que jamais.
Utiliser Node.js pour le backend, vous obtenez automatiquement tous les avantages du développement JavaScript full stack, tels que :
- une meilleure efficacité et une meilleure productivité globale des développeurs
- le partage et la réutilisation du code
- la rapidité et la performance
- le partage facile des connaissances au sein d’une équipe
- un très grand nombre d’outils gratuits
En conséquence, votre équipe est beaucoup plus flexible, le développement prend moins de temps et, par conséquent, vous obtenez des logiciels rapides et fiables. Les développeurs formés au JavaScript frontal peuvent commencer à programmer le côté serveur avec un minimum d’effort. Avec le même langage des deux côtés, vous pouvez réutiliser le code sur le frontend et le backend en l’enveloppant dans des modules et en créant de nouveaux niveaux d’abstraction.
Malgré une croyance commune, en étant un développeur full stack, vous n’êtes en aucun cas limité à la pile traditionnelle MEAN (MongoDB, Express.js, AngularJS et Node.js). Le seul élément indispensable dans ce cas est Node.js (il n’y a pas d’alternative en JavaScript pour la programmation du backend). Le reste des technologies au sein de cette pile sont facultatives et peuvent être remplacées par certains autres outils offrant des fonctionnalités similaires (lisez les alternatives dans notre article séparé).
⊕ Traitement rapide et modèle basé sur les événements
Node.js est rapide ; ce n’est pas un mythe. Jetez un coup d’œil aux tests de performance de toptal.com, qui comparent la façon dont GO, PHP, Java et Node.js traitent les requêtes simultanées. Il y a quelques raisons pour lesquelles Node.js montre de tels résultats :
Moteur V8. Le moteur utilisé dans la mise en œuvre de Node.js a été développé à l’origine pour le navigateur Chrome. Écrit en C++, le V8 de Chrome est utilisé pour compiler les fonctions écrites en JavaScript en code machine, et il fait le travail à une vitesse impressionnante. Il suffit de consulter les benchmarks de performance sur le blog de V8. Grâce à Google qui investit massivement dans son moteur, V8 démontre des améliorations de performance chaque année, et Node.js en extrait tout le sac d’avantages.
L’entrée/sortie non bloquante et la gestion asynchrone des requêtes ont rendu Node.js capable de traiter les requêtes sans aucun retard. Dans le contexte du backend, le traitement synchrone suppose que le code est exécuté dans une séquence. Ainsi, chaque requête bloque un thread, faisant attendre les autres requêtes jusqu’à ce qu’elle soit terminée. Le traitement asynchrone permet de traiter les demandes sans bloquer (E/S non bloquantes) le thread. Ainsi, une fois qu’une demande est traitée, elle peut envoyer un callback et continuer à servir les demandes. Cela aide Node.js à tirer le meilleur parti du single threading, ce qui se traduit par un temps de réponse court et un traitement simultané.
Un autre aspect est le modèle basé sur les événements. Lorsqu’on utilise un langage commun pour les deux côtés client/serveur, la synchronisation se produit rapidement, ce qui est particulièrement utile pour les applications en temps réel basées sur des événements. En raison de sa nature asynchrone, non bloquante et monofilaire, Node.js est un choix populaire pour les jeux en ligne, les chats, les vidéoconférences ou toute solution qui nécessite des données constamment mises à jour.
Les exemples parlent d’eux-mêmes : de nombreuses entreprises de premier plan ont changé de technologie pour développer des applications Node.js et ont remarqué des améliorations significatives – PayPal, par exemple, a remarqué une diminution de 35 % du temps de réponse depuis la migration de Java.
⊕ Technologie évolutive pour les microservices
Puisqu’il s’agit d’un outil technologique léger, l’utilisation de Node.js pour l’architecture de microservices est un excellent choix. Ce style architectural est mieux décrit par Martin Fowler et James Lewis comme « une approche pour développer une application unique comme une suite de petits services, chacun fonctionnant dans son propre processus et communiquant avec des mécanismes légers, souvent une API de ressources HTTP. »
En conséquence, en divisant la logique de l’application en modules plus petits, les microservices, au lieu de créer un seul grand noyau monolithique, vous permettez une meilleure flexibilité et posez les bases d’une croissance ultérieure. Par conséquent, il est beaucoup plus facile d’ajouter d’autres microservices par-dessus ceux qui existent déjà que d’intégrer des fonctionnalités supplémentaires à la fonctionnalité de base de l’app.
Architecture monolithique vs architecture de microservices en bref
Node.js est la technologie de choix lors de la création et du déploiement de solutions d’écosystème de microservices, selon le rapport d’enquête sur les utilisateurs de Node.js 2017. Environ la moitié des personnes interrogées utilisent des technologies liées aux microservices (à savoir Docker, la principale plateforme de conteneurisation de logiciels) pour construire des applications web Node.js :
Pourcentage de développeurs utilisant la conteneurisation Docker avec Node.js
Des résultats plus récents montrent que les technologies liées aux microservices, telles que Docker et Kubernetes, ont connu une croissance de leur utilisation en 2018, car ce style architectural ne devient que plus populaire. Chaque microservice communiquant directement avec la base de données par le biais de flux, une telle architecture permet d’améliorer les performances et la vitesse d’application. Un match made in heaven est soutenu par deux frameworks largement utilisés pour l’architecture microservice. Le framework Express recense IBM et Uber parmi ses utilisateurs, tandis que restify est utilisé par npm et Netflix.
A titre d’exemple de mise en œuvre en direct, le passage de Walmart à une architecture microservices avec Node.js a entraîné les avantages immédiats suivants :
- Une croissance de 20 % de la conversion en général et de 98 % de la conversion mobile du jour au lendemain
- Un temps de disponibilité de cent pour cent lors du Black Friday (traitant plus de 500 millions de pages vues)
- Economiser jusqu’à 40 % sur le matériel et 20 à 50 % sur les opérations globales
Un autre exemple brillant de la façon dont Node.js peut surpasser la concurrence en termes de performance est le cas de GoDaddy. En exécutant la campagne publicitaire du SuperBowl, l’entreprise a pu gérer 10.000 demandes par seconde sans temps d’arrêt, en utilisant seulement 10 pour cent du matériel grâce à Node.js.
⊕ Riche écosystème
Un mot – npm, un gestionnaire de paquets Node.js par défaut, il sert également de marché pour les outils JavaScript open source, ce qui joue un rôle important dans l’avancée de cette technologie. Avec environ 836 000 bibliothèques disponibles dans le registre npm à l’heure actuelle, et plus de 10 000 nouvelles bibliothèques publiées chaque semaine, l’écosystème Node.js est assez riche. Les mêmes statistiques soulignent que 97 % des applications web modernes sont constituées de modules npm. Et c’est la preuve de sa popularité incontestable parmi les développeurs.
Avec une telle variété d’outils gratuits accessibles en quelques clics, il existe un énorme potentiel pour l’utilisation de Node.js. Dans le même temps, les logiciels open source jouissent d’une popularité croissante car ils permettent de construire de nouvelles solutions réduisant les coûts globaux de développement et le temps de mise sur le marché.
⊕ Fort soutien de l’entreprise
Comme mentionné ci-dessus, le développement de Node.js a été soutenu par Joyent. En 2015, la fondation Node.js a été créée pour « permettre une adoption généralisée et aider à accélérer le développement de Node.js. » IBM, Microsoft, PayPal, Fidelity et SAP sont devenus les membres fondateurs de l’organisation.
La liste des organisations utilisant Node.js en production est en constante augmentation. Elle comprend actuellement près de trois cents entreprises bien connues, telles que PayPal, Medium, Trello, Uber et Zendesk.
Très peu de projets open source ont bénéficié d’un soutien aussi fort de la part des principales entreprises mondiales. Et cela laisse présager que Node.js a un potentiel exceptionnel.
⊕ Prise en charge transparente de JSON
Bien que d’autres technologies backend comme PHP et Ruby on Rails puissent utiliser le format JSON pour la communication, Node.js le fait sans convertir entre les modèles binaires et utilise JavaScript. C’est particulièrement pratique lorsque vous devez construire des API RESTful pour le support de bases de données NoSQL, comme MongoDB – la lettre M de la pile MEAN. Cette communication transparente avec l’une des principales normes de transfert de données est un autre avantage de l’écosystème JavaScript.
Les inconvénients de Node.js
Θ Goulets d’étranglement des performances avec des tâches de calcul lourdes
Le plus grand inconvénient de Node.js encore aujourd’hui est son incapacité à traiter les tâches liées au CPU. Mais, pour comprendre quelles sont les racines de ce problème, nous avons besoin d’un peu de contexte. Commençons par les bases, avec JavaScript lui-même.
Comme nous le savons, Node.js est un environnement d’exécution qui exécute JavaScript du côté serveur. Étant un langage de programmation frontale, JavaScript utilise un seul thread pour traiter les tâches rapidement. Le threading n’est pas nécessaire pour qu’il fonctionne, car les tâches en JavaScript sont légères et prennent peu de CPU.
Pour en revenir à Node.js, nous savons maintenant pourquoi il est considéré comme single threaded : Il traite JavaScript, qui est mono-threaded. Un modèle d’entrée/sortie non bloquant signifie que Node.js répond à l’appel du client pour lancer une requête et traite la tâche pendant le temps où il lance le callback, car la tâche est prête. En traitant les tâches de manière asynchrone, Node exécute le code JS sur son unique thread sur la base d’un événement. C’est ce qu’on appelle une boucle d’événement.
Le problème survient lorsque Node.js reçoit une tâche liée au CPU : Chaque fois qu’une demande lourde arrive dans la boucle d’événements, Node.js mettrait tout le CPU disponible pour la traiter en premier, et ensuite répondre aux autres demandes en file d’attente. Cela entraîne un traitement lent et un retard global dans la boucle d’événements, c’est pourquoi Node.js n’est pas recommandé pour les calculs lourds.
Cependant, en 2018, le multithreading a été introduit dans Node.js en tant que fonctionnalité expérimentale avec la mise à jour 10.5.0. Une nouvelle fonctionnalité appelée module worker threads peut être utilisée pour tirer parti de threads supplémentaires d’un pool de threads, afin de porter des tâches liées au CPU. Mais cela n’est possible que sur les machines dotées de plusieurs cœurs, car Node.js vous permet toujours d’utiliser un cœur pour un fil. Cela signifie que les processus parallèles lourds peuvent être exécutés sur un thread différent. Cette fonctionnalité reste expérimentale dans la version 12 de Node.js mais a été considérablement améliorée.
Θ Callback hell issue
En raison de sa nature asynchrone, Node.js s’appuie fortement sur les callbacks, les fonctions qui s’exécutent après que chaque tâche de la file d’attente soit terminée. Garder un certain nombre de tâches en file d’attente en arrière-plan, chacune avec son callback, pourrait aboutir à ce qu’on appelle l’enfer des callbacks, qui a un impact direct sur la qualité du code. En termes simples, il s’agit d’une « situation où les callbacks sont imbriqués dans d’autres callbacks à plusieurs niveaux de profondeur, ce qui rend potentiellement difficile la compréhension et la maintenance du code. »
Exemple de code avec callbacks imbriqués
Image source : callbackhell.com
Pour autant, cela est souvent considéré comme un signe de mauvaises normes de codage et de manque d’expérience avec JavaScript et Node.js en particulier. Le code, représenté ci-dessus, peut être refactoré et simplifié, en quelques étapes seulement, comme le montre callbackhell.com.
Θ Immaturité de l’outillage
Bien que les modules de base de Node.js soient assez stables et puissent être considérés comme matures, il existe de nombreux outils dans le registre npm qui sont soit de mauvaise qualité, soit pas correctement documentés/testés. De plus, le registre lui-même n’est pas assez bien structuré pour proposer les outils en fonction de leur classement ou de leur qualité. Par conséquent, il pourrait être difficile de trouver la meilleure solution pour vos besoins sans savoir ce qu’il faut rechercher.
Le fait que le registre Node.js écosystème est principalement open source, a son impact ainsi. Alors que la qualité de la technologie Node.js de base est supervisée par Joyent et d’autres contributeurs majeurs, le reste des outils pourrait ne pas avoir la qualité et les normes de codage élevées établies par des organisations mondiales.
Θ Demande croissante de professionnels expérimentés
Malgré une croyance commune, tous les développeurs JavaScript ne sont pas non plus des développeurs Node.js. La maîtrise de la programmation JavaScript côté serveur nécessite une quantité importante d’efforts et un certain bagage en matière de développement backend. En raison d’une courbe d’apprentissage aussi raide, le nombre d’ingénieurs Node.js est nettement inférieur au nombre total de professionnels JS.
A mesure que le battage médiatique autour de Node.js continue de croître, la demande de professionnels expérimentés dans ce domaine augmente.
Il y a un grand écart de connaissances entre les étudiants en ingénierie qui commencent à travailler et les besoins des employeurs
Source : HackerRank
Ainsi, avec des millions de développeurs JavaScript, il peut être difficile de trouver un professionnel Node.js compétent pour votre projet. Dans ce cas, vous ne voulez certainement pas limiter votre recherche à un seul pays. La recherche de talents techniques à l’étranger est depuis longtemps devenue la norme dans l’industrie informatique.
Comment apprendre Node.js
Voici votre pack de démarrage pour comprendre et travailler avec Node.js.
Turials. Ne vous limitez pas aux docs officiels : Voyez des tonnes de leçons gratuites sur W3Schools, visitez les ateliers internationaux de Nodeschool, et bien sûr, utilisez la bibliothèque de tutoriels gratuits de freeCodeCamp.
Cours. Si vous êtes un étudiant dévoué, commencez un cours en ligne sur Node.js : en voici un sur PluralSight, et bien sûr, un sur Udemy.
Apprentissage interactif. Voir les ressources gratuites et payantes qui vous permettent d’apprendre Node.js en utilisant des leçons et des exercices interactifs. L’une des plus populaires est The Art of Node.
Communauté. Consultez la liste officielle des projets Node.js gérés par la communauté. Un petit conseil : recherchez les groupes et communautés Facebook dans votre région/première langue. Et bien sûr, référez-vous aux communautés Node.js sur Reddit, à un tag sur StackOverflow, et au sujet sur Quora.
Node.js vs Ruby on Rails vs Django vs Symfony
Il n’y a pas beaucoup de technologies qui peuvent rivaliser avec la popularité de Node.js ou la demande du marché. Cependant, si nous examinons les alternatives pour la programmation côté serveur, nous voyons au moins trois autres étoiles brillantes dans le ciel. Il s’agit de Ruby on Rails, Django et Symfony. Voyons s’ils tiennent tête aux avantages de Node.js et partagent ses inconvénients.
Comparaison des statistiques de Node.js, Rails, Django et Symfony
Source : StackShare
Ruby on Rails est connu pour son langage simple mais opiniâtre et la disponibilité des gems – le propre écosystème de paquets personnalisés de Rails. Ruby lui-même est un langage intuitif et convivial pour les débutants, avec une communauté solidaire et dévouée qui contribue au code de RubyGems. Rails a été créé pour le développement rapide et le prototypage, mais il est utilisé avec succès par des marques telles que GitHub, Twitter et Airbnb, ce qui prouve son large éventail de cas d’utilisation. Sa fonctionnalité de migration de données est particulièrement impressionnante – contrairement à Node.js, qui utilise des packages supplémentaires, Rails dispose déjà d’une fonctionnalité vous permettant de manipuler facilement et de manière cohérente votre base de données.
Quand devriez-vous utiliser Rails plutôt que Node.js ? Rails ne peut pas rivaliser avec les performances et l’évolutivité de Node, cependant, Rails peut être un meilleur choix pour un développement rapide. Node.js doit utiliser des modules tiers pour atteindre cette rapidité de développement, mais Ruby dispose de tout cela de manière non conventionnelle. Quant au langage, aucun outil n’a un avantage distinct – alors que Node.js a une forte demande mais une faible proposition, le vivier de talents de Ruby est initialement plus petit.
Django est un framework web sur Python, le langage de programmation à la croissance la plus rapide selon les données de StackOverflow. Commercialisé comme un outil pour les perfectionnistes avec des délais, il est créé pour faire des applications aussi rapides que possible et de la manière la plus structurée, sécurisée et facile à comprendre. Django, tout comme Python, est également considéré comme ayant une courbe d’apprentissage plus douce. Alors que travailler avec Node.js nécessite une connaissance approfondie de JavaScript, Django est une technologie « piles incluses ». Il dispose d’un panneau d’administration intégré pour mettre à jour et maintenir facilement vos bases de données et vos modèles pour accélérer votre travail.
Quand devriez-vous utiliser Django plutôt que Node.js ? Par rapport à Node.js, Django est un outil convivial pour les débutants. En dehors du langage lui-même, il n’y a pas vraiment de raison de choisir l’un plutôt que l’autre. C’est plus une question de confort et d’expérience avec JavaScript ou Python que les cas d’utilisation spécifiques.
Symfony est un framework PHP qui lui fournit automatiquement plus de 20 ans de documentation et une communauté massive et active. Plus de 80 % du web est alimenté par PHP avec des projets comme Facebook, Baidu, ou tout autre site web fonctionnant sur WordPress. Bien que Symfony ne soit qu’un des frameworks PHP sur le marché, il est impressionnant de stabilité, d’évolutivité et fonctionne bien pour les projets à grande échelle. Il utilise également un moteur de templating Twig qui fonctionne de manière similaire à de nombreux systèmes de gestion de contenu basés sur PHP.
Quand devriez-vous utiliser Symfony plutôt que Node.js ? Symfony prend naturellement en charge les fonctionnalités des CMS telles que les modèles et les tableaux de bord d’administration, ce qui lui permet de faire fonctionner des blogs, des sites d’information et des boutiques de commerce électronique. Certains des exemples incluent Yahoo Answers, Dailymotion, et National Geographic.
Faire briller Node.js
Evidemment, avec tous les avantages et inconvénients énumérés de Node.js, la technologie n’est pas une solution miracle. Mais Java, .Net framework ou PHP ne le sont pas non plus. Pourtant, il existe des cas spécifiques où chacune des technologies listées donne les meilleurs résultats. Pour Node.js, il s’agit d’applications en temps réel avec des entrées/sorties intenses, nécessitant vitesse et évolutivité.
Il peut s’agir de réseaux sociaux, d’applications de jeux, de chats en direct ou de forums ainsi que de logiciels boursiers ou de serveurs publicitaires, où la vitesse est primordiale. Rapide et évolutif, Node.js est la technologie de choix pour les appareils et les applications IoT en temps réel et gourmands en données.
Node.js a fait de JavaScript une technologie full-stack de choix pour le développement d’applications web. En raison de son architecture non bloquante, Node.js fonctionne bien pour le codage et la diffusion de vidéos et d’audio, le téléchargement de plusieurs fichiers et le streaming de données. Ce dernier point pourrait être excessivement utile pour les logiciels de l’industrie du voyage où vous devez sourcer des données à partir de différentes API de différents fournisseurs.
Récemment, Node.js a été activement utilisé dans les logiciels de niveau entreprise. Bien qu’il y ait encore beaucoup d’arguments à ce sujet, de nombreuses grandes entreprises et organisations mondiales, comme Capital One et la NASA, ont déjà adopté Node.js. Et l’écosystème Node.js d’entreprise continue de mûrir avec des outils tels que IBM API Connect, Triton par Joyent, N|Solid par NodeSource, Red Hat OpenShift, Trace par RisingStack et d’autres.
Ce billet fait partie de notre série « Le bon et le mauvais ». Pour en savoir plus sur les avantages et les inconvénients des technologies les plus populaires, consultez les autres articles de la série :
Le bon et le mauvais du développement mobile Xamarin
Le bon et le mauvais du développement JavaScript Full Stack
Le bon et le mauvais de ReactJS et React Native
Le bon et le mauvais du langage de programmation Swift
Le bon et le mauvais de la programmation .NET Framework
Le bon et le mauvais du développement Angular
Le bon et le mauvais de l’outil d’automatisation des tests Selenium
Le bon et le mauvais du développement des applications Android
.