Edited at

はじめてのNode.js

More than 1 year has passed since last update.


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/

にアクセス。ブラウザ上に出力される。