Node.js

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

1. 概要
-----

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

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

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

2. 例
----

Node.jsによるHTTPサーバ版のHello world: const http = require;

http.createServer { response.writeHead; response.end; }).listen;

console.log;<WtXmlEndTag />

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

const server = net.createServer { stream.write;

stream.on { stream.write; });

stream.on { stream.end; }); });

server.listen;<WtXmlEndTag />

3. モジュール
--------

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

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

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

3.1. 表明
-------

Node.jsはコアモジュール [2]により表明に対応している。表明違反時には[3]インスタンスがスローされる。 const assert = require.strict;

assert.deepEqual; // Thrown: // AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal: // // 1 !== 2<WtXmlEndTag />

3.2. ECMAScript modules
-----------------------

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

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

4. リリース
-------

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

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

 　 　

5. コミュニティ
---------

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

6. Windows版
-----------

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

7. クライアント1万台問題
--------------

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

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

8. Docker Image
---------------

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

node:: デファクトスタンダード。Docker公式のbuildpack-depsを基に構築
node:alpine: Alpine Linuxベース。イメージサイズを最小化したい際に推奨される
node:slim: Node.js動作に必要最低限のパッケージのみを含む。サイズに制限がない限りデファクトイメージの利用を強く推奨デフォルト以外の設定を利用する手引き「[7]」や [8] が公式から提供されている。

9. 脚注・出典
--------

10. 関連項目
--------

JavaScript
V8
Deno
MEAN 

11. 外部リンク
---------

https://nodejs.org/en/}}
[9]