【初心者向け】Node.jsとは?を初心者ながらまとめてみた

# 1.はじめに

最近Node.jsを使って開発を始めました。

ただ、現状「とりあえず触ってみている状態」なので、今回はNode.jsとはそもそもなんたるものかということと特徴について勉強し、自分なりの解釈でアウトプットしてみます。


# 2.Node.jsとは

Node.jsの[公式サイト](https://nodejs.org/ja/about/)によると _*非同期型のイベント駆動の JavaScript 環境*_ と書かれています。
「非同期」と「イベント駆動型」と「JavaScript 環境」を一つずつ噛み砕いていきます。


## 2.1. 非同期型とは

非同期型とは、非同期処理が実行可能な環境であることを指しています。
非同期処理とは、「ある処理を実行している間に別の処理を実行できる方式」のことです。(もちろん同期処理もできます)

言葉だけではイメージが掴みづらいので、以下図示(図2.1.1)してみました。
左側が同期処理、右側が非同期処理のイメージです。
ご覧の通り、同期処理では、処理Bが実行している間は処理Aが停止して、処理Bが終わると処理Aが再開されます。
対して非同期処理では、処理Bが実行されても処理Aは継続するため、処理Aと処理Bは並行して実行し続けます。
処理Aと処理Bが同一サーバ内での処理であった場合、Node.jsはイベントループという仕組みの元、特殊な動きをします。詳細に書いてくださっている[こちらのサイト](https://blog.hiroppy.me/entry/nodejs-event-loop#%E3%82%BF%E3%82%B9%E3%82%AF)がわかりやすかったので、気になる方はご覧ください。

![非同期処理とは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/02ae9b38-0058-a1f2-55ac-0728e370cd46.png)
図2.1.1. 非同期処理とは

非同期処理がどんなところに使われているのか考えてみましょう。
例えば、住所を入力するwebフォームの場合を考えてみます。
郵便番号を入力すると自動で郵便番号から住所を出力してくれる機能をご覧になったことがあるかと思います。この処理も非同期処理が裏でなされています。

非同期処理は処理完了までの時間短縮ができることが便利な反面、処理が終わる順番を約束されません。
そのため、個人的に同期処理との使い分けがとても難しく、かつ意図しない動作を生み出す危険性も兼ね備えているため、重要になるという印象を受けました。


## 2.2.イベント駆動型とは

イベント駆動型とは、何かしらの「イベント」が生じた際に動作する環境のことを指します。
イベントとは以下のようなものです。

- マウスでクリック
- キーボードで入力
- 通信
- センサーの入出力<br>
  etc...

要するに、何かの入力によって動作する環境です。

## 2.3.JavaScript環境とは

Javascript環境という言葉を聞いただけでなんとなく想像はできるかと思いますが、簡潔に言うと「Javascriptが動作する環境」です。<br>
もう少し詳細に言うと、インタプリタ(通訳者)がJavascriptのコードをコンピュータの実行可能なコマンドに変換し、コンピュータがそのコマンドを実行しています。<br>

ちなみにNode.jsが使っているJavascript環境は、Googleの[V8 Javascriptエンジン](https://ja.wikipedia.org/wiki/V8_(JavaScript%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3))を使用しているそうです。<br>
本来このV8 Javascriptエンジンはブラウザで使用されていましたが、Node.jsではブラウザでなくても使用できるようなったため、サーバサイドアプリケーションの開発が可能になりました。

![V8_engine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/d3f3c8ab-792a-9735-1c6d-dcc8a700ee41.png)
図2.3.1.V8エンジンのロゴ

# 3.Node.jsの特徴

次はNode.jsの特徴をみていきます。
Node.jsはシングルスレッドで動作しています。
シングルスレッドでの動作であるにもかかわらず、効率的にタスクの実行管理をするためにイベントループという仕組みが使われています。
イベントループではノンブロッキングI/Oという処理ができるようになっています。

横文字をたくさん並べたので、「シングルスレッド」と「イベントループ」と「ノンブロッキングI/O」のそれぞれの意味を解説してみます。

## 3.1.シングルスレッド

スレッドとは、日本語にすると「糸」や「道筋」なんて意味を持ちます。
つまりシングルスレッドとは、タスクを一つの道筋で処理をしていくことです。

こちらも言葉だけではイメージが掴みづらいので、例え話でイメージしてみます。
今回は、味噌汁を作るタスクでイメージしてみます。

味噌汁を作るためには、以下のタスクがあるとします。

- お湯を沸かす
- 具材の準備(豆腐切る等)
- 具材をお湯に入れて混ぜる

上記タスクの場合、以下の図3.1.1.のように「お湯を沸かす処理」と「具材を準備」を一つずつ実行するパターンと、並行処理するパターンの二つの進め方ができます。<br>
一つずつ処理していくパターンがシングルスレッドです。

![シングルスレッド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329544/5446cfcd-99b8-a5fc-8db7-a331084e2b2b.png)
図3.1.1. シングルスレッドとマルチスレッド違い

## 3.2.イベントループ

イベントループとはNode.jsがシングルスレッドで動作していても効率的に処理を進めるための仕組みのことです。
イメージとしては、プロジェクトマネージャーのような役割をしています。
タスク管理やメンバーへのタスク割り当て、打ち合わせの調整など、各タスクを進めるために様々な調整ごとをしてくれます。(ざっくりとしたイメージのため、詳細は異なります。)

こちらの詳細を話出すと、あまり直感的に理解できる内容ではない、かつあまり意識しなくてもプログラミングができるので、今回は割愛します。
私自身も正しく理解ができている自信がないので、引き続き勉強していこうと思います。
以下参考になるサイトのURLを貼っておきます。

- Node.js公式ドキュメント<br>
https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
- Node.jsでのイベントループの仕組みとタイマーについて<br>
https://blog.hiroppy.me/entry/nodejs-event-loop

## 3.3.ノンブロッキングI/O

I/Oとは、input/outputの略であり、入出力のことを指しています。
コンピュータの処理はinputした情報を元に計算等の処理をし、何かしらoutputします。
ブロッキングI/Oでは、このinputからoutputまでの処理を待ってから出力します。
ノンブロッキングI/Oでは、inputした情報からoutputの処理を待たずに、呼び出しに反応があります。
outputまでの処理を待たずして、別の処理を実行することができるという処理です。
イメージとしては、非同期処理の一種として捉えられます。

[公式ドキュメント](https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/#comparing-code)のコードを追っていくとわかりやすいので、詳細を知りたい方は是非ご覧ください。

この特徴があるので、Node.jsは大量のリクエストに強くなります。

# 4.まとめ

「とりあえず触ってみている状態」だったNode.jsについて学んだことをまとめました。
こうやってアウトプットしてみると、まだまだ正しい理解ができていない部分が多いと分かるので、勉強意欲がさらに出てきます。
引き続き実際にNode.jsに触りながら学んでいきたいと思っています。

まだまだNode初心者なため、認識が違うところがあるかもしれません。
認識齟齬あれば是非コメントください。

# 参考資料
- node.js公式ドキュメント<br>
https://nodejs.org/ja/
- 書籍 入門Node.jsプログラミング<br>
https://www.amazon.co.jp/dp/4798158623
- Node.jsでのイベントループの仕組みとタイマーについて<br>
https://blog.hiroppy.me/entry/nodejs-event-loop
- 【LT資料】Node.jsとは？<br>
https://qiita.com/naoya_matsuda/items/609ed2c643b0e1f19900