📘

【React】そもそもNode.jsとは何なのか、なぜ使うのか

2023/08/19に公開

はじめに

Reactの環境構築を勉強していると必ずと言っていいほど目にするNode.js。Reactのへの理解を深めるため、学習したことをアウトプットがてら記事にします。

Node.jsはJavaScriptをサーバー上で動かすために必要

まずはJavaScriptについて

JavaScriptとは、動きのあるWebページを作成する際によく使われるプログラミング言語です。JavaScriptを使うことにより、Webページ上でスライドショーなどを実装することができます。ただし、JavaScriptは本来ブラウザ上でしか動かず、サーバー上で動作させることはできません。

Node.jsとは

Node.jsとは、JavaScriptをRubyやPythonと同じように、サーバー上で動作するプログラミング言語として実行可能な環境を提供するソフトウェア。これにより、ターミナル上でJavaScriptを実行できるようになります。

Node.jsはGoogleが開発したJavaScriptエンジン「Chrome V8」上に構築されているため、ブラウザ内またはブラウザ外でJavaScriptコードが実行できます。 このエンジンがJavaScriptコードをCPUが理解できる言語に変換するので、RubyやPythonみたいにサーバサイド言語として使えるようなります。

また、Node.jsの拡張子「.js」はに実行環境の名前がJavaScriptであることを示すためのものであり、Node.js自体がJavaScriptファイルであるという意味ではありません。

Node.jsを使うメリットって?

Node.jsの正体はわかりましたが、Node.jsを使用するメリットと何でしょうか。
それについては以下の理由があります。

大量のデータ処理が可能

「ノンブロッキングI/O」方式を採用し、大量アクセスに強く、処理を待たずに次の処理を始めることができるので大量のデータ処理が可能です。Node.jsは一度に多数のアクセスを受け付けるチケット予約サイトや、タイムラグが許されないライブチャットなどの開発によく使われます。

【ノンブロッキングI/O方式】
通常、コンピューターは現在の処理が完了するのを待ってから次の処理に移ります。この場合、前の処理が終わるまで次の処理に移れないので、大量なアクセスが生じると処理しきれなくなるのです。ノンブロッキングI/O方式では、前の処理が完了しない状態でも次の処理を開始できます。そのため大量のアクセスも処理できるわけです。

「C10K問題」を解決することが可能

C10K問題は正式には「Client 10K(=1万)問題」といいます。
C10K問題とはサーバー同時接続数が一定数超えると、ハードウェアのスペック的には余裕があっても処理が遅くなってしまうことです。

C10K問題の原因はいくつかありますが、その1つがプロセス数の上限です。一般的には1つのプロセスごとに1つの処理が行われ、プロセス数が上限に達すると処理に遅延が発生してしまいます。

一方Node.jsではノンブロッキングI/O方式の採用により、1つのプロセスで複数の処理を実行可能です。Node.jsならプロセス上限をはじめとした、C10K問題の原因は避けられます。そのためNode.jsを採用し適切な設定を行うことで、C10K問題を解決できるわけです。

クライアントサイドとサーバーサイドで共通してJavaScriptが使えるため、開発が効率的

ブラウザ上で動作するJavaScriptをサーバーサイドの開発でも使用できれば、開発が効率的ですね。使い慣れた言語を活用でき、その上新たに言語を学習するコストを軽減できるわけですから。
(ただしNode.js独自のルールがありますので、クライアントサイドのJavaScriptと全く同じというわけにはいきません。。。)

フロントエンド開発にNode.jsって必要なの?

なぜバックエンド開発のために開発されたNode.jsがReactアプリ(フロントエンド)開発で必要になってきたのでしょうか。Node.jsには「npm」というパッケージを管理するシステムがありますが、それがパッケージのインストールと整合性の管理の問題を解決してくれるからです。
(npm = Node Package Manager)

そもそもパッケージをダウンロードして直接利用すればいいのでは?と考えるかもしれませんが、以下のような問題が発生するため、npmでの管理が必要となってきます。

-- パッケージの依存
パッケージAを使用するためにパッケージBが必要な場合、「パッケージAはパッケージBに依存している」という関係にあります。したがって、あるパッケージをインストールする際、その依存関係にあるパッケージをインストールし、さらにその依存関係にあるパッケージを……と複雑になります。

-- パッケージの競合
パッケージXによって使用しているパッケージYが、これからインストールするパッケージZでも必要な場合、

・パッケージX使用のためのパッケージY
・パッケージZ使用のためのパッケージY

という具合にパッケージYが衝突してしまいます。これをパッケージの競合関係といい、あるパッケージをインストールする際、競合するパッケージやモジュールがないかを調べなくてはいけません。

インストールするパッケージが1つや2つならともかく、開発規模が大きくなるほどそうはいかないので、npmが必要だということですね。

おわりに

Reactの環境構築に必要なNode.jsについてのスポットを当ててみました。
プロジェクト作成についてはまたいずれまとめてみたいと思います!

それでは。

Discussion