Node.js
どんなもの
JavaScriptの実行環境
- JSの仕様書(ECMScript)に従い、書かれたソースコードを動かす環境
- 大量のリクエストを高速にさばくためのプラットフォーム
- サーバーサイド言語
具体的には、以下のようなもの
- Chrome : V8
- IE : JScript
- などなど・・・
主な特徴
- シングルスレッド
- ノンブロッキングI/O × イベントループ
シングルスレッド・マルチスレッド
とは
- シングルスレッドでは、カーネルに対する処理(I/O)の場合など、読み込みが完了するまでスレッドが固まってしまう
- マルチスレッドはこれに対し、スレッドをコピーして次のスレッドを動かすことができる
Node.jsではどうなっているか
- シングルスレッドを利用している
- が、「ファイルI/Oの非同期」と「イベントループ」によって効率よく処理を行うことを可能にしている
- ※ ファイルI/Oの非同期だけならば、Ruby等でも効率化は可能なことに注意
ファイルI/Oの非同期化 = ノンブロッキングI/O
- ブロッキングI/O(通常のシングルスレッド)では、カーネルに対しI/Oを行うと同期処理のため固まってしまう。
- ノンブロッキングI/O(Node.jsでシングルスレッド)では、I/Oに対し非同期処理を行うことで並行処理を実現している。
- ノンブロッキングを実現(非同期処理を活用)をするために、JSが選ばれたという背景もあるらしい
イベントループ
- イベント待機のループを持つ、仕組みのこと
- コールバック関数で記述されたイベントが動作(処理)した後、この仕組みが働き、イベントの監視・処理を継続的に行うことができる
非同期処理の例
例えばsetTimeout等、コールバック関数を使うような書き方。
※ 以下を実行すると、1番->2番の順番で出力される。
hoge.js
setTimeout(function() {
console.log("2番");
}, 1000);
console.log("1番");
Node.jsはどこで利用されているか
- サーバサイドアプリケーション
- クライアントサイドアプリケーション
- IOTとか
- VSCodeも
Node.js + npm のインストール方法
※npm = パッケージ管理ツール
- 公式ページからダウンロード or 「$ brew install node.js」
- node -v
- npm -v
ターミナルでHello World
hello.js
console.log("hello world");
$ node hello.js
で実行。ターミナルに出力される。
webサーバーでHello World
server.js
// httpモジュールの用意
var http = require('http');
var server = http.createServer();
// コールバック関数を用いたイベントの設定
server.on('request', function(req, res) {
var data = "hello world";
// http.ServerResponseオブジェクト
// ヘッダー書き込み
res.writeHead(200, {
"Content-Length": Buffer.byteLength(data),
'content-type': 'text/plain'
});
// ボディー書き込み
res.write(data, "utf8");
// 完了
res.end();
});
// ポート番号とipアドレスを設定, 接続受付の開始
server.listen(3000);
console.log("server listening...");
http://localhost:3000/
にアクセス。ブラウザ上に出力される。