Express, Koa, Meteor, Sails.js : quatre cadres de l'apocalypse

Publié: 2022-03-11

JavaScript est définitivement devenu l'un des langages les plus populaires ces dernières années, en raison de la demande énorme d'applications Web. Lors du codage pour plusieurs navigateurs, JavaScript est presque le seul choix pour les développeurs front-end. On peut dire qu'il existe CoffeeScript, TypeScript ou Dart comme alternatives. Cependant, la vérité est que CoffeeScript est principalement considéré comme un sucre syntaxique qui se résume finalement à JavaScript. TypeScript est simplement un sur-ensemble de JavaScript qui inclut plusieurs fonctionnalités de langage orienté objet, telles que le typage statique facultatif, les classes et les interfaces, et il en est encore à ses débuts. Dart est également un langage orienté objet qui a une syntaxe de type C, mais il se compile toujours en JavaScript pour les navigateurs grand public.

Avec la naissance et la croissance rapide de Node.js, JavaScript n'est plus confiné au développement front-end, et le développement back-end n'est plus sorcier pour les codeurs front-end. Les gens ont tendance à considérer JavaScript comme une solution miracle qui s'adapte à toutes les situations : front-end, serveur Web, application de bureau, système embarqué, bases de données... la liste ne cesse de s'allonger. En fait, étant donné le large public de JavaScript, Node.js+MongoDB+AngularJS/React a fait un assez grand nombre de développeurs Web full stack. Cependant, Node.js est conçu pour être léger et ne fournit que des fonctionnalités fondamentales en tant que serveur Web pour accélérer la vitesse de développement d'applications Web. L'un des frameworks prêts à l'emploi disponibles sous forme de packages npm serait une meilleure option dans le monde réel.

Dans cet article, nous allons parcourir certains de ces frameworks Node.js bien connus et éprouvés qui ont soulagé les développeurs d'avoir à réinventer la roue encore et encore. Pour être plus précis, dans cet article, nous allons jeter un œil à Express, Koa, Meteor et Sails.js. Au lieu d'essayer de comprendre comment chacun de ces frameworks se comparent les uns aux autres, nous verrons les domaines clés dans lesquels chacun de ces frameworks excelle et comment ils sont pertinents pour les différents besoins du projet.

Express : un framework Web minimaliste

Il va sans dire qu'Express est la plus grosse affaire pour l'entreprise Node.js. Chaque joueur Node.js en a entendu parler et l'utilise avec ou sans s'en apercevoir. Il en est actuellement à sa 4e génération et il existe de nombreux frameworks Node.js basés sur lui ou inspirés par ses concepts.

Performance

La plupart des développeurs adorent Node.js pour sa vitesse brute, et en ce qui concerne la sélection du framework, un perfectionniste peut dédaigner tout risque de performance. Express fournit une fine couche au-dessus de Node.js avec des fonctionnalités d'application Web telles que le routage de base, le middleware, le moteur de modèle et le service de fichiers statiques, afin que les performances d'E/S drastiques de Node.js ne soient pas compromises.

Express est un cadre minimal et sans opinion. il n'applique aucun des modèles de conception courants tels que MVC, MVP, MVVM ou tout ce qui est à la mode. Pour les fans de simplicité, c'est un gros plus parmi tous les autres frameworks car vous pouvez créer votre application avec vos propres préférences et sans courbe d'apprentissage inutile. Ceci est particulièrement avantageux lors de la création d'un nouveau projet personnel sans charge historique, mais à mesure que le projet ou l'équipe de développement grandit, le manque de standardisation peut entraîner un travail supplémentaire pour la gestion du projet/code, et dans le pire des cas, il peut conduire à l'incapacité de maintenir .

Générateur

Même si le cadre n'a pas d'opinion, il possède le générateur qui génère une structure de dossiers de projet spécifique. Après avoir installé le package express-generator npm et créé le squelette de l'application avec la commande du générateur, un dossier d'application avec une hiérarchie claire sera créé pour vous aider à organiser les images, le JavaScript statique frontal, les fichiers de feuille de style et les fichiers de modèle HTML.

 npm install express-generator -g express helloapp
 create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts

Intergiciel

Les intergiciels ne sont essentiellement que des fonctions qui ont un accès complet aux objets de requête et de réponse.

Pile de gestion des demandes

Comme son nom l'indique, le middleware applique certaines instructions de filtrage avant de passer le contrôle à la logique métier réelle ou au niveau suivant du middleware. Certaines tâches courantes, telles que la vérification de l'état de connexion de l'utilisateur, la validation de l'autorité de l'utilisateur ou la prévention des attaques intersites, sont mieux extraites en tant que middleware.

 var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);

Une application Express est essentiellement Node.js avec une multitude de fonctions middleware, que vous souhaitiez personnaliser votre propre middleware ou tirer parti des middlewares intégrés du framework, Express a rendu le processus naturel et intuitif.

Moteur de modèle

Les moteurs de modèles permettent au développeur d'intégrer des variables principales dans les fichiers HTML et, sur demande, le fichier de modèle sera rendu au format HTML brut avec les variables interpolées avec leurs valeurs réelles. Par défaut, le générateur express utilise le moteur de modèle Pug (initialement connu sous le nom de Jade), mais d'autres options telles que Moustache et EJS fonctionnent également avec Express de manière transparente.

Intégration de la base de données

En tant que cadre minimal, Express ne considère pas l'intégration de la base de données comme un aspect requis dans son package, il se penche donc vers aucune utilisation spécifique de la base de données. Lors de l'adoption d'une technologie de stockage de données particulière, que ce soit MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch ou autre chose, il suffit d'installer le package npm particulier en tant que pilote de base de données. Ces pilotes de base de données tiers ne sont pas conformes à la syntaxe unifiée lors de l'exécution d'instructions CRUD, ce qui rend le changement de base de données très compliqué et sujet aux erreurs.

Koa : Utilisation des fonctionnalités JavaScript de nouvelle génération

Koa est développé par l'équipe derrière Express, et son objectif est de minimiser l'Express minimaliste en ne regroupant aucun middleware dans son noyau. En plus d'être sans middleware, Koa ressemble beaucoup à Express, léger et sans opinion. Cependant, ce qui rend Koa vraiment remarquable, c'est sa façon d'abandonner complètement le rappel en utilisant la fonction Générateur ES6.

Flux de contrôle élégant

Javascript est un langage de programmation asynchrone, et avec un tel instinct du langage lui-même et le mécanisme événementiel à thread unique de Node.js, le rappel est partout, d'où l'enfer notoire du rappel.

Une façon d'aplanir l'imbrication des rappels consiste à utiliser Async.js. Async.js fournit des techniques pour mapper, paralléliser, sérialiser ou itérer plusieurs fonctions sans avoir à les intégrer les unes dans les autres, puis à passer le flux de contrôle avec une fonction de rappel, un rappel et une fonction de gestion des erreurs suffisent pour l'essentiel des fonctions regroupées par une méthode Async.js. Pourtant, Async.js ne peut pas effacer les rappels en entier. Lors de l'écriture de code Node.js avec Async.js, l'indentation du code a toujours tendance à dériver vers la droite, mais pas aussi profondément.

Échapper à l'enfer des rappels

Une autre façon plus propre consiste à utiliser des promesses alors valides. Certaines bibliothèques tierces Promise réputées sont bluebird et q. Dans la dernière édition de JavaScript, ES6, Promise a été pris en compte comme une standardisation. Pour faire court, Promise garantit que les fonctions sont exécutées et renvoyées de manière séquentielle en connectant les blocs/fonctions d'implémentation avec un ensemble de fonctions Promise "then". Soit vous "résolvez" à la fin de chaque bloc/fonction d'implémentation afin que la prochaine fonction "alors" soit exécutée, soit vous "rejetez" l'implémentation suivante afin que le flux de contrôle passe directement à la gestion des erreurs. De cette façon, vous regroupez toutes les fonctions de gestion des erreurs en un seul endroit et vous vous débarrassez complètement des rappels.

Maintenant, ES6 apporte un changeur de jeu à la table - ES6 Generator. Cette notion est nouvelle pour JavaScript, mais pas du tout nouvelle dans le monde de la programmation. ES6 Generator est comme une interruption en C, au lieu d'exécuter des lignes de code de haut en bas, ES6 Generator introduit un moyen d'exécuter -> arrêter et exécuter autre chose -> revenir pour terminer ce qui reste.

Koa utilise des générateurs ES6 pour fournir un moyen élégant de gérer la programmation asynchrone JavaScript, vous ne pouvez donc pas voir les rappels dans une application Koa pure. Un cas d'utilisation typique du générateur ES6 dans Koa est la cascade de middleware, qui permet aux middleware personnalisés de s'exécuter les uns après les autres sans aucun rappel désagréable.

 var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);

Nous ne pouvons pas sauter aux conclusions en affirmant que cette technique de pointe est supérieure aux solutions de la vieille école telles que Async.js, Promise ou l'émetteur d'événements, mais une chose est sûre, ce nouveau concept prend un certain temps à s'habituer. Avec la séquence de flux de contrôle non conventionnelle, cela pourrait apporter des difficultés supplémentaires au débogage du code.

Meteor : Framework pour le Web, le mobile et le bureau

Meteor est un framework JavaScript tout-en-un. Se différenciant de la philosophie de simplification d'Express et de Koa, il va à l'autre extrême en se définissant comme un framework full-stack, un package complet qui couvre les applications serveur, mobiles, de bureau et Web.

Forfait un pour tous

Si vous regardez attentivement sous le capot, vous remarquerez que Meteor est vraiment Node.js+Blaze/AngularJS/React+Cordova+MongoDB. Node.js et MongoDB sont respectivement responsables de la logique métier côté serveur et du stockage des données. L'un des Blaze, AngularJS ou React s'occupe de l'interface utilisateur frontale. Et Cordova, en tant que solution HTML la plus célèbre pour les applications hybrides mobiles, relie les pages Web aux vues mobiles.

Synchronisation des données

Le processus principal de partage des données entre le backend et le frontend est le suivant :

  • Le client demande des données ou une certaine vue HTML
  • Le serveur récupère les données de la base de données, mélange les données avec la vue HTML à l'aide d'un moteur de modélisation et les renvoie au frontal
  • Le client restitue et affiche les données/vues de manière conviviale

Une application Web moderne d'une seule page modifie un peu le processus ci-dessus. Prenez AngularJS comme exemple, il place les modèles HTML sous forme de fichiers statiques avec d'autres actifs tels que les fichiers JavaScript frontaux, les feuilles de style et les images. AngularJS remplit ensuite les données dans les modèles HTML en demandant au back-end des données à l'aide de l'API Ajax RESTful. Dans tous les cas, les développeurs back-end sont entièrement responsables du traitement des demandes de modification de données depuis le front-end et de l'enregistrement des modifications dans la base de données.

synchronisation bidirectionnelle des données réalisée automatiquement

L'une des caractéristiques qui distingue Meteor des autres frameworks est son mécanisme de synchronisation des données entre le serveur et les applications front-end/mobiles. Dans Meteor, le client détient un cliché instantané de mini-base de données qui est une petite partie de la réplication de la base de données du serveur, une partie qui est préalablement demandée par le client et autorisée par le serveur. Lorsque le client souhaite apporter des modifications aux données, il utilise l'API de base de données cohérente côté serveur pour exécuter les instructions CRUD, puis les modifications de données seront automatiquement envoyées au serveur et enregistrées dans la base de données réelle. Chaque fois que le serveur détecte des modifications de données, il envoie les données mises à jour à des clients spécifiques qui s'abonnent à ces données. Cette synchronisation bidirectionnelle des données est réalisée automatiquement sans aucune intervention manuelle. Afin de créer cette magie, Meteor utilise WebSocket pour connecter le client et le serveur sous le capot afin que toute modification de données d'un côté soit instantanément répercutée sur l'autre.

Outil d'automatisation de construction

Meteor ne s'occupe pas seulement des applications de serveur et d'applications Web, en utilisant l'outil de construction de Meteor nommé Isobuild avec l'aide de Cordova, une bibliothèque qui regroupe HTML/JavaScript/CSS avec des fonctionnalités mobiles natives, Meteor facilite la création d'applications iOS et Android. Les applications mobiles générées sont des applications hybrides qui exécutent JavaScript ou affichent des pages HTML dans une WebView. Cette solution de contournement peut compromettre une certaine expérience utilisateur par rapport aux applications mobiles natives, mais pour beaucoup, être capable de tout gérer sous la même base de code avec des applications Web est un argument de vente assez important, et cela permet d'économiser une tonne de coûts de développement.

Dans l'ensemble, Meteor est un framework hautement automatisé. Cette automatisation de haut niveau rend la vie des développeurs beaucoup plus facile, mais elle s'accompagne d'un coût de performances compromises et de restrictions d'évolutivité. Au fur et à mesure que la base d'utilisateurs grandit, la technique de synchronisation automatisée des données devient le point d'étranglement de la mise à l'échelle. Pour atteindre la même capacité et les mêmes performances que les autres technologies backend réglées à la main, Meteor consomme généralement beaucoup plus de matériel serveur et de ressources en bande passante. Meteor pourrait donc être un excellent point de départ et une boîte à outils parfaite si l'on veut prototyper un projet pour toutes les principales plates-formes, mais finalement, à un moment donné, l'architecture du système doit être repensée de manière plus professionnelle si le prototype devient un projet de production avec suffisamment base de clientèle.

Sails.js : Framework MVC supérieur pour Node.js

Sails.js partage de nombreuses similitudes avec Express. C'est un générateur de projets, un middleware et un moteur de templates. Il est en fait construit sur Express plus quelques fonctionnalités de niveau supérieur pour accélérer le développement.

MVC

Modèle Vue Contrôleur

Sails.js adopte le modèle de conception Model-View-Controller depuis son noyau. Pour ceux qui viennent de Ruby on Rails ou de Laravel, ils trouveront la structure d'une application Sails.js trop familière. Le modèle représente le modèle de données qui reflète le schéma de la table/collection de la base de données, la vue est une vue HTML avec des données remplies, le contrôleur est l'endroit où vous placez toute la logique métier côté serveur et agit comme un lien entre les données et la vue.

Communication en temps réel

Contrairement à une requête HTTP où le client doit interroger les données du serveur à chaque fois, ou à une longue connexion d'interrogation qui met le serveur en mode inactif, Socket.io établit une communication bidirectionnelle basée sur les événements entre le client et le serveur. Sails.js intègre Socket.io et le complète avec une API de niveau d'abstraction plus élevé pour offrir plus de commodité, ce qui rend Sails.js particulièrement adapté à la création d'applications de chat ou de jeux multijoueurs.

ORM de base de données

ORM de base de données

Entre la logique backend et la manipulation réelle de la base de données, il existe une couche ORM intermédiaire appelée Waterline. En termes simples, cet outil ORM fournit une syntaxe cohérente pour accéder à différentes bases de données sans que les développeurs aient à se soucier de divers langages de requête de base de données, comme SQL vs NoSQL, schéma vs sans schéma, etc.

Sails.js a un degré d'automatisation intermédiaire. Il se concentre sur la logique côté serveur et est prêt pour la production, et il offre un rythme de développement plus rapide qu'Express sans sacrifier les performances ou l'évolutivité future. En particulier pour la grande quantité de passionnés de modèles MVC, Sails.js a une courbe d'apprentissage assez fluide.

Emballer

Cet article ne classe pas les différents frameworks Node.js, il répertorie plutôt les points forts de chaque framework pour se démarquer de la foule afin d'aider les développeurs Node.js à choisir la boîte à outils la plus adaptée lors de la construction d'un projet à partir de zéro.

Alors quel est votre framework Node.js préféré pour le développement web ? Préférez-vous un cadre autre que ceux dont nous avons discuté ci-dessus ? Faites-nous savoir dans la section commentaires ci-dessous.

En rapport:
  • Pourquoi diable devrais-je utiliser Node.js ? Un tutoriel au cas par cas
  • Codage de la fièvre de la cabine : un didacticiel back-end Node.js
  • Construire une API REST Node.js/TypeScript, Partie 1 : Express.js