JavaScript
Node.js

はじめてのNode.js

Node.js

https://nodejs.org/ja/docs/

どんなもの

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 = パッケージ管理ツール

  1. 公式ページからダウンロード or 「$ brew install node.js」
  2. node -v
  3. 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/
にアクセス。ブラウザ上に出力される。