【Node.js】Node.jsとは?概要と特徴、環境構築、Hellow World表示まで
目次
今回から、サーバサイドJavaScriptであるNodeの学習内容を備忘録としてまとめていきたいと思います。
Node.jsはサーバーサイドで動くJavaScriptとして、幅広く使われています。
今回は、概要から、環境構築、そして、実際にnodeを実行して、Hellow Worldを表示させるところまでまとめてみようと思います。
それではいきましょう。
Node.jsについて
Node.jsとは?
JavaScriptは主にブラウザ上で動かすことができるプログラミング言語です。
基本的にブラウザなどのクライアント側で動かす言語ですが、このJavaScriptをサーバー側で動かせるようになったのがNode.jsです。
要するに今まで、JavaScriptで出来なかったサーバー側の処理を書くことができる革新的なものなわけです。
このNode.jsは具体的には大量のリクエストを高速に捌くアプリケーションを作るためのプラットフォームであり、APIやメッセージングなどで使われることが多いです。
以下、Node.jsの公式サイトです。
https://nodejs.org/ja/
スレッドモデルとイベントループ
サーバー側でリクエストを処理する方法として、以前はスレッドモデルという処理形式がよく使われていました。このスレッドモデルは主にApacheなどで使われている処理形式です。
近年のスマートフォンの普及によって、大量のリクエストを処理しなければならない状況が出てきました。
大量のリクエストを処理するのにこのスレッドモデルはあまり向きません。
このスレッドモデルの仕組みとしては、リクエストが飛んできた時に、そのリクエストを処理する部屋のようなものとして、スレッドというものを立ち上げます。
このスレッドは基本的に1つのリクエストに対して、1つのスレッドで対応します。
ですので、リクエストが飛んでくるたびに、スレッドを立ち上げなければならないので、大量のリクエストが飛んできた際に、リクエストの待ち状態ができてしまうため、結果的に処理が遅くなってしまします。
それに対して、近年ではイベントループという処理形式がよく使われています。
これはNode.jsで使われている処理形式です。
大量のリクエスト処理には向かないスレッドモデルに対して、このイベントループは大量のリクエスト処理に向いています。
仕組みとしては、スレッドモデルがリクエスト1つに対して、1つのスレッドを立ち上げるのに対し、イベントループはメインスレッドと呼ばれる大きなスレッド1つが用意されており(シングルスレッド形式)、その裏にバックグランドで動くスレッドが用意されています。
リクエストが飛んでくると、とりあえずこのメインスレッドの中に入ります。
その後で、順番にバックグラウンドのスレッドに回されて処理されます。
そして、処理し始めた順番ではなく、処理が終わったリクエストから、スレッドを抜けていきます。
そのため、リクエストの待ち状態が発生しないです。
このようにNode.jsはイベントループで動くため、大量のリクエスト処理に向いているのです。
Node.jsの環境構築とNodeの実行
環境構築
環境構築といっても、Node.jsを使えるようにするために、Nodeをインストールするだけです。
下記、公式サイトから、環境にあったものをインストールしてください。
インストールかこちらから
https://nodejs.org/ja/
※現在の最新バージョンはv16.5.0です。推奨バージョンはv14.17.3のようです。
インストールが完了したら、コマンドライン上で、下記コマンドを実行してください。
node -v
これでインストールしたnodeのバージョンが表示されます。
無事表示されたら、インストール完了です。
実行できなかったら、Pathを通す必要があるので、適宜対応してください。
Nodeの実行とHellow World表示
Nodeを実行する方法は主に二つあります。
一つ目は、コマンドライン上で実行するインタラクティブな環境で試す方法です。
コマンドラインを立ち上げていただいて、まず、下記コマンドを実行してください。
node
「node」を実行すると、下記のようにインタラクティブにプログラムを入力できるようになります。
試しに、下記のようにHello Worldを出力してみてください。
console.log("Hello World");
そうすると、「Hello World」が表示されます。
二つ目は、ファイルを作って実行させる方法です。
試しに、ローカル上の好きなところに「node-test」というフォルダを作成してみてください。
その中にhello.jsというファイルを作成してください。
そして、そのファイルの中に同じように
console.log("Hello World");
と記述して、保存してください。
コマンドラインを開きcdコマンドで「node-test」フォルダまで移動します。
ここで下記のコマンドを実行してみてください。
node hello.js
こうすると、hello.js内に記述されたプログラムが実行されて、コマンドライン上に「Hello World」が表示されるはずです。
ノンブロッキングな書き方について
Node.jsでは、APIなどのプログラムを書くこと多いですが、その際、リクエストをPOSTしたり、レスポンスをGETしたりするかと思います。
このように通信している間はどうしても時間がかかってしまうことがあり、そこでプログラムがストップしてしまう場合があります。そうなるとどうしても、動作の遅いシステムになってしまいます。
こうならないためにNode.jsではノンブロッキングな書き方が推奨されています。
ノンブロッキングとはその名の通り、ブロックされない、つまり通信が発生した際に動作がストップ(ブロック)されないように処理されることです。
要するにこれは非同期処理的な書き方のことです。
非同期処理については以前のAjax通信の記事で少し触れていますので、ご参考ください。
https://www.dailyupblog.com/web_development/782/#chapter-2
Nodeではノンブロッキングの書き方として、コールバック関数をよく用います。
コールバック関数とは、関数の引数に関数を渡すことで非同期処理を実現する書き方です。
詳しくは下記記事をご参考ください。
https://sbfl.net/blog/2019/02/08/javascript-callback-func/
例を紹介します。
先程のhello.jsを開いてください。
例えば、1秒後に「Hello」を表示して、その後に「World」出力するプログラムがあったとします。
まずノンブロッキングではない書き方で書いてみます。
hello.jsに下記を記述してください。
var start = new Date().getTime();
while (new Date().getTime() < start + 1000);
console.log("Hello");
console.log("World");
このプログラムを実行すると、1秒後に「Hello」と「World」が表示されると思います。
無理矢理、whileを使って1秒のラグを発生させていますが、こうすると、確実に1秒間システムが止まってしまうのがわかります。
これに対し、ノンブロッキングな書き方としては、先述の通り、コールバック関数で非同期処理的に書きます。
下記のようにhello.jsに記述して、プログラムを実行してみてください。
setTimeout(function () {
console.log("Hello");
}, 1000);
console.log("World");
setTimeoutで1秒後に「Hello」が表示されるように書きました。
その後に「World」が表示されるように書きましたが、これを実行すると、先に「World」が表示されて1秒後に「Hello」が表示されたと思います。
このように、ノンブロッキングな書き方では、時間がかかる処理が発生した際に、それ以降の処理を実行させることで処理がストップすることを避けることができます。
API通信をよく行うNode.jsにおいて、プログラムを遅延させないためにもこのノンブロッキングな書き方がとても重要になるわけです。
まとめ
いかがだったでしょうか。
今回から、Node.jsに関する記事を書いていこうと思います。
Node.jsはAPI部分など、アプリケーション開発などでは欠かせない、サーバープログラムを書くことができるので、ぜひとも理解を深めて、扱えるようになりたいです。
次回はNodeでサーバーを起動する方法などをご紹介していきたいと思います。
それでは今回はここまで。
お疲れ様でした!