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.