Node.js

Node.js を5分で大雑把に理解する

随時更新します。

対象の人

  • 使ったことないけど、軽く理解はしておきたい人
  • 本格的に勉強する前に、大まかな概要を知りたい人

特徴

  • サーバーサイドのJavaScript
  • 非同期 (I/Oの処理結果を待たず処理を進める)
    • ノンブロッキングI/O (I/Oの結果を待たないで処理をすすめる。I/O処理が終了したらコールバック関数を実行。)
  • イベントドリブン (何かしらのキッカケで動き始める)
  • シングルスレッド (メモリ消費が少ない、仕事切り替えが少ないので速い)
  • JavaScript エンジンが Google の V8 で速い

Node.jsで作られたアプリの特徴

  • 小さいデータや小さい計算の場合、速い
  • メモリ消費量が少ない
  • ローカルとリモートとのデータのやり取りをシームレスに行うフレームワーク(Meteor)などが出てきている
  • サーバ側、クライアント側で処理の共通化ができる (入力値チェックなど)
  • サーバサイドのコード変更した場合、Node.jsアプリの再起動が必要(な場合が多い)
  • リアルタイムなアプリケーションに合う
    • シングルページアプリケーションに合っている
    • WebSocketを利用するアプリに合っている

node.js は何を解決する?

  • C10K問題 (クライアント1万台接続問題)を解決する
    • 従来のWebサーバは、1万接続もあるとパフォーマンスが落ちる。ので、その問題を解決する

どのように解決する?

  • ノンブロッキングI/O
    • I/Oの待ちをなくすことで、沢山の接続を速くこなすことができる

例えば、ハードディスクの入出力のスピードは、CPUやメモリーから見ると非常に遅い。書き込み完了を待っているのは非常に時間の無駄なので、ハードディスクに書き込む命令を出して、書き込めたかの結果を待たず次の処理をどんどん進めてしまうので非常に処理を早くすすめられる。書き込めた場合にコールバックが呼ばれる。

フレームワーク?

  • Node.jsは、フレームワークではありません。ライブラリでもありません。
  • JavaScript アプリケーションのプラットフォーム
  • Node.jsでは、Webサーバとアプリケーションが同じ PHPのWebサイトで無理やり例えると、Apache + mod_php + Webアプリ です。なので、Node.js の Hello Worldのサンプルは、HTTPを受付け、200とヘッダーと内容を返す、というのが多い

サーバーサイドJavaScript

  • ファイル読み書きは、fsモジュールを使う

node.js 上の有名なフレームワーク

  • Express (シンプルなフレームワーク)
  • Backbone.js
  • Sails (Railsライクなフレームワーク)
  • Meteor

訂正) AngularJS (Angular2)を、node.jsのフレームワークと記載しておりましたが、ご指摘によりJavaScriptのフロントエンドのフレームワークということで削除いたしました。

基礎用語

  • コールバック関数(非同期の処理が終わったら呼ばれる関数)
  • CommonJS (共通化しようとしている規格)
  • libuv (libev, libeio) 非同期I/Oライブラリ, イベントループ・ライブラリ
  • DIRT (data-intensive real-time) DIRTy アプリ
  • npm (node package manager)
    • 沢山のモジュールとそのバージョンやモジュールの依存性を管理する

クライアントサイド JavaScript との違い

  • ホストオブジェクト: ブラウザの globalな window オブジェクト
  • require
  • モジュール: ファイルI/Oなど
  • C/C++プラグインで拡張可能
  • npm: パッケージマネージャー

参考

Node js 入門