Node.jsの構造や仕組みは?【普及した理由】

Node.jsの構造・仕組み

Node.jsは、GoogleがChromeのために開発したV8エンジンを利用した、JavaScriptの実行環境です。

それまでのJavaScriptの実行環境はインタプリンタで実行し、中間コードに変換しコンパイルするものでした。
しかしV8エンジンはいきなりJavaScriptを直接マシン語にコンパイルし、プログラムを実行することで、高速な実行を可能にしました。

関連記事
【JavaScript】Web技術の歴史【ブラウザ】

Node.jsのアーキテクチャ

具体的なアーキテクチャは以下のようになります。

Nodeコアライブラリ(JavaScript)

Node コアライブラリは、Node.jsのbuild-inモジュールです。
ここに含まれるモジュールは、インストールすることなく使用することができます。

Node.jsバインディング(C++)

C/C++モジュールのラッパーで、require関数を通じてNode.jsにロードでき、通常のNode.jsモジュールのように使用できます。
Node.jsで実行されるJavaScriptとC/C++ライブラリ間でのインターフェースを提供するために使用されます。

V8エンジン(C++)

GoogleがChromeのために開発したJavaScriptの実行エンジンです。

非同期I/O(C言語)

マルチプラットフォームのCライブラリで、イベントループによる非同期処理を提供します。
主にNode.jsで使用するために開発されましたが、Julia、Luvit、pyuvなどの他のツールでも使用されています。
このライブラリはファイルシステムやDNS、ネットワーク、子プロセス、パイプライン、信号処理、ポーリング、ストリーミングなどに対応しています。
これらはNode.jsバインディングを通じて呼び出されます。

Node.jsが普及した理由

サーバサイド・フロントエンドでどちらも同じ言語を使える

Webサービスを作るとき、サーバサイドとフロントエンドを作成する必要があります。

サーバサイドはPHPやRubyなど様々な言語を使えます。
一方で、フロントエンドはJavaScriptしか使用することができません。
これはWebブラウザがJavaScriptにしか対応していないからです。

サーバサイドでJavaScriptを使えるようになると、どちらも同じ言語を使用することができるようになります。
同じ言語が使えれば、フロントエンド・サーバサイドで同じ処理を使いまわすことができるようになります。
サービスで共通するビジネスロジックなどを使い回せれば、2重で同じ処理を書かれて、意図せぬ差異が生まれる恐れもなくなります。

またJavaScriptが書けるエンジニアだけ採用すれば良いのも、利点の1つと言えるでしょう。

標準APIの多くが非同期処理で行われる

Node.jsの提供する標準APIの多くは、非同期処理で行われます。
そのためファイルの入出力などの実行待ちに時間を取られることがなくなり、同時に大量のアクセスをさばくことができます

Apacheだとこれをマルチスレッドで解決します。
しかしアクセスするクライアントが増えるとサーバのスレッドが増えすぎてしまい、リソースが不足する問題が発生してしまいます。
これはいわゆるC10K問題と呼ばれるものです。

一方Node.jsはシングルスレッドなので、メモリ効率よく同時アクセスをさばくことができるのです。
awaitなどで同期処理に変換することもできるため、書き方次第ではこのメリットが握りつぶされてしまうこともあります。

ライブラリが豊富

Node.jsは、npmと呼ばれるパッケージツールでライブラリを管理します。

JavaScriptは世界で一番使われている言語なため、ライブラリが豊富です。
公開されているnpmモジュールを組み合わせることで様々な機能を簡単に実現することができます。

関連記事
【JavaScript】Web技術の歴史【ブラウザ】

@dorarep
小学生の頃からフリーゲーム作ってました。今はフリーランスでフルスタックエンジニアしてます。