Node.js とは…
$ node hoge.js
で、javascriptファイルをターミナル上で実行出来る!
javascript without DOM(DOMがないので、document.writeとかやってもエラー
になる)
nodeの標準モジュールを使ってコードを書くことになる
サードパーティのモジュールもある(Rubyでいうところのgem)
4200ちょっとくらいモジュールがあることになる。
Install
Linux nave
Mac homebrew or nave(naveのほうがversion指定出来て便利かな?)
Windows?
npm
Linux and Mac
curl http://npmjs.org/install.sh | sh
Windows?
Keywords
非同期 コールバック クロージャ
1. 非同期
// .on('ready',
非同期=イベントドリブン(htmlが読み込まれたときには実行されない)
2. コールバック=イベントハンドラ
イベントが発生したら実行される
3. クロージャ(関数の中に関数)
インスタンス変数らしきものの保護
ループ内の変数の保護
var target = [1,2,3,4,5,6,7,8,9,10] for(var i in target) { console.log('sync: '+target[i]) } // x for (var i in target) { // 遅延中にループが終わり、最後の値しか評価されない setTimeout(function(){ console.log('false async: ' +target[i]) }, 0); } for (var i in target) { // 順番はアテにならないけどね (function(current){ setTimeout(function(){ console.log('true async: ' + current)}, 0) })(target[i]) }
forにご注意
クロージャで変数の値を保護するか、
forEachを使う
target.forEach(function(current){ setTimeout(function(){ console.log('forEach: ' + current) }, 0) })
process.nextTick()
- 関数のコールスタックにコールバックを追加する
使いかた
- ブロックしないループに使う
- インスタンス変数の初期化(やらないと初期化されてないってめっ☆てされる)
- StackOverFlow
引数の習慣
- エラーが最初にくる
- コールバックは最後に来る
無名関数を使って即実行する
CoffeeScript(Rubyぽくjavascriptを書ける)
前回のフォローアップ
Express (Webアプリフレームワーク)
connect1.8以降でbodyParserにuploadDirを指定するだけでファイルアップロー
ドをできるようになる
app.use(express.bodyParser({ uploadDir: './upload_files' })
Express3が鋭意開発中
ビューのlayoutがなくなる(テンプレートを使うべしとのこと)
partialもなくなる
req.flashがなくなる
helperとdynamicHelperもなくなる(ミドルウェアをつかうべし)
res.renderをつかうように
CoffeeScriptの暗黙のスコープの問題
foo = ()-> x = 'x' console.log x foo() console.log x x = 'a' foo = ()-> x = 'x' console.log x foo() // x console.log x // x
Nodeを使う理由
非同期ノンブロッキング
今までのソリューションでOKじゃないか?
でも解決策の一つとしてNodeを使うのもいいのではないか?