Node.jsベースのWebアプリケーションフレームワーク、Koa version 0.2.0がリリースされた。Koaは人気のあるMVCプラットフォーム、Expressの後継だが、新しいES6で導入された機能を多用している。プロジェクトリードのTJ Holowaychuck氏はKoaについて「私がConnect/Expressから学んだことを取り込んで、今度こそ「正しい」ことをするチャンス」だと語っている。
このリリースは "short but sweet" と呼ばれており、最初の0.1.0リリースからの設計選択を再確認し、今後のリリースとプロダクション利用のためにKoaのAPIを固める上で重要なリリースだ。
0.2.0での変更
このリリースで最大のアップデートは、実際のところkoa-composeモジュールに対するものだ。ミドルウェアがリクエストを操作する前後で、その内容を標準出力(stdout)にログ出力することにより、開発者はミドルウェアを流れるリクエストをデバッグすることができる。
より小さな変更点としては、ソケットをNodeレベルで処理したあとNodeサーバがクラッシュしないようソケットエラーをルーティングすること、ExpressとKoaで共通の機能を両方のフレームワークが使えるようリファクタリングしてモジュール化したことが含まれる。ひとつの例は “accepts” モジュールだ。これはコンテンツネゴシエーションをするもので、Accept HTTPヘッダの値に基づき、サーバがリクエストに対して異なるタイプのコンテンツで応答できるようにする。
ジェネレータによる構築
Koaは自身を「次世代Webフレームワーク」と呼んでおり、coライブラリを利用している。このライブラリはECMAScript 6言語仕様("Harmony"として知られている)にあるジェネレータを使って、Nodeのノンブロッキング同期処理を生成する。HTTPリクエストで必要になる同様の「スタック処理」をするのに、これまでのNodeフレームワークはコールバックとPromiseを頼りにしていた。
ジェネレータは実際にはHarmonyイテレータを生成する「ファクトリ」だが、Koaはそれらを使って関数を同期オペレーションに変換する。Koa appはリクエストを複数のミドルウェアレイヤを通して渡すことができる。呼び出されるミドルウェア関数は、呼び出し元の処理を継続させるために、結果をyieldしなくてはならない。
var koa = require('koa'); var app = koa(); app.use(route.get('/', google)); function *people() { // “get” は非同期HTTP呼び出し var result = yield get('http://www.google.com'); // この行は上のyieldが戻るまで実行されない this.body = result; }
No Middleware
Koaにはミドルウェアが含まれていない。これによってフットプリントを小さく維持できる。Holowaychuk氏はこう説明する。「もともとは、たくさんのミドルウェアをConnectにバンドルしていました。エンドユーザのためだけでなく、自分たちのためでもありました。Nodeとそのエコシステム全体は急速に変化していたので、その方がメンテナンスしやすかったのです。それからはや数年、多くの人がミドルウェアをバンドルしたのは間違いだったと合意しています。」Holowaychuk氏はさらに続けて、このことが、Koaにはミドルウェアをバンドルしないが、便利にバンドルできる別のモジュールを提供することにつながったと言った。
koa-commonモジュールは、Webアプリケーションに必要なミドルウェアの多くをバンドルしている。開発者は自分のKoaアプリケーションに、NPM経由でこのミドルウェアすべてを追加することができる。
$ npm install koa-common
KoaとExpressの将来
Holowaychuk氏によると、Koaは時折ある奇妙なフィーチャーリクエストがなければ完成状態にあると考えている。
“deif”というユーザは、Koaがリリースされたことで、Expressの将来について懸念を抱いている。
これについて、いくつか質問があります。
- FAQにはExpressのステータスについて政治的回答がなされていますが、私はもう、Expressはアクティブにメンテナンスされないと思っています。合っていますか?
- Koaにフォーカスするなら、どうしてNodeフレームワークでビッグネームになっているExpressから名前を変えるのですか?
- 新しい開発者がExpressとKoaを見たとき、どちらにフォーカスしているかすぐにわかりますか?
要するに、なぜExpress 3.0 (あるいは4.0)と呼ばなかったのか不思議に思っているのです。
Holowaychuk氏は名前の変更についてこう説明した。
ExpressからKoaへの移行は簡単ではありません。同じように見えるかもしれませんが、根本的にかなり違っています。そのため、私はそれをExpress 4.0と呼ぶのではなく、新しい名前を与えた方がよいと思いました。… 引き続きExpressをメンテナンスしている人たちもいますし、もし興味があるならチームに参加することも可能です。