基礎から学ぶNode.js

第1回Node.jsとは

はじめに

本連載では、注目を集めるNode.jsを使って、Webアプリケーションを様々なクラウド環境で動かすことを最終目的にしています。Node.jsに触れたことがないJavaやPHPなど普段サーバサイドで開発されている方を主な対象として、まずNode.jsの概要から紹介していきます。

Node.jsとは

Node.jsとは、ブラウザGoogle Chrome用に開発されたJavaScriptエンジンV8がサーバ上でプログラムを実行できるように、ファイルやネットワークI/Oなど多くの機能を追加したものです。軽量で効率よく多くのリクエストを処理するネットワークアプリケーションの構築ができるプラットフォームになっています。いわゆるサーバサイドJavaScriptの代名詞として注目を集めています。

Node.jsでは⁠軽量で効率良く⁠というのを実現するために次の2つのモデルを採用しています。

  • ノンブロッキングI/O
  • イベントループ

JavaScriptの1つの特徴にシングルスレッドで動作することがあります。これはNode.jsでも同様で、デッドロックなどを意識する必要がなくなります反面一度に1つの処理しかできないため複数の処理を捌けません。そのためNode.jsではノンブロッキングI/Oを採用しています。たとえば、データベースにアクセスして検索を実行して結果を取得する。この場合、データベースに問い合わせてから結果が返ってくるまで、待ち時間があります。一般的にはライブラリなどでデータベースから結果が返るまでの間、呼び出し元の処理を止めておきます。そのため結果を利用した処理を続けて定義できます。それに対してノンブロッキングI/Oは、データベースに問い合わせたら次の処理に移ります。結果の受け取りはコールバックで実現します。このように基本的に重い入出力処理は非同期で実行するのがノンブロッキングI/Oです。

さらにリクエストやコールバックの発生はイベントとして扱い(登録し⁠⁠、そのイベントに関する処理が終わったら、次のイベントを処理する。このようなイベントループをNode.jsは採用しています。

以降、Node.jsを単純にnodeとして表記します。開発者のダール氏たちも⁠node⁠と呼んでいるようです。

Nodeのインストール

http://nodejs.org/のサイトで、WindowsとMacにはインストーラが、そしてLinux用にソースコードが提供されています。インストーラは実行すると、Windowsは「C:\Program Files (x86)\nodejs\node.exe」と、Macは「/usr/local/bin/node」として、それぞれ実行ファイルがインストールされます。

基本的にLinuxにおいては、ソースコードからのコンパイルになります。GCCなどのコンパイラ環境がすでにインストールされている状態で、次のような手順でインストールできます。

$ wget http://nodejs.org/dist/v0.6.15/node-v0.6.15.tar.gz
$ tar zxvf node-v0.6.15.tar.gz
$ cd node-v0.6.15
$ ./configure
$ make
# make install

最後の「make install」はrootユーザで行い、⁠/usr/local/bin/node」として実行ファイルがインストールされます。

現状、バージョン0.6系が安定版、0.7系が開発版になります。本執筆では0.6系を前提に進めていきます。また特に環境は固定しません。

モジュールの使い方について

ブラウザ上で動くJavaScriptはすべてのjsファイルがマージされたものとしてスコープが適用されますが、nodeにはモジュールという単位で各機能を分割することができます。

モジュールが1つのjsファイルとなります。それぞれのグローバルスコープはそれぞれのjsファイル内で"閉じた"状態になり、exportsオブジェクトを通して外部に渡すことができます。モジュールの参照はrequire関数を使います。読み込んだモジュールのexportsオブジェクトを返してくれます。

モジュール参照の一例を見てみましょう。

exports.printFoo = function(){ return "foo" }

このコードをfoo.jsファイルとして保存します。このfooモジュールは、文字列「foo」を返すだけのprintFooメソッドを実装しています。

var foo = require('./foo.js');
console.log(foo. printFoo());

こちらのコードをmain.jsファイルとして、同じディレクトリに保存します。foo.jsをモジュールとして読み込んで、fooオブジェクトで参照します。printFooメソッドの結果をコンソールに出力します。

node main.js

を実行すると、コンソールに「foo」と出るのが確認できます。

最もシンプルなHTTPサーバ

Node.jsサイトのトップページにある以下のコードを辿り、具体的に動きを見ていきましょう。

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/');

httpモジュールをhttpオブジェクトとしてロードしています。次にhttpモジュールのcreateServerメソッドにはHTTPリクエストを処理してレスポンスを返すHTTPサーバアプリケーションとしての処理を定義する関数を指定します。このサンプルでは無名関数としてリクエストの内容にかかわらず、レスポンスとして、ヘッダをステータスコード200 OKでContent-Typeにtext/plainを返し、レスポンスボディとして「Hello World」を書き出しています。

createServerメソッドはHTTPサーバオブジェクトを返し、さらにそのlistenメソッドで1337番ポートとループバックアドレスにバインドしてサーバを開始します。

このコードをapp.jsファイルとして保存します。次のようにコマンドプロンプトで、nodeコマンドの引数に指定して実行します。

node app.js

任意のブラウザを立ち上げて「http://localhost:1337/」にアクセスすると、⁠Hello World」と表示されることが確認できると思います。

おそらく普段使われている言語では、WebサーバとしてTomcatやApache+CGIといったアプリケーションを動作させるコンテナがある状態で、中身のアプリケーションだけを、サーブレットのように定まった仕様で構築することが多いでしょう。nodeの場合は、前述のサンプルのようにそれ自身でコンテナとなるWebサーバもアプリケーションも、どちらもまとめて実装することになります。

最後に

今回は、Node.jsの概要からブラウザでのJavaScriptとは異なる、具体的なサーバサイドプログラミングに関わる部分を重点に紹介してみました。次回以降は、パッケージ管理npmの紹介や、フレームワークのExpressを使ってWebアプリケーションを作っていきたいと思います。

おすすめ記事

記事・ニュース一覧