Node.jsを学ぶ中で必ず押さえておきたいこと

## 1. はじめに

最近はC#でのWindowsツール開発ばっかりだったので、Webについてももっと勉強したいと思い、Node.jsについてまとめることにしました。
![node-js-736399_640.png](https://qiita-image-store.s3.amazonaws.com/0/247638/8a27d0f0-2858-ccea-f3e0-965e759e946e.png)

## 2. Node.jsとは

一言で言うと**サーバサイドJavaScript**になります。
もうちょっと言うと**サーバサイドでJavaScriptを実行できるようにしてくれるプラットフォーム**になります。
言語自身がWebサーバの役割を持っているため、ApacheなどのWebサーバを必要としません。

<font color="red">[2018/07/21 追記]
セキュリティ面を考慮した場合等があるため、「Apacheが一切不要」というわけではないです。
コメントにて@inductor 様よりご指摘を頂きました。</font>

## 3. Node.jsの特徴

### 3-1. JavaScriptだけで書ける

クライアント側とサーバ側、同じ**JavaScript**だけでコードを書くことができます。
単純な話なんですが、でかいですよね。
JacaScriptに慣れ親しんだフロントエンドエンジニアの方もサーバ側へ入りやすいかと思います。

### 3-2. パッケージが豊富

Node.jsにはたくさんの便利パッケージが存在します。
以下の記事がとても参考になるかと思います。
[良く使うnpmパッケージの紹介](https://qiita.com/kjirou/items/f8b8f0950b15480485bb)
<font color="red">※npmについては「[5. npm(Node Package Manager)とは](https://qiita.com/i-tanaka730/items/79e8e2c3ceb2bde51436#5-npmnode-package-manager%E3%81%A8%E3%81%AF)」で触れています。</font>

### 3-3. 大量のリクエストを処理することができる

このメリットを理解する前に、まず**スレッドモデル**と**イベントループ**について触れてみましょう。

#### スレッドモデル
**Apache**で採用されている仕組みです。
複数のリクエストがとんでくると、その分スレッドを立ち上げることになります。
つまり、**スレッド立ち上げた分メモリを消費する**ことになります。
メモリには上限があるので、たくさんのリクエストがとんでくると待ち状態になってしまいます。
スマホが普及した今、大きいサービスだとスレッドモデルで対応するのは難しくなっています。
![スレッドモデル.PNG](https://qiita-image-store.s3.amazonaws.com/0/247638/772e5340-ad48-773f-b7eb-c8ff119b5351.png)

<font color="red">[2018/07/20 追記]
必ずしも「Apache=スレッドモデル」となるわけではないようです。
コメントにて@c-yan 様よりご指摘を頂きました。</font>

#### イベントループ
**Node.js**で採用されている仕組みです。
Node.jsのメインスレッドにて、**イベントループ**と言われるものがくるくる回っています。
複数のリクエストがとんでくると、まずはメインスレッドのキューに次々と登録されます。
イベントループの際にキューにリクエストが登録されているのを見つけたら、順番にバックグラウンドの処理に回します。
この方式だと、**新しくスレッドを立ち上げずにリクエストを処理する**ことができます。
しかし、イベントループでは「イベントが終わったら次のイベント」というように処理が行われるので、重い処理が入ってきた場合等、イベントが止まってしまいます。
これを解決するのが次で触れる**ノンブロッキングI/O**です。

#### ノンブロッキングI/O
前の処理結果を待たずに他の処理を進めることができる仕組みです。
つまり、非同期にどんどんリクエストを受け付けていきます。
処理結果の受け取りは、コールバックを使って実現します。
その結果、Node.jsではApache等に比べ、**大量のリクエストを処理することが可能**です。
このことから、「LINE」「Twitter」「Instagram」等でもNode.jsが採用されているみたいです。
![イベントループ.PNG](https://qiita-image-store.s3.amazonaws.com/0/247638/713fb85e-01dc-8b02-ebf3-af5574da4511.png)

- ノンブロッキングな書き方例

```javascript

setTimeout(() => {
    console.log("Hello");
}, 1000);
console.log("World");

// -- 実行結果 --
// World
// Hello
```
Helloの出力を待たずにWorldが出力されます。

## 4. Node.jsの環境構築

環境構築はとても簡単で、以下の手順で行います。

1. [Node.js公式サイト](https://nodejs.org/ja/)にアクセスする。

2. Node.jsのインストーラーをダウンロードする。

3. インストーラーを実行し、インストール。

4. コマンドプロンプトを起動し、「node -v」。

5. node.jsのバージョンが表示されればOK。


## 5. npm(Node Package Manager)とは

Node.jsには便利なパッケージがたくさんあって、そのパッケージを管理するツールが**npm**になります。
**npm**はNode.jsをインストールすることで自動的にインストールされます。
コマンドプロンプト等で、以下のようにコマンドを叩いて使用します。

- npmのバージョンを確認

```
npm -v
```

- npm自体のバージョンを更新

```
npm install -g npm
```

- パッケージをインストール

```
npm install <パッケージ名>
```

- パッケージをアンインストール

```
npm remove <パッケージ名>
```

- パッケージのアップデート

```
npm update
```

- インストール済みパッケージの確認

```
npm ls
```


<font color="red">[2018/07/25 追記]
最近では、npmよりもYarnの方が高性能のためおすすめのようです。
◆参考記事</font>
[そろそろYarnを使ってもいいんじゃない？](https://aloerina01.github.io/blog/2017-02-13-1)
[npmから乗り換えてわかったYarnの4つのメリット](https://qiita.com/tonkotsuboy_com/items/0242928ab32794d11f76)
<font color="red">コメントにて@tomohisaota 様より情報を頂きました。</font>

## 6. IDE

Node.jsを使うにあたり、最も使われているIDEは**Visual Studio Code**になります。(2018.7時点)
環境構築やデバッグも簡単に行え、無料で使えるため人気のようです。迷ったら**Visual Studio Code**でよいかと思います。まぁこの辺は好みになりますね。

- Visual Studio Code使用イメージ
![HelloWorld.PNG](https://qiita-image-store.s3.amazonaws.com/0/247638/86fa3b58-fc7a-b302-67b1-4a48437a739d.png)


## 7. おわりに

やっぱり実際にモノを作ってみるのが一番の勉強になるので、
Node.js + Visual Studio Codeでチャットアプリあたりを作ってみたいと思います。
次回はReact、Vue.jsにも触れていきたいと思います。