Introduction aux générateurs et Koa.js Partie 1

Koa.js est un framework web expressif de nouvelle génération, écrit pour Node.js par les utilisateurs des frameworks Express et Connect. Koa.js exploite les générateurs, qui sont une fonctionnalité à la fine pointe de JavaScript, et n’ont pas encore été transformés en versions stables de Node.js. Koa a pour objectif d'utiliser des générateurs pour éviter aux développeurs les spaghettis des rappels, le rendant ainsi moins sujet aux erreurs et donc plus facile à gérer..

Avec seulement 550 lignes de code, Koa est un framework extrêmement léger. Même après cela, Koa intègre une suite élégante de méthodes telles que la négociation de contenu, les redirections, le support proxy, etc., ce qui vous permet de développer facilement et rapidement le développement, ainsi que le contrôle granulaire de votre application de noeud..

Installation du nœud

Maintenant, avant de commencer, vous devez avoir au moins la version Node 0.11.x ou plus grand.

Vous pouvez installer la dernière version de Node à l'aide du module N:

sudo npm installer -g n sudo n stable 

Vous pouvez également utiliser d'autres modules de communauté tels que nvm ou le construire à partir des sources. Veuillez noter que N est aussi un module de communauté.

Pour exécuter un fichier JS utilisant des générateurs, vous devez fournir le --harmonie signaler quand vous l'exécutez.

Par exemple, pour exécuter app.js, entrez la commande suivante:

noeud --harmony app.js

Ou pour éviter de saisir ce drapeau à chaque fois, vous pouvez créer un alias à l'aide de la commande suivante:

alias node = "node --harmony"

Maintenant, pour exécuter votre application en utilisant des générateurs, entrez simplement:

noeud app.js

Très bien! Gardez également à l'esprit que tout le code de cet article est disponible sur GitHub. N'hésitez pas à fourcher et à jouer avec.

Maintenant, pour comprendre Koa, vous devez d'abord comprendre les générateurs qui forment la colonne vertébrale du cadre.

Quels sont les générateurs?

Avec l'ES-6, les générateurs ont finalement atterri dans le pays magique de JavaScript. Si vous avez une expérience préalable avec des générateurs en Lua, Python, Scheme, Smalltalk, etc., alors vous seriez heureux de savoir qu'une chose très similaire a été implémentée en JavaScript.. 

 Les générateurs sont des co-routines de première classe en JavaScript qui, en termes simples, introduisent une interface de pause et de lecture dans le langage. Avant les générateurs, tout le script utilisé pour d'habitude exécuter dans l'ordre croissant, sans moyen facile d'arrêter l'exécution du code et de reprendre ultérieurement avec la même pile. Maintenant, nous nous salirons les mains avec quelques exemples.

Conformément à la version actuelle de la spécification ES-6, nous devons utiliser une version différente de la définition de fonction pour créer une fonction de générateur. Cela ressemble à ceci:

var generateur_fonc = fonction * () ;

Ici générateur_fonc est juste une fonction de générateur vide.

Nous pouvons donc utiliser le rendement mot-clé dans la fonction pour arrêter l'exécution et sauvegarder la pile actuelle.

Voici un exemple simple démontrant la somme d'un AP infini:

var r = 3; fonction * infinite_ap (a) pour (;;) a = a + r; donner un;  var sum = infinite_ap (5); console.log (sum.next ()); // retourne valeur: 8, done: false console.log (sum.next ()); // retourne valeur: 11, done: false

Dans le code ci-dessus, nous créons initialement une instance d'itérateur nommée infinite_ap qui inclut une boucle infinie et, s’il est exécuté dans des conditions normales, peut geler l’exécution.

Ensuite, nous stockons une instance d'itérateur dans le répertoire somme variable.

Maintenant, quand on appelle sum.next (), il revient valeur: 8, fait: faux ce qui signifie qu'il a arrêté son exécution sur le rendement déclaration retournant le valeur comme 'a' et terminé comme 'faux' .

Ici terminé renvoie false jusqu'à ce que l'exécution soit inachevée. Une fois l'exécution terminée (dans le cas susmentionné, cela ne se produit jamais), la fonction retourne valeur: undefined, done: true .

Voici une petite modification du code précédent pour démontrer la fin de l'exécution:

var r = 3; fonction * infinite_ap (a) pour (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  

Dans des programmes plus complexes, vous devez vérifier et utiliser les valeurs renvoyées et les terminé statut.

Remarque: En utilisant rendement sans pour autant une fonction* conduirait à une erreur précoce.

Méthodes disponibles pour les générateurs

Voici quelques méthodes courantes qui vous seront utiles lorsque vous vous occuperez de générateurs de vanille..

Chacune des méthodes ci-dessous est disponible uniquement dans une fonction de générateur et génère une erreur sinon.

suivant()

Ceci est utilisé pour reprendre l'exécution avec la transmission d'un argument. Si rien n'est passé, alors indéfini est passé comme premier argument.

Exemple: sum.next (5);

jeter()

Ceci est utilisé pour générer une erreur ou une exception à n'importe quelle étape. Cela facilite beaucoup la gestion des erreurs. Le déclenchement d'une erreur peut entraîner l'arrêt de l'exécution du fichier s'il n'est pas géré quelque part. Le moyen le plus simple de gérer une erreur consiste à utiliser une instruction try and catch. Cette méthode prend un seul argument qui peut être n'importe quoi.

Exemple: sum.throw (nouvelle erreur ("ceci est une erreur")); 

Déléguer rendement

La délégation de générateur est utilisée pour générer un générateur à partir d'un générateur existant et peut être utilisée pour composer des générateurs ou même effectuer une itération sur un générateur..

Lors de la délégation à un autre générateur, le générateur de courant cesse de produire une valeur et commence à générer les valeurs du générateur délégué jusqu'à son épuisement. À l’épuisement du générateur délégué, le générateur reprend sa propre valeur.

C’est un peu comme utiliser un pour-dans boucle sur un générateur, mais les exceptions du générateur délégué sont propagées et renvoyées via le générateur externe jeter méthode et doit être traité de la même manière. Voici un exemple:

var consoleLogThunk = function (msg) retour function () console.log (msg);  var générateur = fonction * () rendement consoleLogThunk ("Yo"); rendement consoleLogThunk ("Dawg"); donnez consoleLogThunk ("!!!");  var delegator_function = function * () return consoleLogThunk ("J'ai cédé avant le rendement délégué"); rendement * générateur (); rendement consoleLogThunk ("J'ai cédé après un rendement délégué");  var k = delegator_function (); k.next (). value (); k.next (). value (); k.next (). value (); console.log (k.next ()); // Si vous appelez k.next (), une erreur de type sera générée, car la valeur est indéfinie et n'est pas une fonction. 

Maintenant que vous avez une brève compréhension des générateurs en Javascript, vous pouvez les utiliser pour écrire des applications beaucoup plus claires et moins sujettes aux erreurs, dans lesquelles vous pouvez bloquer les E / S sans bloquer le processus.. 

Passons maintenant à l'installation de Koa et à une application très simple basée sur Koa.js.

Koa.js:

Koa est un objet contenant un tableau de fonctions génératrices de middleware, toutes composées et exécutées à la manière d'une pile à chaque requête..

Installer Koa

Dans votre répertoire de projet, exécutez la commande suivante.

npm installer koa --save

Koa sera automatiquement téléchargé et enregistré dans un package.json fichier, s'il existe.

Malgré son très faible encombrement, Koa inclut des méthodes pour des tâches telles que l'actualisation du cache, la négociation de contenu, les redirections, le support de proxy, etc., sans middleware fourni.

Voici un exemple d'application hello-world:

var koa = require ('koa'); var app = koa (); app.use (function * () this.body = "Hello World !!!";); app.listen (3000);

Flux de contrôle de Koa

À présentKoa met également en œuvre l'aval suivi du flux de contrôle. Au début, il peut être difficile de haleter, mais une fois l’exemple ci-dessous, les choses deviendront plus claires..

Voici un exemple de flux de contrôle dans Koa:

var koa = require ('koa') (); koa.use (function * (next) // faire quelque chose avant de céder / de passer à la fonction suivante du générateur qui sera le 1er événement dans la console en aval console.log ("A"); yield suivant; // faire quelque chose lors de l'exécution retourne en amont, ce sera le dernier événement en amont console.log ("B");); koa.use (function * (next) // faire quelque chose avant de céder / de passer à la fonction suivante du générateur en ligne, ce sera le 2ème événement en aval console.log ("C"); rendement suivant; // faire quelque chose lorsque l'exécution revient en amont et il s'agirait du 2ème événement en amont console.log ("D");); koa.use (function * () // faire quelque chose avant de céder / de passer à la fonction suivante du générateur. Ici, ce serait la dernière fonction en aval console.log ("E"); this.body = "hé les gars"; console .log ("F"); // Premier événement en amont (du dernier au premier)); koa.listen (3000); 

Le code ci-dessus est assez simple. Notez que pas tous console.log les instructions sont obligatoires mais elles vous aideront à comprendre clairement le flux d'exécution en aval et en amont de Koa.js .

Compréhension du flux d'exécution des exemples

Lorsque nous exécutons cette application et ouvrons localhost: 3000 dans le navigateur, nous pouvons observer que le console.logs dans le terminal ne sont pas dans l'ordre de A B C D E F. Ils ne sont pas non plus dans l'ordre A-C-E-B-D-F.

La commande est en fait A-C-E-F-D-B qui décrit l’aval des rendements et le comportement en amont de l’exécution dans une application Koa.

Vous remarquerez peut-être qu'il est imprimé deux fois. Ceci est dû à une double demande envoyée par le navigateur pour récupérer le favicon.

Pointe: Le koa.use (fonction) ajoute la fonction middleware à l'application.

En conclusion

Voilà donc pour la première partie de ce tutoriel sur les générateurs JavaScript et Koa.js. Vous avez appris la plupart des conditions préalables telles que la nature des générateurs, leur utilisation, l'utilisation de la délégation de rendement et le fonctionnement du flux de contrôle dans Koa.js..

Dans la prochaine partie de ce didacticiel, nous allons plonger plus profondément dans Koa et apprendre à créer une application CRUD. Si vous avez des questions ou des commentaires, n'hésitez pas à me contacter ou simplement laisser un commentaire ci-dessous.