Connect ソースコードリーディング(1) - ソースコードの依存関係
前置き
Node.js で一番よく使われている Webフレームワークといえば、Express です。で、その Express が大きく依存しているのが Connect です。
Express を制するにはまずは Connect から、というわけで、Connect のソースコードを読み始めました。
対象とする Connect のバージョンは現時点(2011/11/23)での最新版である 1.8.1 (Express 2.5.1 が依存)です。
初回は、ソースを読む前の事前準備として、ソースコードの依存関係と各ソースの概要について説明します。
Connect ソースコードの場所
1.x ブランチ (master は 2.0.0alpha1 なので注意)
senchalabs/connect at 1.x · GitHub
現時点でのメイン・コミッター(≒ 最もアクティブにコミットしている人の意)は Express の作者である TJ Holowaychuk で、ライセンスは MIT ライセンスです。
ソースは以下のドキュメントで概要を掴んでから読むと理解しやすい。
Connect - High quality middleware for node.js
依存関係
ドキュメント以外の Connect リポジトリ内のソース/リソースの依存関係だけ洗い出すと以下のようになります。(標準モジュールやnpmモジュールへの依存関係は除いてあります)
index.js
|- lib/connect.js
|- lib/http.js
|
|- lib/https.js
| |- lib/http.js
|
|- lib/patch.js
|
|- lib/utils.js
|
|- middleware/basicAuth.js
| |- lib/utils.js
|
|- middleware/bodyParser.js
|
|- middleware/compress.js
|
|- middleware/cookieParser.js
| |- lib/utils.js
|
|- middleware/csrf.js
| |- lib/utils.js
|
|- middleware/directory.js
| |- lib/utils.js
| |- lib/public/style.css
| |- lib/public/directory.html
| |- lib/public/icons 配下のアイコン(PNG)ファイル
|
|- middleware/errorHandler.js
| |- lib/utils.js
| |- lib/public/style.css
| |- lib/public/error.html
|
|- middleware/favicon.js
| |- lib/utils.js
| |- lib/public/favicon.ico
|
|- middleware/header.js
|
|- middleware/limit.js
|
|- middleware/logger.js
|
|- middleware/methodOverride.js
|
|- middleware/profiler.js
|
|- middleware/query.js
|
|- middleware/responseTime.js
|
|- middleware/session.js
| |- middleware/session/session.js
| |- middleware/session/memory.js
| |- middleware/session/cookie.js
| |- middleware/session/store.js
| |- lib/utils.js
|
|- middleware/static.js
| |- lib/utils.js
|
|- middleware/staticCache.js
| |- lib/utils.js
| |- lib/cache.js
|
|- middleware/vhost.js
※ lib/index.js には実装はなく、ドキュメント用の jsdoc が書いてあるのみです。
各モジュールの概要
上記の依存関係を見ると分かる通り、Connect は少数のコアモジュールと middleware と呼ばれるプラグイン群で構成されています。middleware に関しては、後日別のエントリで解説するので、今回はコアモジュールのみ説明します。
| ソース | 概要 | |
| connect.js | ブートストラップ。createServer 関数、コアモジュール(HTTPServer, HTTPSServer, utils) と 組込み middleware の export 及び patch 当て | |
| http.js | middleware をプラグインとして利用可能な HTTPServer の定義。HTTPServer は Node の 標準http モジュールの http.Server.prototype を継承し、use(), handler() メソッドを追加しています | |
| https.js | HTTPServer の SSL 対応版 | |
| utils.js | ユーティリティ関数の定義。connect.utils 経由で呼び出せる。(詳細はドキュメント参照。後日エントリでいくつか解説します。) | |
| cache.js | staticCache ミドルウェアから利用されるメモリ内 LRU キャッシュクラス Cache の定義 |
コアモジュールだけ見ると、数も少なく、実装もとてもシンプルです。コアは小さくし、必要な機能をプラグインとして実装することで、柔軟なリクエスト処理を可能にしているのがわかります。
おまけ: patch.js って何やってるの?
jsdoc から自動生成されたドキュメントが微妙なので、おまけで解説しておきます。
Node.js の http.OutgoingMessage.prototype(= res) に以下のパッチをあてています。
- res.hederSent() メソッドの追加
- res.setHeader() メソッドで
- Set-Cookie で複数クッキーを同時に設定できるようにする
- Content-Type 指定時に自動的に '; charset=x' を追加する
- res._renderHeader() 呼び出し時に 'header' イベントを emit する処理を追加
次回予告
次回は Connect の基本的なリクエスト処理の流れと middleware の概要を解説します。