Koa.js ist ein ausdrucksstarkes Web-Framework der nächsten Generation, das von den Personen hinter den Express- und Connect-Frameworks für Node.js geschrieben wurde. Koa.js nutzt Generatoren, die ein ausblutendes Feature von JavaScript sind und bisher noch nicht in stabile Versionen von Node.js umgewandelt wurden. Koa zielt darauf ab, Generatoren zu verwenden, um Entwickler vor den Spaghetti von Rückrufen zu schützen, wodurch sie weniger fehleranfällig und damit überschaubarer werden.
Mit nur 550 Zeilen Code ist Koa ein extrem leichter Rahmen. Darüber hinaus bietet Koa eine elegante Suite von Methoden wie Content-Negotiation, Umleitungen, Proxy-Unterstützung usw., die Ihnen eine einfache und schnelle Entwicklung sowie eine detaillierte Kontrolle Ihrer Knotenanwendung ermöglichen.
Bevor wir beginnen, benötigen Sie mindestens die Node-Version 0,11 x
oder größer.
Sie können die neueste Version von Node mit dem N-Modul installieren:
sudo npm install -g n sudo n stabil
Sie können auch andere Community-Module wie nvm verwenden oder aus dem Quellcode erstellen. Bitte beachten Sie, dass N auch ein Community-Modul ist.
Um eine JS-Datei auszuführen, die Generatoren verwendet, müssen Sie die --Harmonie
Flag, wenn Sie es ausführen.
Zum Beispiel um zu laufen app.js
, Geben Sie den folgenden Befehl ein:
Knoten --harmony app.js
Oder um sich jedes Mal vor der Eingabe dieses Flags zu schützen, können Sie mit dem folgenden Befehl einen Alias erstellen:
alias node = "node --harmony"
Um Ihre Anwendung mit Generatoren auszuführen, geben Sie einfach Folgendes ein:
Knoten app.js
Sehr gut! Denken Sie auch daran, dass der gesamte Code in diesem Artikel auf GitHub verfügbar ist. Fühlen Sie sich frei, um mit ihm zu spielen.
Um Koa zu verstehen, müssen Sie zunächst Generatoren verstehen, die den Rahmen des Rahmens bilden.
Mit ES-6 sind Generatoren endlich im magischen Land von JavaScript gelandet. Wenn Sie bereits Erfahrungen mit Generatoren in Lua, Python, Scheme, Smalltalk usw. gemacht haben, würden Sie sich freuen zu erfahren, dass in JavaScript eine sehr ähnliche Sache implementiert wurde.
Generatoren sind erstklassige Co-Routinen in JavaScript, die, einfach gesagt, eine Pause- und Wiedergabeschnittstelle in die Sprache einführen. Vor Generatoren hat das ganze Skript verwendet meistens Ausführen in einer Reihenfolge von oben nach unten, ohne die Codeausführung einfach beenden und später mit demselben Stack fortsetzen zu können. Jetzt machen wir uns mit einigen Beispielen schmutzig.
Gemäß dem aktuellen Entwurf der ES-6-Spezifikation müssen wir eine andere Version der Funktionsdefinition verwenden, um eine Generatorfunktion zu erstellen. Es sieht aus wie das:
var generator_func = function * () ;
Hier generator_func
ist nur eine leere Generatorfunktion.
Also können wir das benutzen Ausbeute
Schlüsselwort in der Funktion zum Stoppen der Ausführung und zum Speichern des aktuellen Stapels.
Hier ist ein einfaches Beispiel, das die Summe eines unendlichen AP veranschaulicht:
var r = 3; function * infinite_ap (a) für (;;) a = a + r; ergeben a; var sum = unendlich_ap (5); console.log (sum.next ()); // liefert value: 8, done: false console.log (sum.next ()); // gibt value: 11, done: false zurück
Im obigen Code erstellen wir zunächst eine Iterator-Instanz mit dem Namen infinite_ap
die eine Endlosschleife enthält und, wenn sie unter normalen Bedingungen ausgeführt wird, die Ausführung einfrieren kann.
Als nächstes speichern wir eine Iterator-Instanz in der Summe
Variable.
Jetzt wenn wir anrufen sum.next ()
, es kehrt zurück Wert: 8, erledigt: falsch
was bedeutet, dass es seine Ausführung auf der Ausbeute
Anweisung, die das zurückgibt Wert
als 'a' und erledigt
als 'falsch' .
Hier erledigt
gibt false zurück, bis die Ausführung nicht abgeschlossen ist. Sobald die Ausführung abgeschlossen ist (in dem vorgenannten Fall passiert dies nie), kehrt die Funktion zurück value: undefined, done: true
.
Hier ist eine kleine Modifikation des vorherigen Codes, um das Ende der Ausführung zu demonstrieren:
var r = 3; function * infinite_ap (a) für (var i = 0; i < 3 ; i++) a = a + r ; yield a; var sum = infinite_ap(5); console.log(sum.next()); // returns value : 8, done : false console.log(sum.next()); // returns value : 11, done: false console.log(sum.next()); // returns value : 14, done: false console.log(sum.next()); //return value: undefined, done: true
In komplexeren Programmen würden Sie die zurückgegebenen Werte und den Wert überprüfen und verwenden erledigt
Status.
Hinweis: Verwenden von Ausbeute
ohne Funktion*
würde zu einem frühen Fehler führen.
Im Folgenden finden Sie einige gängige Methoden, die sich beim Umgang mit Vanillegeneratoren als nützlich erweisen.
Jede der folgenden Methoden ist nur in einer Generatorfunktion verfügbar und würde sonst einen Fehler auslösen.
Nächster()
Dies wird verwendet, um die Ausführung zusammen mit dem Übergeben eines Arguments fortzusetzen. Wenn nichts übergeben wird, wird undefined als erstes Argument übergeben.
Beispiel: sum.next (5);
werfen()
Dies wird verwendet, um bei jedem Schritt einen Fehler oder eine Ausnahme auszulösen. Es vereinfacht die Fehlerbehandlung erheblich. Ein Fehler kann dazu führen, dass die Ausführung der Datei angehalten wird, wenn sie nicht irgendwo behandelt wird. Die einfachste Möglichkeit, einen Fehler zu behandeln, besteht darin, eine try-and-catch-Anweisung zu verwenden. Diese Methode benötigt ein einzelnes Argument, das alles sein kann.
Beispiel: sum.throw (neuer Fehler ("Dies ist ein Fehler"));
Ausbeute
Die Generatordelegierung wird zum Generieren eines Generators aus einem vorhandenen Generator verwendet und kann zum Erstellen von Generatoren oder sogar zum Durchlaufen eines Generators verwendet werden.
Beim Delegieren an einen anderen Generator hört der aktuelle Generator auf, selbst einen Wert zu erzeugen, und beginnt mit der Ausgabe der Werte des delegierten Generators, bis dieser erschöpft ist. Bei Erschöpfung des delegierten Generators nimmt der Generator seinen eigenen Wert wieder auf.
Es ist sehr ähnlich wie ein für in
Schleife über einen Generator, aber die Ausnahmen des delegierten Generators werden über den äußeren Generator weitergeleitet und geworfen werfen
Methode und sollte ebenfalls behandelt werden. Hier ist ein Beispiel:
var consoleLogThunk = function (msg) return function () console.log (msg); var generator = function * () yield consoleLogThunk ("Yo"); ErtragskonsoleLogThunk ("Dawg"); Ertrag consoleLogThunk ("!!!"); var delegator_function = function * () yield consoleLogThunk ("Ich habe vor der delegierten Ausbeute nachgegeben"); Ertrag * Generator (); yield consoleLogThunk ("Ich habe nach der delegierten Ausbeute nachgegeben"); var k = delegator_function (); k.next (). value (); k.next (). value (); k.next (). value (); console.log (k.next ()); // Wenn Sie k.next () aufrufen, wird ein Typfehler ausgegeben, da value undefined ist und keine Funktion ist
Nachdem Sie die Generatoren in Javascript kurz verstanden haben, können Sie damit deutlich klarere und weniger fehleranfällige Anwendungen schreiben, in denen Sie E / A-Vorgänge blockieren können, ohne den Prozess tatsächlich zu blockieren.
Nun geht es weiter zur Installation von Koa und einer sehr einfachen Anwendung, die auf Koa.js basiert.
Koa ist ein Objekt, das ein Array von Middleware-Generatorfunktionen enthält, die alle bei jeder Anforderung stapelartig zusammengesetzt und ausgeführt werden.
Führen Sie in Ihrem Projektverzeichnis den folgenden Befehl aus.
npm install koa --save
Koa wird automatisch heruntergeladen und in a gespeichert package.json
Datei, falls vorhanden.
Trotz des geringen Platzbedarfs von Koa enthält es Methoden für Aufgaben wie Cache-Aktualität, Inhaltsverhandlungen, Weiterleitungen, Proxy-Unterstützung usw., ohne dass Middleware im Lieferumfang enthalten ist.
Hier ist ein Beispiel einer Hallo-Welt-Anwendung:
var koa = erfordern ('koa'); var app = koa (); app.use (function * () this.body = "Hallo Welt !!!";); App.listen (3000);
Jetzt, Koa implementiert auch das Downstreaming, gefolgt vom Upstreaming des Kontrollflusses. Anfangs kann es schwer sein, nach Luft zu schnappen, aber wenn Sie das folgende Beispiel durchgehen, werden die Dinge klarer.
Hier ist ein Beispiel für den Kontrollfluss in Koa:
var koa = erfordern ('koa') (); koa.use (Funktion * (next) // Vor dem Nachgeben / Weitergeben an die nächste Generatorfunktion in der Zeile, die das erste Ereignis in der console.log ("A") ist, ergeben sich Next; // etwas bei der Ausführung gibt Upstream zurück, dies ist das letzte Ereignis in Upstream Console.log ("B");); koa.use (Funktion * (next) // Vor dem Nachgeben / Weitergeben an die nächste Generatorfunktion in Zeile muss dies das zweite Ereignis sein, das console.log ("C") ist; Die Ausführung gibt den Upstream zurück und dies wäre das 2. Event Upstream Console.log ("D");); koa.use (function * () // Vor dem Nachgeben / Weitergeben zur nächsten Generatorfunktion in Zeile. Hier wäre es die letzte Funktion, die console.log ("E") ist; this.body = "hey guys"; console.) .log ("F"); // Erstes Ereignis des Upstream (vom letzten bis zum ersten)); koa.listen (3000);
Der obige Code ist ziemlich einfach. Beachten Sie, dass nicht alle console.log
Anweisungen sind erforderlich, aber sie helfen Ihnen, den Ablauf von Koa.js vor und nach dem Ablauf zu verstehen .
Wenn wir diese Anwendung ausführen und öffnen localhost: 3000
Im Browser können wir beobachten, dass die console.logs
im Terminal sind nicht in der Größenordnung von A-B-C-D-E-F. Sie sind auch nicht in der Reihenfolge von A-C-E-B-D-F.
Die Reihenfolge ist eigentlich A-C-E-F-D-B In dieser Abbildung werden die Renditen und das Upstream-Verhalten der Ausführung in einer Koa-App dargestellt.
Möglicherweise stellen Sie fest, dass es zweimal gedruckt wird. Dies ist auf eine doppelte Anfrage des Browsers zurückzuführen, um das Favicon abzurufen.
Spitze: Das koa.use (funktion)
fügt der Anwendung die Middleware-Funktion hinzu.
Das ist es also für den ersten Teil dieses Tutorials zu JavaScript-Generatoren und Koa.js. Sie haben die meisten Voraussetzungen kennen gelernt, z. B. was Generatoren sind, wie sie verwendet werden, wie Delegieren von Ertrag verwendet wird und wie der Kontrollfluss in Koa.js funktioniert.
Im nächsten Teil dieses Tutorials werden wir tiefer in Koa eintauchen und lernen, wie man eine CRUD-Anwendung erstellt. Wenn Sie Fragen oder Anmerkungen haben, können Sie sich gerne mit mir in Verbindung setzen oder einfach einen Kommentar hinterlassen.