まるノート

備忘録も兼ねて、様々なお役立ち情報をまとめています。

JavaScript の歴史 ~Node.jsについて~

はじめに

JavaScript の歴史の続きです。 以前以下の記事で CommonJS について触れました。

maru-note.net

本記事ではCommonJSとも大きく関わりがあり、今やWebアプリケーション開発には欠かすことの出来ない技術「Node.js」について触れたいと思います。


Node.js とは

簡潔にいうと、Node.js とはJavaScript実行環境です。


JavaScript に限らずプログラミング言語を動作させるには実行環境が必要です。
例えばC#やC++といったプログラムは、Windowsに .NetFramework が標準的にインストールされているため、特に実行環境を意識しなくてもすることが可能です。


ブラウザでJavaScriptを利用する場合ですと、ブラウザに JavaScript の実行環境が搭載されているため、特に意識せずにJavaScriptを実行できているのです。
例えばChromeであれば、V8 という実行エンジンが搭載されています。


主な用途

Node.js は Chrome と同様、V8実行エンジン上に搭載された実行環境です。

ただしブラウザを用いる場合とでは大きく利用方法が異なり、基本的にサーバーサイドでJavaScriptを実行するための環境で、HTTPサーバーを構成できる API を標準でもっています。
※Node.js とともに、標準的に様々な API を提供するモジュールがインストールされます。

本記事では割愛しますが、簡易的なWebサーバーの作り方などはググればすぐに出てきますし、簡単なのでまずは使ってみるのが良いと思います。

また、Windowsでは「コマンドプロンプト」、Macでは「ターミナル」から対話実行モードで起動することも出来ます。


誕生や CommonJS との関わり

はじめににある通り前記事で紹介していますが、
CommonJS は JavaScript でサーバサイドやコマンドラインツール、GUIツールなど色んなアプリ開発するための標準的なAPIの仕様です。
そして require/export 文によってファイル分割ができるモジュールAPI仕様を有することが大きな特徴でした。


このモジュールのAPI仕様は、Node.js で実装されて広まることで広く知られるようになります。
Node.js は2009年に開発が始められ、2011年初期バージョン 0.1.14 がリリースされており、2023年現在ではバージョン18がリリースされています。

一方、Node.js が生まれた時(2009年)の JavaScript の version は ES5(ECMAScript 5)でした。
JavaScript で import/export 文によるモジュール機能が使えるようになったのはES6からです。

こういった経緯もあり、当初は Node.js は import/export 文によるモジュール機能には対応していないことになります。


主な特徴

クライアントサイドからサーバーサイドまで同じスクリプトが使える。

Webアプリケーションを構築する際、プログラム言語としては JavaScript の知識でサーバサイドの開発が行えます。 実際にWebアプリケーションを構築する場合には、様々なフレームワークを利用することになりますが、ベースになる言語は JavaScript です。


大量のアクセスが発生しても比較的軽快に動作する。

ざっくりというと Node.js は一つのプロセスで複数のリクエストを処理してゆく、という特徴があります。 Node.js は元々大量の同時接続をさばけるネットワークアプリケーションの構築を目的に設計されており「ノンブロッキング I/O」なる方式を採用しているためです。

チャットアプリなどは代表的な用途としてイメージし易いと思います。


一般的には1つのプロセスごとに1つのリクエストが処理されるため、リクエスト数がOSが走らせることができるプロセス数の上限に達すると処理に遅延が発生してしまい、C10K問題と呼ばれる懸念が生じます。

C10K問題 正式には「Client 10K(=1万)問題」と書きます。コンピュータが処理できるプロセス数の上限により、ハードウェアのスペック的には余裕があっても処理が遅くなってしまうこと。


おわりに

JavaScript の歴史というタイトルでしたがほとんど Node.js の内容になってしまいました。
活用方法やフレームワーク、また npm や yarnといったパッケージ管理システム などまだまだ書ききれないことだらけですが、一応 JavaScript の歴史 としての紹介は今回の内容にとどめておきます。

なお、実際にはNode.jsのみだとWebサーバとしては少し機能が物足りないので、その前段に Apache や nginx をリバースプロキシとして置く構成が多いようです。
自分が関わったことがあるシステムでもサーバーサイドは Apache と Node.js の2段構成で、認証関連の処理などは Apache 側が行っていました。