JavaScriptフレームワークやHTML5テクニックの紹介とともにNode.jsが取り上げられることが増えている。Node.jsはChromeのJavaScriptエンジンV8を活用して開発が進められているサーバサイドプラットフォーム。JavaScriptを使ってサーバサイドで動作するアプリケーションを簡単に開発できる。Node.jsには次のような特徴がある。
- JavaScriptを使ってサーバサイドアプリケーションを開発できる。
- スケーラビリティの高いネットワークプログラムを高いスキルを要求されずに開発することが可能。
- 高い並列性を実現。内部の実装はepoll(7)、kqueue(2)、/dev/poll、select(2)などOSごとに提供されているポーリング機能を使い、スレッドは使っていない。結果として、スレッドベースのサーバと比較してコネクションあたりのメモリ消費が少なく、かつ高速に動作する。プロセスデッドロックも発生しない。
- 活発に開発が進められているChrome JavaScriptエンジンV8の開発成果の恩恵を受けられる。
Node.jsはMac OS X、Linux、FreeBSD、OpenBSD、Windows/Cygwinなどで動作する。Node.jsの説明を参考にソースコードを取得して自力でビルドしてインストールするか、OSの提供しているパッケージ管理システム経由でインストールすればいい。最新開発版を利用するならFreeBSDのPorts Collection (www/node-devel)からインストールするのが簡単。安定版ならMac OS XのMacPorts経由でもいい。ビルドするならUbuntuが簡単。ビルドにはPython 2.4+と場合によってはOpenSSLが必要。
Node.jsに掲載されているサンプルがNode.jsの特徴をつかむ上でわかりやすい。たとえばテキストを返すだけのHTTPサーバは次のように作成する。
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
動作しているサーバへは並列アクセスが可能。OSの効率のいい機能を使って並列接続を処理してくれる。HTTP接続はNode.jsが提供しているもっとも代表的なクラス。ほかにもソケットレベルでの処理も提供している。ソケットを使ってEchoサーバを作成するサンプルは次のとおり。掲載してあるソースコードはNode.jsに掲載されているサンプルにログを出力する処理を追加したもの。ソケットベースで動作するサーバにはtelnet(1)でアクセスすればいい。
var net = require('net');
net.createServer(function (socket) {
socket.write("Echo server\r\n");
socket.on("data", function (data) {
socket.write(data);
});
}).listen(8124, "127.0.0.1");
console.log('Server running at 127.0.0.1, 8124');
サーバサイドで動作するアプリケーションの開発にはJavaを使うことが多い。Webページの表示に強く関係付けられている場合にはPHPを使うことが多く、ほかにもRuby、Python、Perlなどのプログラミング言語を使ってサーバサイドのアプリケーションは開発されている。処理速度が必要になるケースではC/C++への置き換えもおこなわれる。
Node.jsはJavaScriptを使ったプログラミングを提供してくれるため、WebページやWebアプリケーションを開発するフロントエンドプログラマがサーバサイドプログラムの開発も実施しやすくなるという利点がある。基盤技術として採用されているV8はChromeの開発とともに性能を向上させており、今後も高速化が期待できる。APIも充実しつつあり、手軽にサーバサイドアプリケーションを開発する技術としてNode.jsは興味深いプロダクトに成長しつつある。