Fermer

mai 31, 2018

Une comparaison côte à côte d'Express, Koa et Hapi.js –


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'application express à la variable app 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éthode http.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 avec Hapi.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 asynchrone server.start () .

Contrairement à Express.js et Koa, la fonction server.start () dans hapi n'est pas un wrapper autour de la méthode native http.createServer () . Il implémente à la place sa propre logique personnalisée

L'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 est app.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 objets de requête et de Node. ctx.body est une méthode dans l'objet réponse et peut être utilisée pour définir le corps de la réponse sur une chaîne Buffer Ruisseau Objet ou null . 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 et gestionnaire ] 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 le h Le paramètre est décrit comme une boîte à outils de réponse

Middleware

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 et response 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 objets demande et dans 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'extension onRequest 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