by shigemk2

当面は技術的なことしか書かない

大阪Node学園一時限目 Node.jsとは

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を使うのもいいのではないか?