azu / JavaScript-Plugin-Architecture

JavaScriptプラグインアーキテクチャの本
https://azu.github.io/JavaScript-Plugin-Architecture/
MIT License
250 stars 12 forks source link

Connect `use` #22

Closed azu closed 9 years ago

azu commented 9 years ago

Connectのアーキテクチャ

URL: https://github.com/senchalabs/connect

どう書ける?

var connect = require('connect')
var http = require('http')

var app = connect()

// gzip/deflate outgoing responses
var compression = require('compression')
app.use(compression())

// store session state in browser cookie
var cookieSession = require('cookie-session')
app.use(cookieSession({
    keys: ['secret1', 'secret2']
}))

// parse urlencoded request bodies into req.body
var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded())

// respond to all requests
app.use(function(req, res){
  res.end('Hello from Connect!\n');
})

//create node.js http server and listen on port
http.createServer(app).listen(3000)

どういう仕組み? #57


チェックリスト

azu commented 9 years ago

Node.jsのモジュールで.use(plugin)的なものが結構多い気がするけど、 これは何が起源なんだろ? connectが最初なのかな?

ledsun commented 9 years ago

connectのuseはRack DSL起源ではないでしょうか? 実践Node.js プログラミングのP149に

Connect ミドルウェアのコンセプトは、もともと Ruby の Rack フレームワークの影響を受けている。
だから Rack と非常によく似たモジュールインタフェースを提供するが、Node はストリーミング方式なので
API は共通ではない。

という記述がありました。

Ruby - Rack解説 - Rackの構造とRack DSL - Qiitaに、useメソッドを使うと

run Rack::ETag.new(
  Rack::Deflater.new(
    Rack::Directory.new 'public'
  )
)

を次のように書ける

use Rack::ETag
use Rack::Deflater
run Rack::Directory.new 'public'

という例がありました。とてもconnectぽいと思います。

azu commented 9 years ago

@ledsun ありがとうございます。なるほど。 たしかにconnectのはrackに影響受けてそうですね。

package.jsonのkeywordsにもrackがあったりしました

azu commented 9 years ago

コールドリーディング v2

azu commented 9 years ago

middleware patternと呼ばれる事がある感じ

azu commented 9 years ago

connectはmiddleware間の依存関係とか定義ないので、色々自分でガンバってやる必要があって、細かいのは実装でやってね的な感じっぽいな

azu commented 9 years ago

Node.js - 逆引きメモ:expressの使い方 - Qiitaはmiddlewareの考え方が簡単にまとまってる。

azu commented 9 years ago

rackの実装

azu commented 9 years ago

ミドルウェアとは何かを一言で言うと,「別なアプリケーションをラップして,リクエストやレスポンスを加工したり,処理を切り換えたりするRackアプリケーション」です -- http://gihyo.jp/dev/serial/01/ruby/0025

azu commented 9 years ago

このミドルウェアの連鎖をミドルウェアスタックといいます。 -- 第3回 WSGIミドルウェアの作成:WSGIとPythonでスマートなWebアプリケーション開発を|gihyo.jp … 技術評論社

Rack middlewareの仕組みの元ネタはPythonのWSGI middlewareという感じなのかな

azu commented 9 years ago

Connectに統一しよう #48

azu commented 9 years ago

この仕組みエラーハンドリングがイマイチピンとこないという大変そう

やっぱり実際大変なのかな

azu commented 9 years ago

middlewareスタックなやつ、直接オブジェクトを変更しないで、抽象オブジェクトを入れて編集させれば矛盾ある変更とかの検知ができるようになる気がする

azu commented 9 years ago

ひとまず書けたのでCloseします

微妙に曖昧なところもあるので Pull Request歓迎です

azu commented 9 years ago

middlewareの仕組み