Si vous êtes un développeur Node.js, il est probable que vous ayez, à un certain moment, utilisé Express.js pour créer vos applications ou API. Express.js est un framework Node.js très populaire, et a même d'autres frameworks construits dessus Sails.js kraken.js KeystoneJS et beaucoup d'autres . Cependant, au milieu de cette popularité, un tas d'autres frameworks ont attiré l'attention dans le monde de JavaScript, comme Koa et hapi.
Dans cet article, nous examinerons Express.js, Koa et hapi.js – leurs similitudes, Différences et cas d'utilisation
Arrière-plan
Commençons par présenter chacun de ces cadres séparément
Express.js
Express.js est décrit comme l'infrastructure de serveur standard pour Node.js. Il a été créé par TJ Holowaychuk acquis par StrongLoop en 2014, et est actuellement maintenu par l'incubateur de la Fondation Node.js . Avec environ 170+ millions de téléchargements l'année dernière il est actuellement hors de doute que c'est le framework Node.js le plus populaire.
Koa
Développement commencé le Koa en retard 2013 par les mêmes gars à Express. C'est ce qu'on appelle le futur d'Express. Koa est également décrite comme une version beaucoup plus moderne, modulaire et minimaliste du framework Express
Hapi.js
Hapi.js a été développé par l'équipe de Walmart Labs (dirigée par ). ] Eran Hammer ) après avoir essayé Express et découvert que cela ne fonctionnait pas pour leurs besoins. Il a été développé à l'origine sur Express, mais au fil du temps, il est devenu un framework à part entière
Fun Fact: hapi est l'abréviation de Http API server
Philosophy
Maintenant que nous en avons Dans le contexte des frameworks et comment ils ont été créés, comparons chacun d'entre eux en fonction de concepts importants, tels que leur philosophie, leur routage, etc.
Note: tous les exemples de code sont en ES6 et utilisent la version 4 d'Express .js, 2.4 de Koa, et 17 pour hapi.js.
Express.js
Express a été conçu pour être un framework web simple et non-dopé. De son GitHub README :
La philosophie d'Express est de fournir de petits outils robustes pour les serveurs HTTP, ce qui en fait une excellente solution pour les applications monopages, les sites Web, les hybrides ou les API publiques HTTP. ] Express.js est minimal et ne possède pas beaucoup de fonctionnalités hors de la boîte. Il ne force pas les choses comme la structure de fichier, ORM ou moteur de template
Koa
Tandis que Express.js est minimal, Koa peut se vanter d'une empreinte de code beaucoup plus minimaliste – environ 2k LOC . Son but est de permettre aux développeurs d'être encore plus expressifs. Comme Express.js, il peut facilement être étendu en utilisant des plugins et middleware existants ou personnalisés. Il est plus futuriste dans son approche, en ce sens qu'il s'appuie fortement sur les nouvelles fonctionnalités JavaScript comme les générateurs et async / await .
Hapi.js
Hapi.js se concentre plus sur la configuration et fournit beaucoup plus de fonctionnalités que Koa et Express.js. Eran Hammer l'un des créateurs de hapi, décrit la raison de la construction du framework correctement dans son blog :
hapi a été créé autour de l'idée que la configuration est meilleure que le code , cette logique métier doit être isolée de la couche de transport et les constructions de nœud natif telles que les tampons et les flux doivent être prises en charge en tant qu'objets de première classe.
Démarrage d'un serveur
besoin de faire dans nos projets. Examinons comment cela peut être fait dans les différents cadres. Nous allons démarrer un serveur et écouter sur le port 3000 dans chaque exemple.
Express.js
const express = require ('express'); const app = express (); app.listen (3000, () => console.log ('App écoute sur le port 3000!'));
Le démarrage d'un serveur dans Express.js est aussi simple que le paquetage
express
initialisant l'applicationexpress
à la variableapp
et appelant le] app.listen ()
méthode, qui est juste un wrapper autour de la méthode native Node.js http.createServer () .Koa
Démarrer un serveur à Koa est assez similaire à Express.js:
const Koa = require ('koa'); const app = nouveau Koa (); app.listen (3000, () => console.log ('App écoute sur le port 3000!'));
La méthode
app.listen ()
dans Koa est également un wrapper autour de la méthodehttp.createServer ()
Hapi.js
Démarrage d'un serveur hapi.js est tout à fait un départ de ce que beaucoup d'entre nous peuvent être habitués à Express:
const Hapi = require ('hapi'); serveur const = Hapi.server ({ hôte: 'localhost', port: 3000 }); async function start () { essayez { attendez server.start (); } catch (err) { console.log (err); process.exit (1); } console.log ('Serveur s'exécutant à:', server.info.uri); } début();
Dans le bloc de code ci-dessus, nous demandons d'abord le paquet
hapi
puis instancions un serveur avecHapi.server ()
qui contient un seul objet config contenant l'hôte et paramètres de port. Ensuite, nous démarrons le serveur avec la fonction asynchroneserver.start ()
.Contrairement à Express.js et Koa, la fonction
server.start ()
dans hapi n'est pas un wrapper autour de la méthode nativehttp.createServer ()
. Il implémente à la place sa propre logique personnaliséeL'exemple de code ci-dessus provient du site Web hapi.js et montre l'importance que les créateurs de hapi.js accordent à la configuration et à la gestion des erreurs
Routing
Routing aspect clé des applications Web modernes. Définissons une route
/ hello
pour une application Hello World simple dans chaque framework pour avoir une idée du fonctionnement du routage pour eux.Express.js
app.get ('/ hello', (req, res) => res.send ('Bonjour tout le monde!'));
Créer des routes dans Express est aussi simple que d'appeler l'objet
app
avec la méthode HTTP requise. La syntaxe estapp.METHOD (PATH, HANDLER)
où PATH est le chemin sur le serveur et HANDLER est la fonction qui est appelée quand le chemin est apparié.Koa
Koa ne le fait pas avoir son propre routeur livré avec elle, nous devrons donc utiliser un middleware de routeur pour gérer le routage sur les applications Koa. Deux options de routage courantes sont koa-route et koa-router . Voici un exemple utilisant koa-route:
const route = require ('koa-route'); app.use (route.get ('/ hello', ctx => { ctx.body = 'Bonjour tout le monde!'; }));
Nous pouvons voir immédiatement que Koa a besoin que chaque route soit définie comme un middleware sur l'application. Le
ctx
est un objet contextuel qui contient les objetsde requête
etde Node.
ctx.body
est une méthode dans l'objetréponse
et peut être utilisée pour définir le corps de la réponse sur unechaîne
Buffer
Ruisseau
Objet
ounull
. Le deuxième paramètre de la méthode route peut être une fonction asynchrone ou génératrice, donc l'utilisation des callbacks est réduite.Hapi.js
server.route ({ méthode: 'GET', chemin: '/ bonjour', handler: function (requête, h) { retour 'Bonjour tout le monde!'; } });
La méthode
server.route ()
dans hapi prend un seul objet de configuration avec les paramètres suivants:méthode
chemin
etgestionnaire
] Vous pouvez voir la documentation sur le routage dans hapi ici .Le paramètre
request
dans la fonction handler est un objet qui contient les détails de la requête de l'utilisateur, alors que leh
Le paramètre est décrit comme une boîte à outils de réponseMiddleware
L'un des concepts majeurs auxquels les développeurs de nœuds sont habitués est de travailler avec le middleware. Les fonctions de middleware sont des fonctions situées entre les requêtes et les réponses. Ils ont accès aux objets
request
etresponse
et peuvent exécuter le middleware suivant après avoir été traités. Jetons un coup d'oeil à la façon dont ils sont définis dans les différents cadres en implémentant une fonction simple qui enregistre l'heure à laquelle une requête est faite au serveur.Express.js
app.use ((req, res, next ) => { console.log (`Time: $ {Date.now ()}`); prochain(); })
L'enregistrement de middleware dans Express.js est aussi simple que de lier l'intergiciel à l'objet d'application en utilisant la fonction
app.use ()
. Vous pouvez en lire plus sur le middleware dans Express.js ici .Koa
app.use (async (ctx, next) => { console.log (`Time: $ {Date.now ()}`); attendez ensuite (); });
L'enregistrement Middleware dans Koa est similaire à Express.js. Les différences majeures sont que l'objet contexte (
ctx
) est utilisé à la place des objetsdemande
etdans Express.js et Koa embrasse le paradigme async / await moderne pour définir la fonction middleware
Hapi.js
server.ext ('onRequest', (request, h) => { console.log (`Time: $ {Date.now ()}`); retour h.continue; });
Dans hapi.js, il existe certains points d'extension dans le [lifecyle de requête] . La méthode
server.ext ()
enregistre une fonction d'extension à appeler à un certain point du cycle de vie de la requête. Vous pouvez en lire plus à ce sujet ici . Nous utilisons le point d'extensiononRequest
dans l'exemple ci-dessus pour enregistrer une fonction middleware (ou extension).Utilisation
D'après les comparaisons et les exemples de code que nous avons vus ci-dessus, il est clair que Express et Koa sont les plus similaires, avec hapi.js étant le cadre pour dévier de la norme à laquelle les développeurs Node.js sont habitués. Par conséquent, hapi.js n'est peut-être pas le meilleur choix lorsque vous essayez de créer une application rapide et facile, car il faudra un peu de temps pour s'y habituer.
À mon avis, Express est toujours un excellent choix pour construire de petites … aux applications de taille moyenne. Il peut devenir un peu compliqué à gérer pour de très grandes applications, car il ne possède pas la modularité que hapi.js a intégrée, avec le support des plugins personnalisés et sa méthode de routage unique Cependant, il y a eu quelques spéculations ces derniers temps concernant le futur d'Express.js puisque TJ a annoncé qu'il ne travaillait plus dessus et le taux réduit auquel les mises à jour sont expédiées . Peu c'est assez stable et ne partira pas bientôt. Il a également une grande communauté de développeurs qui construisent diverses extensions et plugins.
Comme Express.js, Koa est bien adapté pour de nombreux projets Node.js simples. Il ne comprend que le strict minimum (il n'a pas de middleware intégré) et encourage les développeurs à ajouter ce dont ils ont besoin en construisant ou en utilisant des logiciels intermédiaires externes disponibles. Il utilise les fonctions modernes du générateur JavaScript et async / attend beaucoup, ce qui le rend un peu futuriste dans son approche. Son modèle en cascade est très bon, car il facilite la mise en œuvre et la compréhension du flux de middleware dans vos applications. Koa ne sera probablement pas un bon choix pour vous si vous n'êtes pas encore prêt à embrasser de nouvelles choses brillantes comme les fonctions de générateur, ou si vous n'êtes pas prêt à passer du temps à construire tous les intergiciels dont vous avez besoin. Le support de la communauté pour Koa est en croissance rapide, car il dispose d'une bonne quantité de middleware externe déjà construit (certains par l'équipe Koa de base) pour des tâches courantes telles que le routage, la journalisation, etc.
Hapi.js est le choix définitif si vous et votre équipe préférez consacrer plus de temps à la configuration qu'à la programmation des fonctionnalités. Il a été construit pour être modulaire et pour de grandes applications avec de grandes équipes. Il encourgages l'architecture de micro-service, comme diverses parties de votre application peuvent être construites en tant que plugins et enregistrées sur votre serveur avant de le lancer. Hapi.js est soutenu par de grandes entreprises telles que Auth0 et Lob, donc il a un très bon futur devant lui et ne partira pas de sitôt. Il est également approuvé par certains grands noms, comme vu sur leur page de communauté .
Hapi.js a beaucoup plus de fonctionnalités que Koa et Express.js, comme le support de l'authentification, la mise en cache, la journalisation, la validation, etc., ce qui lui donne l'impression d'être un framework à part entière. Vous pouvez consulter leur page de tutoriels pour avoir une bonne idée des fonctionnalités qu'ils fournissent. Il n'y a pas encore beaucoup de projets open-source et de plugins construits sur et pour hapi.js, donc beaucoup de travail pourrait devoir être fait par les développeurs qui l'utilisent s'ils envisagent d'étendre sa fonctionnalité de base.
Conclusion
Ces trois cadres sont d'excellents choix pour démarrer de nouveaux projets, mais en fin de compte votre choix sera basé sur les exigences du projet, les membres de votre équipe et le niveau de flexibilité que vous recherchez.
Source link