Express と koa の使用の比較 (詳細なチュートリアル)

亚连
リリース: 2018-06-09 16:01:57
オリジナル
1257 人が閲覧しました

Koa と Express のどちらを使用するべきかについて質問する人が多いため、次の記事で、Express と koa の関連情報を比較し、サンプル コードを通じてより適切な選択を行うことができます。とても詳しく書かれていますので、必要な方は参考にしてみてください。

はじめに

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

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

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
ログイン後にコピー
ログイン後にコピー

そのような結果上記のモデルとは少し違うように思えますが、これは線形ではないでしょうか? もちろん、これについてはすでに結論付けていますので、詳しく見てください。ここで結果を直接取得します。connect のミドルウェア モデルの疑似コードは次のように表現されます:

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')
})
ログイン後にコピー

上記のコールバックに気を取られないでください。これは非常に単純なコールバック関数です。res.end の後でも、コードは引き続き実行される必要があります。実際にはタマネギの形をしていますが、コードの同期は通常このようには行われないため、接続のミドルウェア モデルをもう一度説明できます:

Koa の実行プロセス

同様に、次のようにも述べています。 Koa のソース コード分析で Koa のミドルウェア モデル: オニオン型

次のコードを例に挙げます:

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 これは connect を読んだのと何ら変わらないようです。私も含めて、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 の役割はわかっています。これは「同期された」非同期操作です (そのように見えますが、実際はそうではありません。しかし、それについて心配する必要はありません)。ここでは当然「同期」されています。これは、すべての非同期操作が「同期」できることを意味します。 koa と同じように使用しても問題はないようです。 それでは、データベースから取得する必要があるユーザーは 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 のミドルウェアは同期であり、他の非同期操作を「待機」しません。もちろん、待たなくても問題はありません

以上が、今後皆さんのお役に立つことを願っています。

関連記事:

console.log(m3 end)

nodejsのキャッシュとしてredisを介して実装されたカプセル化されたキャッシュクラス

Expressでのbcryptjsパスワード暗号化の使用

Vueの要素を通じてアイコンアイコンを使用します

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート