Node.jsについて調べてみた

「JavaScript」の勉強をしているとターミナルにNode.jsに関して入力することがあったりしましたがそもそも「Nodeってなに？」と思ったので調べてみました。

その前に、JavaScriptとNodeについても簡単におさらいしてみます。


<h2>JavaScriptとは</h2>
元々はブラウザやHTMLページを操作するためのプログラミング言語として1995年に誕生。
当初はブラウザ間の互換性が低くて普及しませんでしたが、「Ajax」という機能が発明されてから人気が高まった。

```Ajax``` とはJavaScriptとサーバーの通信を非同期に行い、動的なデータを一部だけ書き換える方法のことですが、詳しくは下記参考
参考①:( http://pikawaka.com/word/ajax ) 

現在は殆どのサイトでJavaScriptは採用されており、画像を切り替えたり動かしたりする時にJavaScriptは書かれている。

特に重要な役割を端的に書くと下記3点になる。
```・ブラウザで表示されているHTMLやCSSを書き換える。```
```・ブラウザに表示されているHTMLやCSSを情報から読み取る。```
```・ブラウザに表示されているHTMLやCSSをリアルタイムに書き換えることができる。```

サーバーサイドの言語のRubyやPHPなどは「```パソコン上で動作する```」のに対し、
JavaScriptは「```ブラウザ上で動作する```」のが特徴。


<h2>Nodeとは</h2>

Nodeとは、```「点と線で構成図を書いたの線の部分のこと」```

複数の要素が結びついた構造体において、個々の要素のことをノードという。
ノードを結びつける線や繋がりは「エッジ」あるいは「リンク」という。

例えば ```[サーバ]ー[ルータ]ー[サーバ]```などの構成のネットワークを点と線のみで結ぶと
```●ー●ー●```の点の部分（パソコン、ルータ、サーバ）が「ノード」と呼ばれる。

参考②:( https://e-words.jp/w/%E3%83%8E%E3%83%BC%E3%83%89.html )
参考③:( https://wa3.i-3-i.info/word1300.html ）




<h2>DOMとDOM操作している時に出てくるNodeについて</h2>

JavaScriptの登場初期はブラウザごとに制御方法が違っていたので、ブラウザごとにJavaScriptのコードを用意する必要があったが、制御方法を統一するためにDOM（Document Object Model）という仕様が生まれた。
DOMに対応しているブラウザで閲覧すれば同じ動作が期待できる。


DOM（Document Object Model）はプログラムから「HTML文書」や「XML文書」を利用するための標準化された仕様。

HTML文書は「タグ」「属性」「値」「文書」などの部品で構成されており、HTML文章がブラウザに読み込まれるとJavaScript内でこれらの部品1つ1つが「DOM オブジェクト」として自動的に生成される。

参考④（https://hakuhin.jp/js/dom.html#DOM_00 ）



```「DOM オブジェクト」であれば、共通して利用できる基本的な機能として、Nodeというインターフェースが定められている。```「Node インターフェース」を使うと木構造（ツリー構造）の親子関係を構築することができる。

```インターフェース``` とは「何かと何かがくっついている部分のこと。コンピュータの世界では接点、接続口、境界面」などがイメージできるところで使用されている広い意味で利用される用語。参考⑤( https://wa3.i-3-i.info/word11374.html )





・ノードの種類について上記参考サイトから転載させていただきます。
 図の方がわかりやすいので
![スクリーンショット 2021-03-22 14.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693783/a80839c2-e1e2-1de1-e0c9-5074b931ad79.png)




<h2>Node.jsとは？</h2>

こちらに関しては参考⑥（ http://www.tohoho-web.com/ex/nodejs.html ）に記載されててる内容を基にわからない単語を順次補足する形で下記にメモを取っています。
(下記の画像表示内容を補足する形で記載)
![スクリーンショット 2021-03-22 17.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693783/5b742511-d579-fc68-58e9-7a7e3c6bb986.png)

<b>[内容まとめ]</b>
・Node.jsは```サーバサイドでJavaScriptを実行できるためのプラットフォーム```。
・npm(Node Package Manager)と呼ばれるパッケージ管理ツールを同梱。
・ノンブロッキングI/O と イベントループ アーキテクチャにより、10K問題 (クライアント1万台レベルになると性能が極端に悪化する問題) に対応。


```ノンブロッキングI/O```：処理を行っている最中も並行して他の処理はできるだけ進む。I/Oは出入力を意味する。(Input / Output)。参考⑦( https://wa3.i-3-i.info/word1621.html)
```イベントループ```:何かが起きた時に処理の順番を決めて進めること。参考⑧( https://rightcode.co.jp/blog/information-technology/node-js-event-loop-overview ) 
```アーキテクチャ```：IT業界では「システムに求められることを効率よく行っていくために必要な機能や相互データの更新を定める枠組み」を指す。

・通信やファイルの読み書きをノンブロッキングI/Oで処理するため、スレッドが I/O 待ちになる頻度が少なく、効率的。

```スレッド```：「処理の流れ」。マルチスレッドは「同時実行されているその処理」を意味する。似た言葉で「マルチプロセス」があり、それらは「複数の処理を同時に実行する」といったものだが、データ管理の点で意味が異なる。マルチプロセスでは、各プロセスにおいて、データは独立している。マルチスレッドでは、各スレッドにおいて一部を除きデータを共有している。参考⑨（ http://www.itsenka.com/contents/development/java/topics/thread1.html ）

・クライアントからパケットを読み込む、ファイルの次のブロックを読み出すなどすべてがイベント処理で実装されている。

```パケット``` ：「データを通信する上で細かく分割されたデータ」
参考⑩( https://wa3.i-3-i.info/word176.html )

・基本的にはシングルスレッドだが、内部では暗号化などの重い処理を複数スレッドで処理。
・基本的にはシングルプロセスだが、JavaScript から fork() を呼び出すことで、マルチプロセスも可能。

```fork()```：元となるプロセス（親プロセス）を複製し PID (プロセス ID)と PPID (親プロセス ID) が 異なるプロセス（子プロセス）を生成すること。
参考11( https://www.gadgety.net/shin/tips/unix/ipc/fork.html )

```プロセス``` :メモリを使って実行されているプログラムの1つ。≒実行中のプログラム。プロセスは処理の過程で別のプロセスを作る場合がある。
参考１2（ https://wa3.i-3-i.info/word11033.html ）


```メモリ``` ：PCで処理に必要なデータを一時保管しておくパーツのこと。
参考１3( https://pikawaka.com/word/memory )

・ライセンスはMITライセンス。商用利用可能。

```MITラインセンス``` ：オープンソースライセンス(ソースコードが無償で公開され、複製・改良・再配布が誰でも自由にできるもの)の1つで利用許諾のための条件などを定めているもの。
参考１4（ https://yamory.io/blog/about-mit-License/ ）

・Node.js 上のフレームワークとして、Express, Meteor, Sails, Koa, LoobBack などがある。
・MEAN(MongoDB＋Express＋AngularJS＋Node.js)と呼ばれる構成で利用されることも多い。
・HTTP 通信のみでなく、TCP や UDP 通信も可能。

```HTTP``` ：HTML文書などのを取り出すことを可能にするプロトコル。
```プロトコル``` ：コンピューター同士の通信をする際の手順や規格のこと。情報を送り出す端末の選定、データの形式、パケットの構成、エラーの対処などを取り決めた通信の約束事。
参考１5（ https://www.otsuka-shokai.co.jp/words/protocol.html ）

```TCP``` :（Transmission Control Protocol）の略。安全性重視で通信するための通信方法。「送ったデータが相手に届いたか、その都度確認しながら通信するやり方」
参考１6（ https://wa3.i-3-i.info/word19.html ）
参考１7（ https://www.infraexpert.com/study/tcpip.html ）

```UDP``` ：（User Datagram Protocol）転送速度は早いが、送ったデータが相手に届いたか確認しないで行う通信方法。音楽や映像などのリアルタイム性のあるデータを転送する場合、複数の相手に同じデータを同時に転送する場合、信頼性の必要がなく、少量のデータを転送したい場合などに利用される。
参考18（ https://www.infraexpert.com/study/tcpip12.html ）

・WebSockerサーバとして利用されることも多い。
```WebSocket``` :リアルタイムWeb技術の一種であり、リアルタイムかつ双方向な通信を実現するプロトコル。
参考19（ https://www.atmarkit.co.jp/ait/articles/1603/14/news015.html　）

・比較的小規模で、高パフォーマンスを要求されるプロジェクトでの利用が多い。
・AWS Lambda, PayPal, Walmart, Uber など大量アクセス領域で利用されている。





<h2>参考にしたサイト</h2>
参考1(http://pikawaka.com/word/ajax) 
参考2( https://e-words.jp/w/%E3%83%8E%E3%83%BC%E3%83%89.html )
参考3（ https://wa3.i-3-i.info/word1300.html ）
参考4（ https://hakuhin.jp/js/dom.html#DOM_00 ）
参考5( https://wa3.i-3-i.info/word11374.html )
参考6（ http://www.tohoho-web.com/ex/nodejs.html ）
参考7( https://wa3.i-3-i.info/word1621.html)
参考8( https://rightcode.co.jp/blog/information-technology/node-js-event-loop-overview ) 
参考9（ http://www.itsenka.com/contents/development/java/topics/thread1.html ）
参考10( https://wa3.i-3-i.info/word176.html )
参考11( https://www.gadgety.net/shin/tips/unix/ipc/fork.html )
参考12（ https://wa3.i-3-i.info/word11033.html ）
参考13( https://pikawaka.com/word/memory )
参考14（ https://yamory.io/blog/about-mit-License/ ）
参考15（ https://www.otsuka-shokai.co.jp/words/protocol.html ）
参考16（ https://wa3.i-3-i.info/word19.html ）
参考17（ https://www.infraexpert.com/study/tcpip.html ）
参考18（ https://www.infraexpert.com/study/tcpip12.html ）
参考19（　https://www.atmarkit.co.jp/ait/articles/1603/14/news015.html　）

Qiita記事だとこちらもすごく纏まっておりました
参考20（ https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb ）