Dies ist eine große Frage und erfordert eine lange Antwort, um vollständig zu sein. Daher werde ich nur eine Teilmenge der wichtigsten Unterschiede ansprechen. Entschuldigung, dass es immer noch eine lange Antwort ist.
Wie sind sie ähnlich?
Sie haben absolut Recht, wenn Sie sagen:
Für grundlegende Beispiele scheinen sie ähnlich zu sein
Beide Frameworks lösen das gleiche Grundproblem: Bereitstellung einer praktischen API zum Erstellen von HTTP-Servern im Knoten. Das heißt, bequemer als die Verwendung des nativen http
Moduls der unteren Ebene allein. Das http
Modul kann alles, was wir wollen, aber es ist mühsam, Anwendungen mit zu schreiben.
Um dies zu erreichen, verwenden beide Konzepte, die es schon lange in Web-Frameworks auf hoher Ebene gibt: Routing, Handler, Plugins, Authentifizierungsmodule. Sie hatten vielleicht nicht immer die gleichen Namen, aber sie sind ungefähr gleichwertig.
Die meisten grundlegenden Beispiele sehen ungefähr so aus:
- Erstellen Sie eine Route
- Führen Sie eine Funktion aus, wenn die Route angefordert wird, und bereiten Sie die Antwort vor
- Antworten Sie auf die Anfrage
Ausdrücken:
app.get('/', function (req, res) {
getSomeValue(function (obj) {
res.json({an: 'object'});
});
});
Hapi:
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
getSomeValue(function (obj) {
reply(obj);
});
}
});
Der Unterschied ist hier nicht gerade bahnbrechend, oder? Warum also eins über das andere wählen?
Wie unterscheiden sie sich?
Die einfache Antwort lautet: Hapi ist viel mehr und es macht viel mehr Out-of-the-Box. Das ist möglicherweise nicht klar, wenn Sie sich nur das einfache Beispiel von oben ansehen. In der Tat ist dies beabsichtigt. Die einfachen Fälle werden einfach gehalten. Untersuchen wir also einige der großen Unterschiede:
Philosophie
Express soll sehr minimal sein. Indem Sie eine kleine API mit nur einem dünnen Staub darauf bereitstellen http
, sind Sie in Bezug auf das Hinzufügen zusätzlicher Funktionen immer noch sehr allein. Wenn Sie den Text einer eingehenden Anforderung lesen möchten (eine häufig verwendete Aufgabe), müssen Sie ein separates Modul installieren . Wenn Sie erwarten, dass verschiedene Inhaltstypen an diese Route gesendet werden, müssen Sie auch den Content-type
Header überprüfen , um zu überprüfen , um welche es sich handelt, und ihn entsprechend analysieren (z. B. Formulardaten vs JSON vs mehrteilig), häufig unter Verwendung separater Module .
Hapi verfügt über umfangreiche Funktionen, die häufig durch Konfigurationsoptionen verfügbar gemacht werden, anstatt dass Code geschrieben werden muss. Wenn wir beispielsweise sicherstellen möchten, dass ein Anforderungshauptteil (Nutzdaten) vollständig in den Speicher eingelesen und entsprechend analysiert wird (automatisch basierend auf dem Inhaltstyp), bevor der Handler ausgeführt wird, ist dies nur eine einfache Option :
server.route({
config: {
payload: {
output: 'data',
parse: true
}
},
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(request.payload);
}
});
Eigenschaften
Sie müssen nur die API-Dokumentation für beide Projekte vergleichen, um festzustellen, dass Hapi einen größeren Funktionsumfang bietet.
hapi enthält einige der folgenden Funktionen, die Express nicht integriert hat (soweit ich weiß):
Erweiterbarkeit und Modularität
Hapi und Express gehen auf ganz andere Weise auf Erweiterbarkeit ein. Mit Express haben Sie Middleware- Funktionen. Middleware-Funktionen ähneln Filtern, die Sie stapeln und die alle Anforderungen durchlaufen, bevor Sie Ihren Handler erreichen.
hapi hat den Anforderungslebenszyklus und bietet Erweiterungspunkte , die mit Middleware-Funktionen vergleichbar sind, jedoch mehrere definierte Punkte im Anforderungslebenszyklus aufweisen.
Einer der Gründe, warum Walmart Hapi baute und Express nicht mehr verwendete, war die Frustration darüber, wie schwierig es war, eine Express-App in separate Teile aufzuteilen und verschiedene Teammitglieder sicher an ihrem Block arbeiten zu lassen. Aus diesem Grund haben sie das Plugin-System in Hapi erstellt.
Ein Plugin ist wie eine Unteranwendung. Sie können in einer Hapi-App alles tun, Routen, Erweiterungspunkte usw. hinzufügen. In einem Plugin können Sie sicher sein, dass Sie keinen anderen Teil der Anwendung beschädigen, da die Reihenfolge von Registrierungen für Routen spielen keine Rolle und Sie können keine widersprüchlichen Routen erstellen. Sie können diese Plugins dann zu einem Server kombinieren und bereitstellen.
Ökosystem
Da Sie mit Express so wenig sofort einsatzbereit sind, müssen Sie nach draußen schauen, wenn Sie Ihrem Projekt etwas hinzufügen möchten. In den meisten Fällen, wenn Sie mit Hapi arbeiten, ist die Funktion, die Sie benötigen, entweder integriert oder es gibt ein Modul, das vom Kernteam erstellt wurde.
Minimal klingt großartig. Aber wenn Sie eine seriöse Produktions-App erstellen, werden Sie wahrscheinlich all diese Dinge irgendwann brauchen.
Sicherheit
hapi wurde vom Walmart-Team für den Black Friday-Verkehr entwickelt, sodass Sicherheit und Stabilität immer ein Hauptanliegen waren. Aus diesem Grund führt das Framework viele zusätzliche Aufgaben aus, z. B. die Begrenzung der Größe eingehender Nutzdaten, um zu verhindern, dass Ihr Prozessspeicher erschöpft wird. Es gibt auch Optionen für Dinge wie die maximale Verzögerung der Ereignisschleife, den maximalen verwendeten RSS-Speicher und die maximale Größe des v8-Heaps, ab der Ihr Server mit einem Timeout von 503 reagiert und nicht nur abstürzt.
Zusammenfassung
Bewerten Sie beide selbst. Denken Sie über Ihre Bedürfnisse nach und welche der beiden Ihre größten Bedenken anspricht. Tauchen Sie ein in die beiden Gemeinden (IRC, Gitter, Github) und finden Sie heraus, welche Sie bevorzugen. Nimm nicht einfach mein Wort. Und viel Spaß beim Hacken!
HAFTUNGSAUSSCHLUSS: Ich bin voreingenommen als Autor eines Buches über Hapi und das Obige ist größtenteils meine persönliche Meinung.
Meine Organisation geht mit Hapi. Deshalb gefällt es uns.
Hapi ist:
Wenn Sie direkt von Eran Hammer (Hapis Leitung) hören möchten
Der Einstieg in Hapi ist nicht so einfach wie bei ExpressJs, da Hapi nicht die gleiche "Sternenkraft" hat ... aber sobald Sie sich wohl fühlen, erhalten Sie eine Menge Kilometer. Ich habe ungefähr 2 Monate als neuer Hacker gebraucht, der einige Jahre lang verantwortungslos ExpressJs verwendet hat. Wenn Sie ein erfahrener Backend-Entwickler sind, wissen Sie, wie man die Dokumente liest, und Sie werden dies wahrscheinlich nicht einmal bemerken.
Bereiche, in denen sich die Hapi-Dokumentation verbessern kann:
Ich denke, die Authentifizierung wäre der schwierigste Teil davon, da Sie sich entscheiden müssen, welche Authentifizierungsstrategie verwendet werden soll (Basisauthentifizierung, Cookies, JWT-Token, OAuth). Obwohl es technisch gesehen nicht das Problem von Hapi ist, dass die Sitzungs- / Authentifizierungslandschaft so fragmentiert ist ... aber ich wünschte, sie hätten dafür etwas Handarbeit geleistet. Dies würde das Entwicklerglück erheblich steigern.
Die restlichen zwei sind eigentlich nicht so schwierig, die Dokumente könnten nur etwas besser geschrieben werden.
quelle
Kurze Fakten über Hapi oder warum Hapi JS?
Hapi ist konfigurationsorientiert. Es verfügt über eine in das Framework integrierte Authentifizierung und Autorisierung. Es wurde in einer kampferprobten Atmosphäre veröffentlicht und hat sich wirklich bewährt. Alle Module verfügen über eine 100% ige Testabdeckung. Es registriert den höchsten Abstraktionsgrad außerhalb des Kern-HTTP. Leicht zu erfassen über die Plugin-Architektur
In Bezug auf die Leistung ist Hapi die bessere Wahl. Hapi verwendet einen anderen Routing-Mechanismus, der schnellere Suchvorgänge durchführen und die Registrierungsreihenfolge berücksichtigen kann. Trotzdem ist es im Vergleich zu Express recht begrenzt. Und dank des Hapi-Plugin-Systems ist es möglich, die verschiedenen Facetten und Dienste zu isolieren, die der Anwendung in Zukunft in vielerlei Hinsicht helfen würden.
Verwendung
Hapi ist im Vergleich zu Express das am meisten bevorzugte Framework. Hapi wird hauptsächlich für große Unternehmensanwendungen verwendet.
Einige Gründe, warum Entwickler sich beim Erstellen von Unternehmensanwendungen nicht für Express entscheiden, sind:
Routen sind in Express schwieriger zu erstellen
Middleware stört die meiste Zeit. Jedes Mal, wenn Sie die Routen definieren, müssen Sie so viele Codes schreiben.
Hapi ist die beste Wahl für Entwickler, die eine RESTful-API erstellen möchten. Hapi verfügt über eine Mikrodienstarchitektur und es ist auch möglich, die Steuerung basierend auf bestimmten Parametern von einem Handler auf einen anderen zu übertragen. Mit dem Hapi-Plugin können Sie eine höhere Abstraktionsebene rund um HTTP genießen, da Sie die Geschäftslogik in Teile aufteilen können, die leicht zu verwalten sind.
Ein weiterer großer Vorteil von Hapi ist, dass es bei einer Fehlkonfiguration detaillierte Fehlermeldungen liefert. Mit Hapi können Sie auch standardmäßig die Größe Ihres Datei-Uploads konfigurieren. Wenn die maximale Upload-Größe begrenzt ist, können Sie dem Benutzer eine Fehlermeldung senden, die besagt, dass die Dateigröße zu groß ist. Dies würde Ihren Server vor einem Absturz schützen, da beim Hochladen von Dateien nicht mehr versucht wird, eine ganze Datei zu puffern.
Was immer Sie mit Express erreichen können, können Sie auch mit hapi.js problemlos erreichen.
Hapi.js ist sehr stilvoll und organisiert den Code sehr gut. Wenn Sie sehen, wie es Routing macht und die Kernlogik in Controllern steckt, werden Sie es trotzig lieben.
Hapi.js bietet offiziell mehrere Plugins exklusiv für hapi.js an, von tokenbasierter Authentifizierung über Sitzungsverwaltung bis hin zu vielen weiteren Plug-ins. Dies bedeutet nicht, dass das traditionelle npm nicht verwendet werden kann. Alle werden von hapi.js unterstützt
Wenn Sie in hapi.js codieren, ist ein Code sehr wartbar.
quelle
Ich habe vor kurzem angefangen, Hapi zu verwenden und bin ziemlich zufrieden damit. Meine Gründe sind
Einfacher zu testen. Beispielsweise:
server.inject
Ermöglicht es Ihnen, die App auszuführen und eine Antwort zu erhalten, ohne dass sie ausgeführt und abgehört wird.server.info
gibt die aktuelle uri, port etc. an.server.settings
Zugriff auf die Konfiguration, z. B.server.settings.cache
Abrufen des aktuellen Cache-Anbieters/test
Ordner für einen Teil der App oder die unterstützten Plugins an, um Vorschläge zum Verspotten / Testen / Stub usw. zu erhalten.Es funktioniert sofort , z. B. Datei-Uploads , Rückgabe von Streams von Endpunkten usw.
Wichtige Plugins werden zusammen mit der Kernbibliothek verwaltet. zB Vorlagenanalyse , Caching usw. Der zusätzliche Vorteil besteht darin, dass die gleichen Codierungsstandards für alle wesentlichen Dinge angewendet werden.
Vernünftige Fehler und Fehlerbehandlung. Hapi überprüft die Konfigurationsoptionen und führt eine interne Routentabelle, um doppelte Routen zu vermeiden. Dies ist beim Lernen sehr nützlich, da Fehler frühzeitig ausgelöst werden und nicht unerwartete Verhaltensweisen, die ein Debugging erfordern.
quelle
Nur ein weiterer Punkt, den man hinzufügen sollte: Hapi unterstützt ab Version 16 "http2" -Aufrufe (wenn ich mich nicht irre). Express muss das 'http2'-Modul jedoch noch direkt bis Express 4 unterstützen. Obwohl die Funktion in der Alpha-Version von Express 5 veröffentlicht wurde.
quelle
quelle
quelle