Express, Koa, Meteor, Sails.js: Vier Frameworks der Apokalypse

Veröffentlicht: 2022-03-11

JavaScript hat sich in den letzten Jahren aufgrund der enormen Nachfrage nach Webanwendungen definitiv zu einer der beliebtesten Sprachen entwickelt. Beim Codieren für mehrere Browser ist JavaScript fast die einzige Wahl für Frontend-Entwickler. Man mag argumentieren, dass es als Alternativen CoffeeScript, TypeScript oder Dart gibt. Die Wahrheit ist jedoch, dass CoffeeScript meistens als syntaktischer Zucker angesehen wird, der schließlich auf JavaScript hinausläuft. TypeScript ist einfach eine Obermenge von JavaScript, die mehrere objektorientierte Sprachfunktionen enthält, wie z. B. optionale statische Typisierung, Klassen und Schnittstellen, und steckt noch in den Anfängen. Dart ist auch eine objektorientierte Sprache, die eine C-ähnliche Syntax hat, aber dennoch für Mainstream-Browser zu JavaScript kompiliert wird.

Mit der Geburt und dem schnellen Wachstum von Node.js ist JavaScript nicht mehr auf die Front-End-Entwicklung beschränkt, und die Back-End-Entwicklung ist für Front-End-Programmierer kein Hexenwerk mehr. Die Leute neigen dazu, JavaScript als Wunderwaffe zu betrachten, die in alle Situationen passt: Frontend, Webserver, Desktop-Anwendung, eingebettetes System, Datenbanken … die Liste wird immer länger. Angesichts des weit verbreiteten Publikums von JavaScript hat Node.js+MongoDB+AngularJS/React tatsächlich eine ziemlich große Anzahl von Full-Stack-Webentwicklern hervorgebracht. Node.js ist jedoch leichtgewichtig und bietet nur grundlegende Funktionen als Webserver, um die Entwicklungsgeschwindigkeit von Webanwendungen zu erhöhen. Eines der guten Frameworks, die als npm-Pakete verfügbar sind, wäre in der realen Welt eine bessere Option.

In diesem Beitrag gehen wir durch einige dieser bekannten und bewährten Node.js-Frameworks, die es Entwicklern ersparen, das Rad immer wieder neu erfinden zu müssen. Um genauer zu sein, werfen wir in diesem Artikel einen Blick auf Express, Koa, Meteor und Sails.js. Anstatt zu versuchen, herauszufinden, wie sich jedes dieser Frameworks gegeneinander schlägt, werden wir die Schlüsselbereiche sehen, in denen sich jedes dieser Frameworks auszeichnet, und wie sie für verschiedene Projektanforderungen relevant sind.

Express: Ein minimalistisches Web-Framework

Es versteht sich von selbst, dass Express der größte Deal für Node.js Geschäft ist. Jeder Node.js-Spieler hat davon gehört und verwendet es mit oder ohne es zu bemerken. Es befindet sich derzeit in der 4. Generation, und es gibt eine ganze Reihe von Node.js-Frameworks, die darauf basieren oder von seinen Konzepten inspiriert sind.

Leistung

Die meisten Entwickler lieben Node.js wegen seiner rohen Geschwindigkeit, und wenn es um die Auswahl des Frameworks geht, mag ein Perfektionist jede Leistungsgefährdung verachten. Express bietet eine dünne Schicht auf Node.js mit Webanwendungsfunktionen wie grundlegendem Routing, Middleware, Template-Engine und Bereitstellung statischer Dateien, sodass die drastische E/A-Leistung von Node.js nicht beeinträchtigt wird.

Express ist ein minimales, unparteiisches Framework. es wendet keines der vorherrschenden Designmuster wie MVC, MVP, MVVM oder was auch immer im Trend liegt, an. Für Fans der Einfachheit ist dies ein großes Plus unter allen anderen Frameworks, da Sie Ihre Anwendung nach Ihren eigenen Vorlieben und ohne unnötige Lernkurve erstellen können. Dies ist besonders vorteilhaft, wenn Sie ein neues persönliches Projekt ohne historische Belastung erstellen, aber wenn das Projekt oder das Entwicklungsteam wächst, kann ein Mangel an Standardisierung zu zusätzlicher Arbeit für das Projekt-/Code-Management führen und im schlimmsten Fall dazu führen, dass es nicht mehr gewartet werden kann .

Generator

Obwohl das Framework keine Meinung hat, verfügt es über den Generator, der eine spezifische Projektordnerstruktur generiert. Nach der Installation des Express-Generator-npm-Pakets und dem Erstellen des Anwendungsskeletts mit dem Generatorbefehl wird ein Anwendungsordner mit klarer Hierarchie erstellt, um Ihnen beim Organisieren von Bildern, statischem Front-End-JavaScript, Stylesheet-Dateien und HTML-Vorlagendateien zu helfen.

 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

Middleware

Middleware sind im Grunde nur Funktionen, die vollen Zugriff auf Request- und Response-Objekte haben.

Anforderungsbearbeitungsstapel

Wie der Name schon sagt, wendet Middleware einige Filteranweisungen an, bevor sie die Kontrolle an die eigentliche Geschäftslogik oder die nächste Ebene der Middleware übergibt. Einige gängige Aufgaben wie die Überprüfung des Benutzeranmeldestatus, die Überprüfung der Benutzerautorität oder die Verhinderung von Cross-Site-Angriffen werden am besten als Middleware extrahiert.

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

Eine Express-Anwendung ist im Wesentlichen Node.js mit einer Vielzahl von Middleware-Funktionen. Egal, ob Sie Ihre eigene Middleware anpassen oder die Vorteile der integrierten Middleware des Frameworks nutzen möchten, Express hat den Prozess natürlich und intuitiv gestaltet.

Template-Engine

Vorlagen-Engines ermöglichen es Entwicklern, Backend-Variablen in HTML-Dateien einzubetten, und auf Anfrage wird die Vorlagendatei in ein einfaches HTML-Format gerendert, wobei die Variablen mit ihren tatsächlichen Werten interpoliert werden. Standardmäßig verwendet der Express-Generator die Vorlagen-Engine Pug (ursprünglich bekannt als Jade), aber andere Optionen wie Moustache und EJS funktionieren auch nahtlos mit Express.

Datenbankintegration

Als minimales Framework betrachtet Express die Datenbankintegration nicht als erforderlichen Aspekt innerhalb seines Pakets, daher tendiert es zu keinerlei spezifischer Datenbanknutzung. Bei der Übernahme einer bestimmten Datenspeichertechnologie, sei es MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch oder etwas anderes, muss lediglich das jeweilige npm-Paket als Datenbanktreiber installiert werden. Diese Datenbanktreiber von Drittanbietern entsprechen nicht der einheitlichen Syntax, wenn sie CRUD-Anweisungen ausführen, was das Wechseln von Datenbanken zu einem großen Aufwand und fehleranfällig macht.

Koa: Verwendung von JavaScript-Funktionen der nächsten Generation

Koa wird von dem Team hinter Express entwickelt, und sein Ziel ist es, das minimalistische Express zu minimieren, indem keine Middleware in seinem Kern gebündelt wird. Abgesehen davon, dass Koa ohne Middleware ist, sieht es Express sehr ähnlich, leichtgewichtig und unparteiisch. Was Koa jedoch wirklich herausragend macht, ist seine Art, den Rückruf mithilfe der ES6-Generatorfunktion vollständig aufzugeben.

Eleganter Kontrollfluss

Javascript ist eine asynchrone Programmiersprache, und mit einem solchen Instinkt der Sprache selbst und dem ereignisgesteuerten Single-Thread-Mechanismus von Node.js ist Callback überall, daher die berüchtigte Callback-Hölle.

Eine Möglichkeit, die Callback-Verschachtelung zu vereinfachen, ist die Verwendung von Async.js. Async.js bietet Techniken zum Zuordnen, Parallelisieren, Serialisieren oder Iterieren mehrerer Funktionen, ohne dass sie ineinander eingebettet werden müssen, und übergeben dann den Kontrollfluss mit einer Callback-Funktion. Ein Callback und eine Fehlerbehandlungsfunktion reichen für den Großteil der zusammengefassten Funktionen aus durch eine Async.js-Methode. Async.js kann Callbacks jedoch nicht vollständig löschen. Beim Schreiben von Node.js-Code mit Async.js tendiert die Einrückung des Codes immer noch dazu, nach rechts zu driften, nur nicht so tief.

Entfliehen Sie der Callback-Hölle

Ein weiterer sauberer Weg ist die Verwendung von dann-fähigen Promises. Einige Promise-Bibliotheken von Drittanbietern mit Reputation sind bluebird und q. In der neuesten Ausgabe von JavaScript, ES6, wurde Promise als Standardisierung aufgenommen. Um es kurz zu machen, Promise garantiert, dass Funktionen sequentiell ausgeführt und zurückgegeben werden, indem die Implementierungsblöcke/-funktionen mit einer Reihe von Promise-„dann“-Funktionen verbunden werden. Sie „lösen“ entweder am Ende jedes Implementierungsblocks/jeder Funktion, sodass die nächste „dann“-Funktion ausgeführt wird, oder Sie „lehnen“ die folgende Implementierung ab, sodass der Kontrollfluss direkt zur Fehlerbehandlung springt. Auf diese Weise aggregieren Sie alle Fehlerbehandlungsfunktionen an einer Stelle und werden Callbacks gründlich los.

Jetzt bringt ES6 einen Game Changer auf den Tisch – ES6 Generator. Dieser Begriff ist neu für JavaScript, aber überhaupt nicht neu in der Programmierwelt. ES6 Generator ist wie eine Unterbrechung in C, anstatt Codezeilen von oben nach unten auszuführen, führt ES6 Generator ein Mittel ein, um zu starten -> anzuhalten und etwas anderes auszuführen -> zurückzukommen, um den Rest zu beenden.

Koa verwendet ES6-Generatoren, um einen eleganten Weg zur Bewältigung der asynchronen JavaScript-Programmierung bereitzustellen, sodass Sie in einer reinen Koa-Anwendung keine Rückrufe sehen können. Ein typischer Anwendungsfall von ES6 Generator in Koa ist die Middleware-Kaskadierung, die es ermöglicht, angepasste Middleware nacheinander ohne unangenehme Rückrufe auszuführen.

 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);

Wir können nicht voreilig behaupten, dass diese hochmoderne Technik Old-School-Lösungen wie Async.js, Promise oder Event Emitter überlegen ist, aber eines ist sicher, dass dieses neue Konzept einige Zeit braucht, um sich daran zu gewöhnen. Mit der unkonventionellen Kontrollflusssequenz könnte es zusätzliche Schwierigkeiten beim Code-Debugging geben.

Meteor: Framework für Web, Mobil und Desktop

Meteor ist ein All-in-One-JavaScript-Framework. Es unterscheidet sich von der Vereinfachungsphilosophie von Express und Koa und geht ins andere Extrem, indem es sich selbst als Full-Stack-Framework definiert, ein vollständiges Paket, das Server-, Mobil-, Desktop- und Web-Apps abdeckt.

Eins-für-alles-Paket

Wenn Sie genau unter die Haube schauen, werden Sie feststellen, dass Meteor wirklich Node.js+Blaze/AngularJS/React+Cordova+MongoDB ist. Node.js und MongoDB sind jeweils für die serverseitige Geschäftslogik und Datenspeicherung verantwortlich. Eines von Blaze, AngularJS oder React kümmert sich um die Front-End-Benutzeroberfläche. Und Cordova, als die bekannteste HTML-Lösung für mobile Hybrid-Apps, verbindet Webseiten mit mobilen Ansichten.

Datensynchronisation

Der Mainstream-Prozess für Backend und Frontend zum Teilen von Daten ist wie folgt:

  • Client fordert Daten oder eine bestimmte HTML-Ansicht an
  • Der Server ruft Daten aus der Datenbank ab, mischt Daten mit der HTML-Ansicht mithilfe einer Templating-Engine und sendet sie zurück an das Front-End
  • Der Client rendert und zeigt die Daten/Ansicht auf benutzerfreundliche Weise

Eine moderne Single-Page-Webanwendung optimiert den obigen Prozess ein wenig. Nehmen Sie als Beispiel AngularJS, das HTML-Vorlagen als statische Dateien zusammen mit anderen Assets wie Front-End-JavaScript-Dateien, Stylesheets und Bildern zusammenfügt. AngularJS füllt dann die Daten in die HTML-Vorlagen, indem es das Back-End mithilfe der Ajax RESTful API nach Daten fragt. In jedem Fall sind Back-End-Entwickler vollständig dafür verantwortlich, Datenänderungsanforderungen vom Front-End zu bearbeiten und Änderungen in der Datenbank zu speichern.

bidirektionale Datensynchronisation automatisch durchgeführt

Eines der Merkmale, das Meteor von anderen Frameworks unterscheidet, ist sein Datensynchronisierungsmechanismus zwischen Server- und Front-End-/mobilen Apps. In Meteor hält der Client eine Minidatenbank-Schattenkopie, die ein kleiner Teil der Replikation aus der Serverdatenbank ist, ein Teil, der zuvor vom Client angefordert und vom Server autorisiert wurde. Wenn der Client Änderungen an den Daten vornehmen möchte, verwendet er die konsistente Datenbank-API als Serverseite, um alle CRUD-Anweisungen auszuführen, und dann werden Datenänderungen automatisch an den Server gesendet und in der eigentlichen Datenbank gespeichert. Immer wenn der Server Datenänderungen erkennt, überträgt er die aktualisierten Daten an bestimmte Clients, die diese Daten abonnieren. Diese bidirektionale Datensynchronisation wird automatisch ohne manuellen Eingriff durchgeführt. Um diese Magie zu erzeugen, verwendet Meteor WebSocket, um Client und Server unter der Haube zu verbinden, sodass alle Datenänderungen an einem Ende sofort am anderen reflektiert werden.

Build-Automatisierungstool

Meteor kümmert sich nicht nur um Server- und Web-App-Anwendungen, mit Hilfe von Meteors Build-Tool namens Isobuild mit Hilfe von Cordova, einer Bibliothek, die HTML/JavaScript/CSS mit nativen mobilen Funktionen bündelt, macht Meteor das Erstellen von iOS- und Android-Apps zum Kinderspiel. Die generierten mobilen Apps sind Hybrid-Apps, die JavaScript ausführen oder HTML-Seiten in einer WebView anzeigen. Diese Problemumgehung kann im Vergleich zu nativen mobilen Apps die Benutzererfahrung beeinträchtigen, aber für viele ist es ein ziemlich großes Verkaufsargument, alles unter derselben Codebasis mit Web-Apps verwalten zu können, und es spart eine Menge Entwicklungskosten.

Insgesamt ist Meteor ein hochgradig automatisiertes Framework. Diese hochgradige Automatisierung macht das Leben der Entwickler viel einfacher, ist jedoch mit dem Preis einer gefährdeten Leistung und eingeschränkter Skalierbarkeit verbunden. Wenn die Benutzerbasis wächst, wird die automatisierte Datensynchronisierungstechnik zum Engpass bei der Skalierung. Um die gleiche Kapazität und Leistung wie andere manuell abgestimmte Backend-Technologien zu erreichen, verbraucht Meteor normalerweise viel mehr Serverhardware und Bandbreitenressourcen. Meteor könnte also ein großartiger Ausgangspunkt und eine perfekte Toolbox sein, wenn man ein Projekt für alle wichtigen Plattformen prototypisieren möchte, aber irgendwann muss die Systemarchitektur professioneller umgestaltet werden, wenn der Prototyp ein Produktionsprojekt mit genug wird Kundenstamm.

Sails.js: Überlegenes MVC-Framework für Node.js

Sails.js hat viele Ähnlichkeiten mit Express. Es ist ein Projektgenerator, eine Middleware und eine Templating-Engine. Es baut tatsächlich auf Express und einigen höheren Funktionalitäten auf, um die Entwicklung zu beschleunigen.

MVC

Model View Controller

Sails.js übernimmt das Model-View-Controller-Entwurfsmuster von seinem Kern. Wer von Ruby on Rails oder Laravel kommt, dem wird die Struktur einer Sails.js-App nur allzu bekannt vorkommen. Das Modell stellt ein Datenmodell dar, das das Datenbanktabellen-/Sammlungsschema widerspiegelt, die Ansicht ist eine HTML-Ansicht mit ausgefüllten Daten, der Controller ist der Ort, an dem Sie die gesamte serverseitige Geschäftslogik einfügen, und fungiert als Bindeglied zwischen Daten und Ansicht.

Echtzeit-Kommunikation

Anders als bei einer HTTP-Anfrage, bei der der Client jedes Mal nach Serverdaten fragen muss, oder einer langen Polling-Verbindung, die den Server in den Leerlauf versetzt, stellt Socket.io eine bidirektionale ereignisbasierte Kommunikation zwischen Client und Server her. Sails.js integriert Socket.io und umschließt es mit einer API auf höherer Abstraktionsebene, um mehr Komfort zu bieten, wodurch sich Sails.js besonders gut für die Erstellung von Chat-Apps oder Multiplayer-Spielen eignet.

Datenbank-ORM

Datenbank-ORM

Zwischen der Backend-Logik und der eigentlichen Datenbankmanipulation gibt es eine mittlere ORM-Schicht namens Waterline. Einfach ausgedrückt bietet dieses ORM-Tool eine konsistente Syntax für den Zugriff auf verschiedene Datenbanken, ohne dass sich Entwickler um verschiedene Datenbankabfragesprachen wie SQL vs. NoSQL, Schema vs. schemalos usw. kümmern müssen.

Sails.js hat einen mittleren Automatisierungsgrad. Es konzentriert sich auf die serverseitige Logik und ist produktionsbereit, und es bietet ein schnelleres Entwicklungstempo als Express, ohne Leistung oder zukünftige Skalierbarkeit zu opfern. Insbesondere für die große Anzahl von MVC-Pattern-Anhängern hat Sails.js eine ziemlich reibungslose Lernkurve.

Einpacken

Dieser Artikel ordnet nicht verschiedene Node.js-Frameworks, sondern listet die Glanzpunkte jedes Frameworks auf, um sich von der Masse abzuheben, um Node.js-Entwicklern dabei zu helfen, die am besten geeignete Toolbox auszuwählen, wenn sie ein Projekt von Grund auf neu erstellen.

Welches ist also Ihr bevorzugtes Node.js-Framework für die Webentwicklung? Bevorzugen Sie einen anderen Rahmen als den, den wir oben besprochen haben? Lassen Sie es uns im Kommentarbereich unten wissen.

Verwandt:
  • Warum zum Teufel sollte ich Node.js verwenden? Ein Fall-für-Fall-Tutorial
  • Kabinenfieber-Codierung: Ein Node.js-Back-End-Tutorial
  • Erstellen einer Node.js/TypeScript-REST-API, Teil 1: Express.js