Node.js

**Node.js**（ノード・ジェイエス） はV8 JavaScriptエンジン上に構築されたJavaScript実行環境の1つである。イベント化された入出力を扱うサーバサイドJavaScript環境であり、Webサーバなどのスケーラブルなネットワークプログラムの記述を意図している。ライアン・ダールによって2009年に作成され、ダールを雇用しているJoyentの支援により成長している
。

## 概要
V8 JavaScriptエンジンで動作するが、ChakraCoreバージョンやMozillaによるSpiderMonkey移植のプロジェクトも存在する。

Node.jsはPythonのTwisted、Perlの、C言語の、Rubyのと同様の目的を持つ。
ほとんどのJavaScriptとは異なり、ウェブブラウザの中で実行されるのではなく、むしろサーバサイドJavaScriptの一種である。
Node.jsはいくつかのCommonJS仕様を実装している。
Node.jsは対話的なテスト用にREPL (Read-eval-print loop) 環境を含んでいる。

Node.jsを用いた構成としてはMEAN等が提唱されている。

## 例
Node.jsによるHTTPサーバ版のHello world:

```javascript
const http = require('http');

http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(3000);

console.log('Server running at http://127.0.0.1:3000/');
```


3000番ポートで接続を待ち受けて、受け取ったデータをエコーバックする単純なTCPサーバ:

```javascript
const net = require('net');

const server = net.createServer(function (stream) {
    stream.write('hello\r\n');

    stream.on('data', function (data) {
        stream.write(data);
    });

    stream.on('end', function () {
        stream.end('goodbye\r\n');
    });
});

server.listen(3000, 'localhost');
```


## モジュール
Node.jsは、バイナリにコンパイルされた多くの「コア・モジュール」とともに提供される。それはネットワークの非同期ラッパーであるnetモジュールの他、パスやファイルシステム、バッファ、タイマー、より一般的なストリームなどの基本的なモジュールを含む。サードパーティー製のモジュールを使用することも可能である。それはプリコンパイルされた ".node" アドオン、または、プレーンなJavaScriptファイルのどちらの形式でもよい。JavaScriptモジュールはCommonJSモジュール仕様に従って実装され、モジュールが実装する関数や変数へのアクセスにはexports変数が使われる。

サードパーティーのモジュールはNode.jsを拡張または抽象レベルを提供することで、ウェブアプリケーションで使われる様々なミドルウェア実装することができる。たとえばポピュラーなフレームワークとしてconnectおよびExpress.jsがある。モジュールは単なるファイルとしてインストールすることもできるが、通常はnpmを使ってインストールされる。それは依存性の扱いも含めてモジュールの構築、インストール、更新を助けてくれる。さらに、モジュールはNodeのデフォルトであるモジュール用ディレクトリにインストールしなくても、相対的なパス名を要求することで見つけられる。Node.js wikiに利用可能なサードパーティー製のモジュール一覧がある。

Node.jsを用いたWebアプリケーションでは、Express.jsや、のようなフレームワークを用いて開発を行うことが多い。

### 表明
Node.jsはコアモジュール `[https://nodejs.org/api/assert.html assert]`により表明（assertion）に対応している。表明違反時には`[https://nodejs.org/api/assert.html#assert_class_assert_assertionerror assert.AssertionError]`インスタンスがスローされる。
```javascript
const assert = require('assert').strict;

assert.deepEqual(1, 2);
// Thrown:
// AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
// 
// 1 !== 2
```


### ECMAScript modules
Node.jsは ECMAScript modules (ES module) に対応しており、以下のいずれかを満たすものをES moduleとしてロードする。

* 拡張子が `.mjs` であるファイル
* 拡張子が `.js` かつ最近傍の親 `package.json` で `"type":"module"` が指定されたファイル
* `--input-type=module` フラグと共に引数として渡されたモジュール文字列

## リリース
Node.jsは長期サポート (LTS) リリースモデルを採用している。

各メジャーバージョンは*Pending* → *Current* → (*Active LTS* → *Maintenance LTS* →) *End of Life* のリリース状態を経る。Currentリリースは6ヶ月間続き、奇数バージョンはその後*Maintenance LTS*のみを経てサポートが終了し、偶数バージョンは*Active LTS*を経て*Maintenance LTS*へ移行する。プロダクションアプリケーションは *Active LTS* あるいは *Maintenance LTS* のいずれかのみを利用しなければならない。

　
　

## コミュニティ
主に2つのメーリングリスト nodejs と nodejs-dev 、そして freenode上の IRC チャンネル #node.js を中心とするとても活発な開発者コミュニティが存在する。コミュニティはNode.jsにフォーカスした開発者会議であるNodeConfに集結する。

## Windows版
0.5.1より、Windowsネイティブ版バイナリをリリースをした。Windowsネイティブ版リリースに関してはマイクロソフトの支援が行われた。Windows向けの非同期I/O環境（、以下IOCP）に対応するため、libuvを作成することにより抽象化を進めた。結果としてlibev、libeioが使えるUnix系プラットフォームとIOCPを利用するWindowsプラットフォーム向けのリリースが可能になった。

## クライアント1万台問題

非同期処理のNode.jsではクライアント1万台問題は起きない。

Node.jsでこの問題を解決した技術の中核は、シングルスレッドにおける非同期処理を容易に実装可能にしたイベント駆動型プログラミング環境である。

## Docker Image
Node.js公式からDockerイメージが配布されている。イメージは以下の3種類に大別され、全てのイメージで`node`/`npm`/`yarn`がプリインストールされている。

* `node:<version>`: デファクトスタンダード。Docker公式の`buildpack-deps`を基に構築
* `node:alpine`: Alpine Linuxベース。イメージサイズを最小化したい際に推奨される
* `node:slim`: Node.js動作に必要最低限のパッケージのみを含む。サイズに制限がない限りデファクトイメージの利用を強く推奨

デフォルト以外の設定（例: npmアップグレード）を利用する手引き「Docker and Node.js Best Practices」や GetStarted が公式から提供されている。

## 脚注・出典

## 関連項目

* JavaScript
* V8
* Deno
* MEAN (ソフトウェアバンドル)
* Bun (ソフトウェア)

## 外部リンク
*  
* 
* 
* Node.js 日本ユーザグループ