ホームページ  >  記事  >  ウェブフロントエンド  >  Expressとkoaの使用比較

Expressとkoaの使用比較

小云云
小云云オリジナル
2018-01-27 09:58:252684ブラウズ

Express と koa は両方ともサーバーサイド開発フレームワークであり、サーバーサイド開発の焦点は、HTTP リクエストと HTTP レスポンスの 2 つのオブジェクトのカプセル化と処理、アプリケーションのライフサイクルのメンテナンス、およびビューの処理です。

Node.js 開発に関して言えば、Express と koa という 2 つの人気のあるフレームワークについて言及する必要があります。 Express は、使いやすく強力な、シンプルで柔軟な Web 開発フレームワークです。 Koa は、ES6 の新機能に基づいて Express フレームワークのオリジナル チームによって再開発されたアジャイル開発フレームワークであり、現在非常に人気があり、Express に追いつく可能性が非常に高いです。

Express は主に Connect ミドルウェア フレームワークをベースにしており、機能が豊富で使いやすいフレームワーク自体に、ルーティング、ビュー処理などの多数の便利な機能がカプセル化されています。 Koa は主に co ミドルウェア フレームワークに基づいており、フレームワーク自体には多くの機能が統合されていませんが、ES6 ジェネレーター機能に基づいたミドルウェア メカニズムにより、長年批判されてきた問題を解決します。 「コールバック地獄」 」や厄介なエラー処理の問題は、開発者の間で非常に人気があります。

実は以前、expressとkoaの比較を書きましたが、後でその中に多くの誤りがあることに気づきました。そこで、特にミドルウェア部分の比較について、以前の間違いを修正することを考えています。より単純な Connect は

connect の実行プロセスを置き換えます。通常、connect のミドルウェア モデルは線形である、つまり、以下に示すように 1 つずつ実行されると言われます:


これはもちろん正しいですが、次のコードを実行すると、少し混乱するかもしれません:

const connect = require('connect')
const app = connect()
app.use(function m1 (req, res, next) {
 console.log('m1')
 next()
 console.log('m1 end')
})
app.use(function m2 (req, res, next) {
 console.log('m2')
 next()
 console.log('m2 end')
})
app.use(function m3 (req, res, next) {
 console.log('m3')
 res.end('hello')
})
app.listen(8080)
http://127.0.0.1:8080 にアクセスすると、コンソールは次のように表示されます:

m1
m2
m3
m2 end
m1 end
この結果は上記と同じです。モデルは次のようになります。これは少し一貫性がありません。なぜ次以降のコードが実行され続けるのでしょうか? もちろん、これについてはすでに結論付けていますので、興味があれば、直接結果を確認してみてください。今、接続の途中 ソフトウェア モデルの疑似コードは次のように表されます:

http.createServer(function (req, res) {
 m1 (req, res) {
 m2 (req, res) {
 m3 (req, res) {}
 }
 }
})
レイヤーごとにコールバックがネストされていることがわかります。以前に疑問に思ったコードを単純化してみましょう:

http.createServer(function (req, res) {
 console.log('m1')
 m1 (req, res) {
 console.log('m2')
 m2 (req, res) {
 m3 (req, res) {
 console.log('m3')
 res.end('hello')
 }
 }
 console.log('m2 end')
 }
 console.log('m1 end')
})
Don'上記のコールバック、つまり非常に単純なコールバック関数に混乱しないでください。すべてが明確に説明されています。res.end の後でも、コードはまだダウンし続ける必要があります。connect のミドルウェアは実際にはタマネギ型であると言えます。しかし、これは同期コードであるため、一般的にこれを行う代わりに、接続のミドルウェア モデルを再度記述することができます:

Koa の実行プロセス

同様に、Koa ソース コードを分析するときは、 Koa のミドルウェア モデルについて言及しました: Onion Shape

以下のコードを例として挙げます:

const Koa = require('koa')
const app = new Koa()
app.use(async function m1 (ctx, next) {
 console.log('m1')
 await next()
 console.log('m1 end')
})
app.use(async function m2 (ctx, next) {
 console.log('m2')
 await next()
 console.log('m2 end')
})
app.use(async function m3 (ctx) {
 console.log('m3')
 ctx.body = 'hello'
})
app.listen(8080)
サービスにアクセスし、出力:

m1
m2
m3
m2 end
m1 end
emm 以前に読んだ記事と変わらないようです。ここで koa と Express のミドルウェアを入手しました。モデル間に違いがないという結論は私にはわかりにくいですが、もちろん違いはあります。結論は後で説明します。koa ミドルウェアの簡略化されたモデルは次のとおりです。

Promise.resolve(async m1 () {
 console.log(m1)
 await Promise.resolve(async m2 () {
 console.log(m2)
 await Promise.resolve(async m3 () {
 console.log(m3)
 ctx.body = 'xxx'
 })
 console.log(m2 end)
 })
 console.log(m1 end)
})
async/await の機能が非同期操作を「同期」することであることはわかっています (そうのように見えますが、そうではありませんが、心配する必要はありません)、ここでの Promise は当然「同期」です。これは、console.log (m3 end) のすべての非同期操作を「同期」できることを意味します。

結論

結論に達する前に、connect のミドルウェアもオニオンであるため、実際に考えてみましょう。 koa と同じように使用することに問題はないようです。次に、ユーザーの 1 人が getUser であると仮定して、見てみましょう。 connect と koa のメソッドそれぞれ:

// connect
app.use(function (req, res) {
 getUser(user => res.end(user))
})
// Koa
app.use(async (ctx) => {
 const user = await getUser()
 ctx.body = user
})
もちろん、違いはないようです。結論だけ言っておきます (ちょっと待ってください): connect ミドルウェアは同期であり、他の非同期操作を「待機」しませんが、koa は同様です。もちろん、待機しなくても問題ありません。

関連する推奨事項:

Express ミドルウェア モデルと koa ミドルウェア モデルの違いと接続を比較する

以上がExpressとkoaの使用比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。