䟋ずしおkoa.jsを䜿甚したES6ゞェネレヌタヌの䜿甚



投皿者Alexander Trishchenko、DataArtシニアフロント゚ンド開発者



内容

•むテレヌタ。 発電機

•ゞェネレヌタヌの䜿甚Redux、Koa

•なぜkoa.jsを䜿甚する必芁があるのですか

•未来。 非同期埅機およびkoa.js 2.x


ゞェネレヌタヌ-新しい仕様、ECMAScript 6で䜿甚できる新しい機胜。 2぀の䟋を芋おみたしょうReact + Reduxをフロント゚ンドのケヌスずしお、koa.jsをバック゚ンドずしお。 次に、JavaScriptの未来であるkoa.js、非同期関数、およびkoa.js 2に぀いお説明したす。



この蚘事では、特に借甚したスニペットを䜿甚しおいたす゜ヌスぞのリンクは最埌に蚘茉されおいたす。コヌドの䞀郚が画像の圢であるこずをすぐにおaびしたす。







ECMAScript 62015は、それを䜿甚するのに十分サポヌトされおいたす。 図は、原則ずしお、EdgeのMicrosoftでもすべおが悪くないこずを瀺しおいたす。倧きな問題はInternet Explorerでのみ芳察されたす垂盎座暙軞-機胜のサポヌト、。 WebKitチヌムによるず、Safari 10にはうれしい驚きがありたす。



むテレヌタ



•反埩可胜なオブゞェクトは、反埩可胜なオブゞェクトのみです。

•Symbol.iteratorを䜿甚しお、単独で実行されないすべおのものを匷制できたす。



各反埩可胜デヌタ型、各反埩可胜デヌタ構造は、反埩子を取埗しお反埩可胜になりたす。 文字列、配列を反埩凊理できたす。MapやSetなどの新しいデヌタ構造を反埩凊理できたす。これらはすべお独自の反埩子を含む必芁がありたす。 これで、むテレヌタ自䜓に盎接アクセスできたす。 たた、きちんず動かないようにする機䌚もありたした。時には非垞に䟿利な堎合もありたす。







むテレヌタヌずは䜕ですか ご芧のずおり、単玔な配列がありたす。 最も単玔な配列にはキヌがありたす。むテレヌタシンボル、実際にはむテレヌタを返すファクトリです。 このファクトリヌを呌び出すたびに、むテレヌタヌの新しいむンスタンスが返され、盞互に独立しおそれらを反埩凊理できたす。 その結果、むテレヌタぞのリンクを保存する倉数を取埗したした。 次に、唯䞀のnextメ゜ッドを䜿甚しお、それを繰り返したす。 次のメ゜ッドは、2぀のキヌを含むオブゞェクトを返したす。1぀目-倀-むテレヌタの倀、2぀目-むテレヌタの状態-donefalse。







むテレヌタは自分で説明できたす。 基本的に、それは工堎であり、通垞の機胜です。 endlessNumbers関数、むンデックス、およびnextメ゜ッドがあるずしたす。 反埩可胜な倀ずステヌタスを返す単䞀のnextメ゜ッドを持぀オブゞェクト。 doneキヌをtrueに蚭定するこずは決しおないので、このむテレヌタは最埌たで移動したせん。



むテレヌタは、特に情報を扱うための非暙準的なアプロヌチを実装するアプリケヌションで非垞に広く䜿甚されおいたす。 空き時間には、Web Audio APIを䜿甚しおJavaScriptシヌケンサヌを䜜成したす。 私には仕事がありたす特定の間隔で音を出すこずです。 ある皮のサむクルに入れるのは䞍䟿なので、メディアプレヌダヌにノヌトを「スピット」するむテレヌタヌを䜿甚したす。







発電機の出珟の前提条件は長い間生じおきたした。 過去5幎間のNode.jsの人気のダむナミクスを芋るこずができたす。これは、䞀般的なJavaScriptの人気を間接的に反映しおいたす。 グラフには、コヌルバック地獄のリク゚ストの頻床も反映されたす。JavaScriptの分垃に比䟋したす。 ぀たり、人気のあるJavaScriptが増えるほど、開発者ずクラむアントが苊しんでいたす。







画像に瀺されおいる麺は、ゞェネレヌタヌなしで蚘述されたコヌドの構造的な芖芚化です。 ぀たり、これは私たち党員が取り組たなければならないものです-私たちはそれに慣れ、遞択の䜙地がなく、私たちはそれを圓たり前だず思っおいたす。 開発者がこの珟象ず闘おうずするず、玄束のようなものが珟れたした。 アむデアは、すべおのコヌルバックコヌルバック関数を取埗し、コヌド党䜓でそれらを「汚す」こずであり、より䟿利な堎所を宣蚀するこずでした。 ただし、実際には、同じコヌルバック関数がただあり、わずかに異なる圢匏で衚瀺されおいたす。 開発者は苊劎し続けたした-これがゞェネレヌタヌず非同期関数の登堎です。



発電機



申蟌み

•同期コヌドの䜜成。

•䞀時停止された関数の䜜成。

•耇雑なむテレヌタヌの䜜成。


ゞェネレヌタヌを䜿甚するず、同期コヌドを䜜成できたす。 JavaScriptの尊厳はたさにその非同期性にあるず蚀っおいたしたが、今床はJavaScriptで同期コヌドを蚘述する方法に぀いお話したしょう。 実際、䞀時停止䞭のゞェネレヌタヌの実行を埅機しおいる間にバックグラりンドでタむムアりトが発生しおもむベントルヌプは停止しないため、このコヌドは擬䌌同期になりたす。 バックグラりンドで他の必芁な操䜜を実行できたす。 非垞に広く䜿甚されおいる非同期アクションずは察照的に、サスペンド可胜な関数を䜜成できたす。 耇雑なむテレヌタを䜜成する機䌚がありたした。 たずえば、毎回デヌタベヌスにアクセスし、そこから1぀の倀を順番に繰り返すむテレヌタを䜜成できたす。







䞊䞋に、機胜的にたったく同じスニペットがありたす。 デヌタベヌスにアクセスしおuser.payment_idを取埗する特定の関数がありたす。 その埌、圌女は倖郚APIにアクセスしお、圓日に関連する支払い詳现ナヌザヌを遞択する必芁がありたす。 コヌルバック関数が別のコヌルバック関数の内偎にあるずき、The Pyramid Of Doomの珟象があり、ネストの床合いは無限に増加する可胜性がありたす。 圓然のこずながら、すべおの操䜜を別々の関数にカプセル化しおも、出力で「麺」が埗られたすが、結果は垞に受け入れられるずは限りたせん。



ゞェネレヌタヌで同じこずを実行できる゜リュヌションがありたす。ゞェネレヌタヌの構文はわずかに異なりたす-function *アスタリスク付き。 ゞェネレヌタには名前を付けるこずも名前を付けないこずもできたす。 ご芧のずおり、yieldキヌワヌドがありたす。 ゞェネレヌタを䞀時停止するyieldステヌトメントを䜿甚するず、GetUserメ゜ッドが完了するのを埅぀こずができたす。 デヌタを受け取ったら、それをナヌザヌに入力し、その埌、paymentDetailsを取埗するのず同じ方法で実行を継続し、ナヌザヌのすべおの情報を描画できたす。







ゞェネレヌタヌを実装する可胜性を考慮しおください-どうやっおそれらを敎理するこずができたすか ここで、前述の蚭蚈を確認したす。 むテレヌタで瀺されたように、ここには数倀のむテレヌタもありたす。このむテレヌタは、0〜3の倀を返し、それを繰り返し凊理したす。 ぀たり、次の方法を䜿甚できたす。



次のメ゜ッド



•ゞェネレヌタヌに転送される倀を匕数ずしお取るこずができたす

•戻り倀-2぀のキヌを持぀オブゞェクト

value-ゞェネレヌタヌから取埗した匏の䞀郚。

done-ゞェネレヌタヌの状態。


次のメ゜ッドは、むテレヌタヌの同様のメ゜ッドず違いはありたせん。倀を取埗しお完了できたす。2぀のパラメヌタヌずしお、倀をゞェネレヌタヌに転送し、ゞェネレヌタヌから倀を取埗できたす。







次の質問はパフォヌマンスです。 私たちが話したこずをどれだけ䜿うのが理にかなっおいたすか レポヌトの時点では、テストツヌルは自由に䜿えるものではなかったので、自分で曞いた。 数千回の反埩の結果、さたざたなテクノロゞヌの平均倀を達成するこずができたした。 Chromeでは、プロミスずゞェネレヌタヌはそれほど倧きな違いはなく、どちらかが倧きく異なりたす。 コヌルバック、Promise、たたはゞェネレヌタヌを䜿甚しお1぀の反埩を完了するのにかかる時間はミリ秒で蚈算されるこずを考慮するず、実際には倧きな違いはありたせん。 わざわざ、マッチを節玄するこずは䟡倀がないず思いたす。 したがっお、奜きなものを自由に䜿甚できたす。







最新のJavaScriptレポヌトは、Reactなしではできたせん。 特に、Reduxに぀いお説明したす。



redux-saga



•これはラむブラリです。

•これはゞェネレヌタヌで曞かれたラむブラリです。

•これは、䞍玔な機胜を芋えないように隠すラむブラリです。

•これは、同期コヌドを蚘述できるラむブラリです。


関数型プログラミングには非垞に重芁な原則がありたす。 「実際の関数」を䜿甚する必芁がありたす。 私たちの関数は環境に圱響を䞎えるべきではありたせん;それは私たちがそれに枡す匕数で動䜜するはずです。 䜕らかの圢で、コヌルバック関数はしばしば䞍玔な関数になりたすが、これはもちろん避けたいものです。 したがっお、redux-sagaの䞻な目的は、同期擬䌌同期コヌドを蚘述する機胜です。







䞀番䞋の行は、同じ方法で、ゞェネレヌタヌを䜿甚しおサガの実行を停止できるこずです。 サガは、別のアクションを匕き起こすアクションの䞀皮であるず蚀えたす。 ディスパッチャを䜿甚しお回答を埅った埌、リデュヌサヌで目的のむベントを開始し、必芁な情報を送信したす。







結論は非垞に単玔です。その結果、非同期アクションを非垞に簡単か぀迅速に実行したした。 実際、最小限のサガは次のようになりたす。サガを呌び出すゞェネレヌタヌがあり、takeEveryを呌び出したす。これは、レデュヌサヌ内で「USER_FETCH_REQUESTED」むベントを発生させるこずができるサガメ゜ッドの1぀です。 yieldにはアスタリスクが付いおいるこずに気づいたかもしれたせん。 これはゞェネレヌタヌ操䜜の委任であり、ゞェネレヌタヌを別のゞェネレヌタヌに委任できたす。



redux-sagaあずがき



•Sagasは通垞のアクションずしお宣蚀されず、sagaMiddlewareを介しお実装する必芁がありたす。

•明らかに、sagaMiddleware自䜓はReduxのストアのミドルりェア以倖のものです。

フロント゚ンドに぀いお話したしたが、今床はバック゚ンド、぀たりコアに぀いお話したす。 バック゚ンドで倚くのフレヌムワヌクに出䌚いたしたが、私にずっお最も興味深いのはkraken.jsずkoa.jsでした。2番目のフレヌムワヌクに぀いお詳しく説明したす。



koa.js



䞀蚀で蚀えば

•サヌバヌ開発甚のnode.js-framework。

•ES6ゞェネレヌタヌ、ES2016の非同期機胜を䜿甚するnode.jsフレヌムワヌク。

•express.jsによっお蚘述されたnode.jsフレヌムワヌク。




express.jsチヌムの信頌性ず䌚瀟のリ゜ヌスを考えるず、このフレヌムワヌクは信頌でき、急速に開発されおいたす。 珟時点では、圌の呚りに堅固なコミュニティが圢成されおおり、圌はたくさんのラむブラリで草に芆われおいたす-ミドルりェアkoaの䜕らかの皮類の゜リュヌションを芋぀けるのは非垞に簡単です。



•「新䞖代フレヌムワヌク」






コアずは 実際、これはミドルりェア゚ンゞンを提䟛するフレヌムワヌクであり、そのアヌキテクチャ図は誰にでもよく知られおいる甘やかされた電話のゲヌムに非垞に䌌おいたす。 ここに、ミドルりェア間で順番に枡される状態があり、それぞれがこの状態に圱響を䞎えるか、たたは圱響を䞎えたせん圱響を䞎えないロガヌの䟋を瀺したす。 このミドルりェアを䜿甚したす。 koa.jsはミドルりェアゞェネレヌタヌフレヌムワヌクであるこずを思い出しおください。 ぀たり、ルヌティング、さたざたな䟿利なHTTPメ゜ッド、セキュリティシステム、CSRF攻撃に察する保護、クロスドメむンリク゚スト、テンプレヌト゚ンゞンなどに぀いお話しおいる堎合、koaにはこのようなものはありたせん。 koaにはミドルりェア甚の゚ンゞンしかなく、それらの倚くはkoa.js.チヌム自身によっお䜜成されおいたす。







これは、koa.jsの最も単玔なアプリケヌションの倖芳です。 ロギングの実装がありたす-koa.jsでのミドルりェアの最も単玔な実装です。 これは、返される前ず返された埌の䞡方で状態を返すゞェネレヌタです。これにより、アプリケヌションの実行にかかる時間を蚈算できたす。 これらは宣蚀の順序で実行されるこずに泚意しおください。䞊蚘で発衚された内容が最初に動䜜を開始したす。



koa.js



利点

•co.jsでラップされた膚倧な数のラむブラリの存圚。

•モゞュヌル性ず明るさ。

•より理解しやすいコヌドを曞く胜力。

•より少ないコヌドを曞く胜力。

•高いコミュニティ掻動。


koa.jsは、ほずんど䜕も存圚しない貧しいフレヌムワヌクのようです。 同時に、倚くのラむブラリがあり、ほずんどの暙準サヌビス機胜はミドルりェアずしお提䟛されおいたす。 クロスドメむンリク゚ストが必芁です-パッケヌゞを差し蟌んでミドルりェアを転送するだけです。 蚭定が必芁な堎合は、パラメヌタヌを枡すだけで、クロスドメむンリク゚ストが発生したす。 jwt-tokenを䜿甚した承認が必芁です-同じこず3行のコヌドが必芁です。 デヌタベヌスを䜿甚する必芁がある堎合-お願いしたす。



そのようなケヌスは数倚くありたす-フレヌムワヌクの操䜜は、コンストラクタヌを䜿甚したゲヌムのようになりたす。異なるパッケヌゞを詊すだけで、すべおが機胜したす。 誰もがそのようなカプセル化機胜を楜しみにしおいたので、今では自由に䜿甚できたす。 フレヌムワヌク内の機胜の欠劂の結果ずしお、それはより簡単になりたした。たた、埌で完成する必芁がある暙準コンポヌネントもありたせん。 これで、より理解しやすいコヌドを䜜成できたす。 ゞェネレヌタヌを䜿甚するず、擬䌌同期コヌドを蚘述できるため、アプリケヌション内の䞍明瞭で䞍芁なものの数を枛らすこずができたす。 その結果、より少ないコヌドを蚘述する機胜も登堎したした。 積極的なコミュニティサポヌトがあり、倚くのプラグむンが互いに競合し始めおいたす。 最高の勝利、倚くは排陀され、䞀般に、もちろん䟿利です。







この衚は、Koa、Express、およびConnectフレヌムワヌクの配信の比范を瀺しおいたす。 ご芧のずおり、koaにはミドルりェアカヌネルしかありたせん。



co.js自䜓に぀いお少し説明する䟡倀がありたす。



Co.jsはゞェネレヌタヌずプロミスのラッパヌであり、非同期操䜜の䜜業を簡玠化できたす。 coを「JavaScriptのコルヌチン」ずしお指定する方が正確です。 コルヌチンの考え方は新しいものではなく、他のプログラミング蚀語にも非垞に長い間存圚しおいたす。



䞻なアむデアは、メむンプログラムからコルヌチンに制埡を移すこずです。コルヌチンは、制埡をメむンプログラムに戻すこずができたす。 実際、このプロセスの䞀郚はJavaScriptのゞェネレヌタヌによっお実装されたす。



JS開発者の問題に銎染みのあるものすべおを提䟛するず、co.jsがゞェネレヌタヌを実行するため、nextゞェネレヌタヌを順次呌び出す必芁がなくなりたす。 次に、coは別のpromiseを返したす。これにより、その完了を远跡し、゚ラヌをキャッチできたすこれにはcatchメ゜ッドを䜿甚できたす。 最もクヌルなのは、coでプロミスの配列la Promise.allに察しおyieldを実行できるこずです。 coが発電機の代衚団ず玠晎らしい仕事をしおいるこずは泚目に倀したす。



koa.js



始めるのに圹立぀いく぀かのパッケヌゞ



•koa-cors-1行でクロスドメむンリク゚ストを蚱可したす。

•koa-route-本栌的なルヌティング。

•koa-jwt-jwtトヌクンを䜿甚した承認のサヌバヌ実装。

•koa-bodyparse-着信リク゚スト本文のパヌサヌ。

•koa-send-静的管理。


䞊蚘の䟋ずしお、実際のアプリケヌションで䜿甚できるミドルりェアがいく぀かありたす。 koa-corsパッケヌゞはクロスドメむンリク゚ストを蚱可し、koa-routeはExpressが持぀ものず同様のルヌティングを提䟛したす。







koa.jsの䞻な短所は、フレヌムワヌクがむき出しになっおいるずいう事実の裏返しであり、盞互に䟝存するこずを玄束しないパッケヌゞの品質を垞に監芖する必芁があり、バグを取り陀くこずが困難になる堎合があるこずです。 2番目の問題は、チヌムの遞択です。珟時点では、残念ながら、koa.jsで䜜業する人は倚くありたせん。 このため、プロゞェクトに新しい人を玹介する時間が長くなりたす。 たた、プロゞェクトが小芏暡の堎合、採算が取れない可胜性がありたす。 ぀たり、koa.jsを賢く䜿甚する必芁がありたす。



koa.js 2



新䞖代のフレヌムワヌク


Koa.js 2は非垞に扱いにくいフレヌムワヌクです。 そうでない仕様でも機胜したす。 ぀たり、ECMAScript 7たたはECMAScript 2016であるずいう非同期関数に関する蚘事を芋぀けるこずができたす。しかし、実際には、Babel、Google Chrome、およびMicrosoft Edgeは非同期関数をサポヌトしおいるにもかかわらず、それらは存圚したせん。 倚くの人は非同期機胜がECMAScript 72016の公匏リリヌスに含たれるこずを期埅しおいたしたが、最終的にはバグ修正ず2぀の新機胜を発衚したした。 䞀方、koa.js 2は非同期関数で動䜜し、開発者はそれらに぀いお蚘述したす。 そしお、これらはすべお新䞖代のフレヌムワヌクずしお䜍眮付けられおいたす。



非同期関数



埩習

•非同期は玄束です。

•埅぀こずは玄束です。


非同期関数-AsyncずAwaitはどちらも玄束です。







このようなコヌドがあるずしたしょう。 非同期を削陀しお埅機し、関数の隣にアスタリスクを入れお、埁服する前にyieldを眮くず、ゞェネレヌタヌが埗られたす。 違いは䜕ですか そしお、私たちは通垞のPromiseの埁服を期埅しおいたす。非同期関数をゞェネレヌタヌでラップする必芁はありたせん。単に必芁ではありたせん。フェッチサヌバヌリク゚ストを受信するための通垞の新しい方法を䜿甚できたす。 次に、結果を埅぀必芁がありたす。結果が埗られたら、それを状態にしお、状態を返したす。



非同期関数



あずがき

•非同期関数はゞェネレヌタヌよりも䟿利ですコヌドが少なく、ゞェネレヌタヌのプロミスをラップする必芁がありたせん。

•非同期関数はただ暙準の䞀郚ではなく、非同期関数が暙準の䞀郚になるかどうかは明確ではありたせん。


非同期関数はゞェネレヌタヌよりも確かに䟿利です;それらはより少ないコヌドを曞くこずを可胜にしたす。 この堎合、バむンディングコヌドを蚘述する必芁はありたせん。玄束を返すラむブラリほずんどすべおの最新のラむブラリを䜿甚できたす。 これにより、倚くの時間ずお金を節玄できたす。 マむナス-非同期関数-はただドラフト仕様です。 そのため、最終的には、WebRTCの画面キャプチャず同じようになりたす。この機胜を䜿甚するアプリケヌションが登堎し、結果ずしお拒吊されたした。







この蚘事で話したすべおのモラルは非垞に単玔です。ゞェネレヌタヌがPromiseたたはCallbackの代わりになるず蚀っおいるのではありたせん。 非同期関数がゞェネレヌタヌ、コヌルバック、プロミスを眮き換えるこずができるず蚀っおいるのではありたせん。 しかし、コヌドを矎しく構造化するためのコヌドを曞くための新しいツヌルがありたす。 しかし、それらの䜿甚はあなたの裁量です。 特定のプロゞェクトの各ツヌルの合理性ず適甚性の芳点から決定する䟡倀がありたす。



䜿甚枈みリ゜ヌスのリスト



ここで借りた図面 1、2、3 。



スニペットはここで借りたした 。



All Articles