Node.jsはじめてみた

話題……というには今更だけどなんとなくNode.jsを始めてみた。
本当はSymfony2をモノにしようと勉強する予定だったんだけど、飲み会で「Node.jsやりたい!」って言ってる人がいて「ふーん」と思いつつもちょっと気になって手を出してみた。そしたらなんか面白くなってきてハマっちゃったかもw

Node.jsに抱いていたイメージ

自分がNode.jsに抱いていたイメージは「サーバサイドJavaScriptの一種」「ノンブロッキングI/Oとイベントループで大量のアクセスもさばけるらしい」とかそんな程度だった。最近だと「WebSocketのために使われる」みたいなイメージも。
でもまぁ、一部の用途ではいいソリューションになるんだろうなーと思いつつも、どこか「面白そうだったのでサーバサイドでJavaScript使えるようにしてみましたー」的な遊びっぽいイメージのほうが強かった。
けど、どうもそうじゃなかったらしい。

Node.jsとは何か

Node.jsを試してみるにあたって、とりあえず情報収集していると“node.jsとは何か”という自分の疑問にずばり答えてくれそうなエントリが見つかった。(4)まであるので自分みたいに「Node.jsって結局なんなの?」って思ってる人は是非とも読むべし。


簡単にまとめるとこういうことらしい。

  • C10k問題でよく比べられているアーキテクチャにスレッドモデルとイベントループモデルがある。*1
  • スレッドは数が多くなるとメモリ消費量が増える。
  • 対してイベントループは1プロセスのままなのでたいしてメモリ消費量は増えない。
  • だけどイベントループはどこかにブロックするやつがいると全体の処理が止まってしまって大変!
  • そして既存の言語にもイベントループの実装はあるけど、Non-Blocking I/Oを強制しているわけではないので止まってしまう不安がつきまとう。
  • 対してJavaScriptは元々がシングルスレッドでイベントループという仕組みを持っていた。
  • さらにWebやってる人ならだいたいJavaScriptは触ったことあるよね!→学習コストが低い。
  • さらにGoogle V8という高性能で組み込みやすいJavaScriptエンジンがある!

こうしてNode.jsは誕生したらしい。

とりあえず環境を作ってみる

前置きがすごーーーーーく長くなったけど対象のことを知るのは大事よってことで。むしろ、どういうものかわかったことで俄然興味が湧いてきた。


さてさて、自分はMacなのでhomebrewで簡単にインストールできるみたいなんだけど、どうやらnaveとかnvmっていう環境管理ツールを使うのがいいらしい。
RubyのRVMやPerlのPerlbrew、Pythonのvirtualenvみたいなやつで、Node.jsをバージョンごとにインストールして切り替えたりできるやつ。

nave

https://github.com/isaacs/nave

  • npmというNode.jsにおけるパッケージ管理システムの作者が作成しているので、なんとなく安心感がある。
  • nave useするときにシェルが再実行されるのでなんとなく気持ち悪い。環境変数とかぐちゃっとしそうだし。そのうち改善されるかな?
nvm

https://github.com/creationix/nvm

  • npmもインストールしてくれる。らしいけど、最近は最初からNode.jsについてる?
  • nvm useしてもPATHとかをexportし直すだけでシェルを多重起動したりしない。
  • zshといまいち相性が良くない。時々エラーが出たりする。が、概ね動く。

nvmのインストール

自分はnvmを入れてみたけど、たぶんどっちも大差ないと思う。
というわけでnvmのインストール。

git clone git://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh

んで、.bashrcとか.zshrcにもsource ~/.nvm/nvm.shを書いておく。
これで完了。
ちなみにnaveの場合はsourceで読み込む必要もなく、nave.shを落としてきてそれをコマンドとして使えばいいみたい。


使い方はこれ系のツールとだいたい同じで、サブコマンドのinstallとかuseとかを使えばよい。とりあえず実行するとヘルプが表示される。

Node.jsのインストール

さっそくnvmでNode.js本体をインストールしてみる。

nvm install v0.6.6

これだけ。で、使ってみる。

nvm use 0.6.6

これでv0.6.6が有効になった。

とりあえずHello, World!

Node.jsのトップにあるEXAMPLEを試してみよう。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

これをhello.jsとかに保存して

node hello.js

で実行。
ブラウザでhttp://127.0.0.1:1337/にアクセスすると「Hello World」が表示される。
シンプルなコードなのでだいたい上のコードがどういう内容なのか想像が付くはず。ちょっと肉付けしたら色々できそうでワクワクしてきたでしょ?

ライブラリとかフレームワークとか

Node.jsにはnpmという他の言語にもよくあるようなパッケージ管理システムがあって、これを使って色々なライブラリをインストールできる。
MySQLクライアントのnode-mysqlとか、WebアプリケーションフレームワークのExpressとか、テンプレートエンジンのejsとかとにかく色々ある。

npm install express

ってな感じで簡単にインストールできる。

コマンドラインツールとして

ここまで来るまで実はNode.jsってWebサーバなんだと思ってたんだけど、サーバたらしめてるのはどう見てもrequireしてるhttpってやつやnetのおかげらしくて、普通にJavaScriptを書けばサーバでもなんでもない普通の処理もできるってことに気づいた。
実際そういう使い方もあるみたいだし、標準でReadlineライブラリもあるし、npmにはoptimistとかjs-optsといったgetopt系のライブラリもあるみたい。
組み込みライブラリ、npm含めて結構色々揃ってるからそういう使い方もいいかなーとか思ったり。
っていうか本体にREPLついてるじゃん!

ドキュメント

とりあえずこの辺のドキュメントが参考になった。


特にハンズオン資料は一通り目を通すとNode.jsで何ができるのか、どうしたらいいのかがざっくりと理解できる。
で、APIマニュアルにざっと目を通してどんな機能があるのか把握しておけばよいかと。目次見るだけでも色々あってワクワクするね!

今後やりたいこと

  • Expressでとりあえず普通にWebアプリ作ってみる
  • WebSocketでなんかリアルタイムに動くやつとか!
  • コマンドラインツールとして使ってみる

*1:よく例に挙げられる代表はApacheとnginx