アプリエンジニアがNode.jsに入門してみる(概念理解、導入、HelloWorldまで)

## 背景と目的
エラー監視にNode.jsが使用されていたからです。私の所属するチームではアプリで発生したエラーをslackに通知する形でエラー監視を行なっているんですが、その実現にNode.jsを使用していました。今後通知するエラーの条件変更などを行う際にNode.jsとサーバサイドの知識が必要になるので、Node.jsの基本的な使い方と導入方法について理解しようと思いました。
じゃあ早速中身に入っていきましょう！！

## 1.Node.jsとは？

[Node.js公式サイト](https://Nodejs.org/ja/)
公式では以下のように説明されています。

> Node.js® は、Chrome の V8 JavaScript エンジン で動作する JavaScript 環境です。

**わけがわかりませんでした。**
Node.jsとは何かを理解するより先に、Node.jsで何ができるのかを調べてみます。
こちらのサイトが分かりやすかったです。
[フロントエンドエンジニアにおけるNode.jsのススメ](https://ameblo.jp/ca-1pixel/entry-11476850674.html)

### 1-1.Node.jsでできること
一言で言えば**サーバサイドプログラムの作成**でした。
サーバサイドとはサーバーの内部で動く処理のことで、フロントからの指示を受けてDB依存の処理やフロントで行うのに適していない複雑な処理を行うプログラムのことを指します。JavaScriptはフロントエンドの言語として長く使用されてきましたが、これをサーバサイドでも使用できるようにした実行環境がNode.jsであるとわかりました。

### 1-2.つまりNode.jsって何？
一言で言うと**JavaScriptを使用したサーバーサイド実行環境である。**
ということが分かりました。

### 1-3.Node.jsの特徴
Node.jsは以下の特徴を持っています。

* サーバサイドとフロントエンドを同じ言語で書ける。
    * つまりフロントエンドができる人であれば学習コストが低め。
    * つまりフロントとサーバサイドで同じ言語やライブラリが使えるため、開発効率が上がる。
* 非同期処理を簡単に書ける
    * 一つのスレッドで大量の接続を処理できる。

こちらの記事から引用して挙げています。
https://paiza.hatenablog.com/entry/2018/06/08/paizacloud_nodejs
https://ameblo.jp/ca-1pixel/entry-11476850674.html

## 2.Node.jsの導入方法
最新版をインストールする場合は公式サイトのトップページからインストーラを取ってきて開くだけです。
[Node.js公式サイト](https://nodejs.org/ja/)

しかしその方法ではDL時のバージョン以外の利用することができませんし、今後特的のバージョンによって動作しない機能があった時バージョンを切り替える必要が出てくるので、**nvm(node version manager)**を使います。

### 2-1.nvmとは
Node.jsのバージョン管理ツールです。
nvを使用することでNode.jsを指定したバージョンに切り替えることができます。
[nvm公式Githubレポジトリ](https://github.com/nvm-sh/nvm)

<補足>
Node.jsのバージョン管理ツールとして`nodebrew`も挙げられますが、2019年10月現在ではnvmを使用しているのが主流みたいです。
参考:[nvm(Node Version Manager)を使ってNode.jsをインストールする手順
](https://qiita.com/ffggss/items/94f1c4c5d311db2ec71a)

### 2-2.nvmの導入
nvmをインストールする方法は三つあります。
* 手動インストール
* Gitによるインストール
* Homeblewによるインストール

参考にしたサイトではほとんどがGitによるインスールを推奨していました。
理由はnvmのバージョン管理自体がGitだと楽になるからだそうです。
と言うわけでGitでnvmをインストールしてみます。

#### Gitによるnvmのインストール手順
ユーザープロファイルのルートにnvmのリポジトリを複製します。

```sh
$ git clone https://github.com/nvm-sh/nvm.git .nvm
```

nvmのリポジトリに移動し、最新バージョンにチェックアウトします。

```sh
$ cd ~/.nvm
$ git checkout v0.35.0
```
nvmをアクティブ化します。
これをしないとnvmは使えないのかな？
試さないまま進んでしまったので分かりませんが、公式の手順にもあるので必要な手順なのでしょう。

```sh
$ source ~/.nvm/nvm.sh
```

ここまでできたらnvmのインストールが完了しているはずです！
以下のコマンドでインストールされたかどうか確認できます。

```sh
$ command -v nvm
```
`nvm`と出力されたらインストールできています。

#### nvmによるNode.jsのインストール
nvmを使用してNode.jsをインストールしていきます。
Node.jsは偶数のバージョンがLTS版(安定版)、奇数のバージョンが最新版となっているようです。
LTS版は長期間に渡って安定的にメンテナンスされているバージョンのことです。
最新の機能を使うためにどうしても最新版のnodeを使用する必要が場合を除けば、LTS版を使用するのがベターだと思います。

インストール可能なNode.jsのLTS版は以下のコマンドから確認できます。

```sh
$ nvm ls-remote
```

今回はLTS版の中で最新のバージョンである`v12.13.0`をインストールしてみます。(2019/10/25現在)
LTS版のうち最新のバージョンのNode.jsをインストールする。

```sh
$ nvm install --lts
```

このように表示されたらインストールできた証拠です。

```
Now using node v12.13.0 (npm v6.12.0)
```

バージョンを指定してインストールする場合は`nvm install`の後にバージョンを直打ちします。
今後Node.jsのバージョンを切り替えたい場合は同様`nvm install`コマンドで切り替えたいバージョンを指定すればOKです。

```sh
$ nvm install {インストールするバージョン名}
```

以下のコマンドで現在使用中のnodeのバージョンを確認できます。

```sh
$ node -v
```

#### デフォルトのNode.jsバージョンを設定する。
nvmによるNode.jsのインストールはできました。
しかし今のままではターミナルの再起動の際にまた同じことをやる必要があります。
そうならないために設定する必要があるのが、デフォルトのNode.jsバージョンの指定です。

以下のコマンドでデフォルトのNode.jsバージョンを設定します。

```sh
$ nvm alias default {Node.jsのバージョン}
# default -> v12.13.0と表示される
```

続けて`.bash_profile`を編集し、ターミナル起動の際にnvmコマンドが読み込まれるようにします。

```sh
$ vi ~/.bash_profile

# 以下を追加する
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_com
```

これでターミナルを再起動してみます。

```sh
$ node -v
# v12.13.0
```

無事デフォルトのNode.jsバージョンを設定できました。

## 3.Node.jsでHelloWorld
nvmを使ったNode.jsのインストールができたので早速Node.jsを触っていきましょう。
とりあえずHelloWorldします。
いつだって最初の一歩はHelloWorldです。


まずはterminalでjsを実行してみます。

```sh
$ node
>
```

nodeと打って実行すると何やら`>`マークが出てきます。
この状態をREPLと言い、javascriptの文法やNode.jsのモジュール確認に使用することができます。

###3-1.REPLでHelloWorld

```sh
# 計算する
> 22 * 3
66

# Hello Worldを出力する
> var test = "Hello World";
undefined
> console.log(test);
Hello World
undefined
```

REPLは終了するときは`control + d`を叩きます。

###3-2 httpモジュールからブラウザでHelloWorldしてみる
今度はローカルにサーバーを立ててブラウザ上にHelloWorldを出力してみます。
terminalから実行するためのjsファイルを作成します。

作成したjsファイルに以下のコードを記述します。

```javascript
// httpモジュールの作成
var http = require('http');

// Hello Worldを返すサーバーを立てる
var server = http.createServer(function(req, res) {
  res.end("Hello World");
});

// ポート8000で接続可能なサーバーを起動する
server.listen(8000);
```

このjsファイルを保存し、terminalからnodeで実行します。

```sh
$ node HelloWorld.js
```

実行しても何も表示されませんが、サーバーは起動しています。
http://localhost:8000/
↑このurlをブラウザで開いてみましょう。
以下のように表示されたら成功です。
<img width="151" alt="スクリーンショット 2019-10-27 23.05.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311282/05e1976f-0254-e2f3-dc96-7f6823e62253.png">

## まとめ
* Node.jsとはJavaScriptを使用したサーバーサイド実行環境である。
* Node.jsには以下の特徴がある
    * サーバサイドとフロントエンドを同じ言語で書ける。
    * 非同期処理を簡単に書ける
* Node.jsの導入、管理にはnvmを使用すると良い。

## 参考
公式
[Node.js公式サイト](https://nodejs.org/ja/)
[nvm公式Githubレポジトリ](https://github.com/nvm-sh/nvm)

Node.js自体について
[フロントエンドエンジニアにおけるNode.jsのススメ](https://ameblo.jp/ca-1pixel/entry-11476850674.html)

導入
[nvm(Node Version Manager)を使ってNode.jsをインストールする手順
](https://qiita.com/ffggss/items/94f1c4c5d311db2ec71a)[いまアツいJavaScript！ゼロから始めるNode.js入門〜5分で環境構築編〜]
(http://liginc.co.jp/web/programming/node-js/85318)

HelloWorld
[Node.jsで動くものを作ってみる、Helloworld](https://github.com/yosuke-furukawa/node_study/tree/master/002_helloworld)