タイトル
サーバサイドJavaScript Node.js入門
著者
清水俊博 (著), 大津繁樹 (著), Jxck (著), 小林秀和 (著), 佐々木庸平 (著), 篠崎祐輔 (著), 高木敦也 (著), 西山雄也 (著)
出版社
アスキー・メディアワークス
Amazonで購入する

本書は、「Node って何?」という人から「Node の中身はどうなっているの?」を知りたい人のために幅広く網羅的に書かれています。

  1. Node の基本から順番に理解していきたい
  2. Node を使ってすぐに Web アプリケーションを作ってみたい
  3. Node の内部構造を理解したい

これらのモデルケースに合う人にオススメの書籍です。

おぼえがき

Node とはなにか?

Node はプログラミング言語ではありません。言語としては JavaScript を使います。 Node は JavaScript ライブラリではありませんし、アプリケーションフレームワークでもありません

Node はスケーラビリティに優れた、Web アプリケーションを実行するためのサーバサイドのプラットフォームです。 特徴は、I/O 処理が非同期で行われプラットフォーム自体がサーバ機能を提供する方式であることです。

JavaScript で実現されたイベントループと非同期処理の仕組み、WebSocket との相性の良さ、V8 エンジン搭載などの技術的に優れた部分を持ち合わせています。 Node は、従来の同期処理から決別し、ライブラリを含めてスレッドをブロックすることのない世界を作り上げました

JavaScript である理由

JavaScript ではスレッドライブラリが定義されておらず、多くの実装はシングルスレッドで動作します。また、イベントの仕組みをうまくつかって非同期処理を行います。 Node の世界にマッチさせるライブラリは非同期で動作しなければなりませんが、サーバサイドで JavaScript は今までほとんど使われてこなかったため、 サーバサイドのライブラリはゼロから作り上げる必要がありました。つまり、過去の資産を気にすることなく非同期かつスレッドをブロックしない I/O を利用させることが可能でした

近年爆発的にユーザ数が増えると、C10K という問題が起こることがクローズアップされ始めました。 従来のアーキテクチャは、クライアントのアクセスに対して一つのスレッドを割り当てるマルチスレッドモデルで同時アクセスをさばいていました。 しかし、これではユーザ数が増えた際にスレッドを大量に生成しなければならず、この部分がボトルネックになるようになりました。

そこで、マルチスレッドモデルに対して、シングルスレッド+イベントループ により複数のクライアントをさばくというモデルがではじめました。 JavaScript はシングルスレッドモデルですし、イベントループの仕組みを使って非同期処理を行うようになっています。この C10K 問題に対する解として JavaScript はうってつけだったのです。

Node とリアルタイムアプリケーション

HTML5 が世に広まり始めると、その仕様の一部として策定されていた WebSocket プロトコルが注目されるようになってきました。(現在では HTML5 とは独立した仕様になっています。)

WebSocket は HTTP 通信とは異なり、接続を維持したまま通信することが前提のプロトコルです。接続確立時には HTTP をつかいますが、その後の通信では独自のプロトコルを使います。 そのため、WebSocket でリアルタイム通信を行おうとするとサーバ側も対応しなければならず、大掛かりになりがちでした。

Node はプログラム内にサーバ機能を実装可能であるという特徴から、WebSocket 用のモジュールが用意されました。 これらのモジュールを使うことで簡単に WebSocket を利用したアプリケーションが構築できるようになりました。

こうして、リアルタイム通信を行うなら Node という方程式が出来上がったのです。

Node のプログラム

Node はイベントループが回ることですべての処理をさばきます。Node のプログラムは 必要なイベントハンドラを登録し、適切なタイミングでイベントを発生させる ことで成立しています。 これは、ブラウザ上の JavaScript とほとんど同じプログラムコードになります。

モジュール

Node のモジュールは JavaScript で記述されたファイルか、アドオンと呼ばれる C/C++ で記述されコンパイルされたファイルで構成されます。

Node では 1つのファイルは必ず1つのモジュールに対応します。 あるファイルをモジュールとして利用可能にするには module オブジェクトか exports オブジェクトを使って必要な関数、オブジェクトを公開します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module.exports = {
  funcA: function() {
  }
};

function funcB() {
}
module.exports.funcB = funcB;

// exports を外部公開オブジェクトとして定義する場合は慣例として次のように書く
module.exports = exports = {
  foo: 'bar',
  funcA: function() {
  }
};

感想

Node とはなにか?Node の仕組みを知りたい、Node を始めたいという人向けのタイトル通りの「入門」書だと思いました。 実際に使われているモジュールやフレームワークの説明なども入っているので、コレ一冊でとりあえず Node を始められるようになっています。 ここから始めて見て、壁にあたったら次の参考書を読んでみるという感じがいいんじゃないかと思います。

内容としては、プログラミング知識がある人(とくに JavaScript)なら、優しすぎず難しすぎずという感じです。

目次

  1. Node とは何か
    1. 非同期プログラミング
    2. なぜ従来から非同期プログラミングが行われてこなかったのか
    3. Node の誕生と既存の言語
    4. JavaScript である理由
    5. シングルスレッドの強み
    6. Node とリアルタイムアプリケーション
  2. インストール
    1. OS ごとのインストール方法
    2. 環境構築ツールを使う
    3. npm を使ったパッケージのインストール
  3. 開発環境
    1. エディタ
    2. IDE
  4. Node入門
    1. Node コマンド
    2. イベントループ
    3. HTTP サーバ
    4. イベントループの落とし穴
    5. まとめ
  5. モジュール
    1. モジュールの作り方
    2. モジュールの使い方
    3. モジュール活用
  6. イベント
    1. Node とイベント駆動プログラミング
    2. イベントの作成と利用
    3. リスナ配列
    4. 特殊なイベント
    5. シグナルとイベント
    6. まとめ
  7. イベントループとprocess.nextTick()
    1. Node のイベントループの仕組み
    2. 非同期イベントの生成
    3. 非同期コールバックの呼び出し
  8. ストリーム、バッファ、ファイルシステム
    1. ストリーム
    2. Buffer
    3. ファイルシステム
  9. ソケット(TCP/UDP)
    1. net モジュール
    2. TCP サーバの概要
    3. TCP クライアントの概要
    4. TCP エコーサーバ・クライアントの実装
    5. TCP と同期プロトコル
    6. drain イベントを利用したデータ送信制御
    7. TLS 通信の利用
    8. OS のTCP 機能と直接関わるAPI
    9. dgram モジュール
  10. HTTP/HTTPS
    1. http モジュール
    2. http.Server のエコーサーバの実装
    3. HTTP RESTful サーバの実装
    4. HTTP クライアントの概要
    5. https モジュール
    6. url モジュール
    7. querystring モジュール
  11. Domain
    1. domain モジュールの概要
    2. domain モジュールのクラス
    3. ドメインへのオブジェクトと関数の結びつけ
    4. Implicit Binding
    5. Explicit Binding
    6. ドメインを利用したエラーページの表示
  12. ユニットテスト
    1. はじめに
    2. assert
    3. should
    4. chai
    5. mocha
    6. vows
  13. デバッグ
    1. デバッガの基本機能
    2. 組み込みデバッガを利用したCUI でのデバッグ
    3. Node Inspector を利用したGUI でのデバッグ
    4. 組み込みデバッガとNode Inspector の使い分け
    5. IDE でのデバッグ
    6. その他のサードパーティのデバッグモジュール
  14. 実践編導入
    1. 実践編で扱う技術について
    2. 共通して扱うモジュール
  15. Express入門
    1. はじめに
    2. Express の導入
    3. Connect のアーキテクチャ
    4. Express のアーキテクチャ
  16. Express を用いたフォーラムアプリケーションの作成
    1. はじめに
    2. ルーティング
    3. データの永続化
    4. その他のリクエストメソッド
    5. ビューの改善
    6. エラー処理
    7. ミドルウェア
    8. ユーザー登録とログインの実装
    9. セッション
    10. ルートミドルウェア
    11. remember me の実装
    12. Tips
    13. 終わりに
  17. Socket.IO を使ったファイル共有アプリケーションの作成
    1. はじめに
    2. 準備
    3. ユーザー名の指定
    4. チャンネルの実装
    5. ファイルの送信
    6. ファイルの受信
    7. ファイルの永続化
    8. ファイルの配信
    9. 終わりに
  18. 外部API との連携
    1. ハッシュタグストリーミング
    2. 今一緒にいる人を一括フォロー
    3. 終わりに
  19. Node はどう作られているか
    1. JavaScript とNode
    2. C10K とNode
    3. Web アプリケーションアーキテクチャとしてのNode
  20. 非同期プログラミングの改善
    1. はじめに
    2. コールバック関数の問題
    3. コールバック関数の改善
    4. まとめ
  21. アドオンの作成
    1. 概要
    2. シンプルなHelloWorld のサンプル(オブジェクトの作成)
    3. メソッドを持つアドオンのサンプル
  22. npm パッケージ
    1. チュートリアル
    2. パッケージの公開
    3. パッケージの詳細
    4. まとめ
  23. スケーラビリティ
    1. 複数プロセスの起動
    2. 複数サーバでのスケールアウト
    3. 終わりに
  24. 運用
    1. Apache やNginx との連携
    2. 環境