node.jsの基本

node.jsは僕にとってはじめてお金を稼げた言語でとても特別なものなのですが、仕様を端から端まで熱心に勉強したわけではなく、壁にぶつかってはググっての繰り返しで身につけたので自分の理解をちゃんと整理するための備忘録として、また初学の人たちへ少しでも役に立てばとまとめました。

##目次
* [Node.jsの基本その１](https://qiita.com/kenjiwilkins/items/b390dc779617eb28b9f7 "　Node.jsの基本その１")
* [Node.jsの基本その２](https://qiita.com/kenjiwilkins/items/c3ac2ce1fab80f400e1d "　Node.jsの基本その２")

#node.jsとは
node.jsはサーバーサイドのイベント駆動型JavaScript環境です。イベント駆動型というのは、プログラムの実行から何かしらが起きるまで待機して、起きた事物が規定の条件を満たしたときに指定された命令を実行するプログラミングの概念です。node.jsはJavaScriptを用いてPHPやPythonなどで書くようなサーバーサイドアプリケーションを作成することができます。

#Hello World

node.jsにおける最も基礎的なHello Worldです

```javascript:server.js
const http = require('http')
const port = 3000
const hostName = "127.0.0.1"
const headers = {
  'Content-Type': 'text/plain'
}
http.createServer((req, res) => {
  res.writeHead(200, headers)
  res.end('Hello World!\n')
}).listen(port, hostName)

console.log('Server running at http://' + hostName ')

```

これを走らせます

```console
node server.js
```

結果: Hello World!が　http://127.0.0.1:3000へのgetリクエストに返信します

<details><summary>豆知識？</summary>コマンドラインで走らせたコードはCtrl + Cで終了させられます</details>

#npm (Node Package Manager)

npmはnode.jsにおけるパッケージマネージャーです。Pythonにおけるpipみたいなものでしょうか（pythonはflaskを少し触ったくらいですので間違ってたらご教授お願いします）npmはnode.jsの開発環境においてモジュールの作成、共有、再利用を可能にしてくれます。この機能はnode.jsのインストールについてきます。

####モジュールのインストール方法
最も簡素な方法(例:express)

```console
npm install express
```

####モジュールの使い方
先程のhello worldでnode.jsにビルトインされているhttpモジュールを宣言しましたが全く同じように宣言できます。

```javascript
const express = require('express')
```
express.jsはnode.jsにおける最も簡素なウェブフレームワークのひとつです。

```javascript:server.js
const express = require('express')
const port = 3000

const server = express()

server.get('/', (req, res) => {
  res.header(200).send("Hello World!")
})

server.listen(port, () => {
  console.log('server listen on port:'+  port)
})
```

<details><summary>豆知識</summary>npm に存在するモジュールは[npmのウェブサイト](https://www.npmjs.com/ "npm")にて検索できますが "npm search [module_name]" でも検索できます。
</details>

###ローカルインストールとグローバルインストール

npmでインストールするモジュールには二種類の方法があります。とても重要です。

####ローカルインストール

ローカルにインストールするのはつまりそのディレクトリ内のnode_modulesフォルダにそのライブラリがインストールされるということです。
インストール方法

```console
npm install [module_name]
```

####グローバルインストール

グローバルインストールはそのマシンの全ファイルシステムでそのモジュールを実行可能にします。先程の例に使ったexpressは自動でアプリの骨組みを作成する機能がありますので、

```console
npm install -g express
express [app_name]
```
で自動でウェブアプリの雛形を作ってくれます。

###node.jsの仕組み

####Non-blocking I/O
IOはInputとOutputのことでコンピューターを通して入力と出力の間のデータをやりとりすることです。
入力は必ずしも人間とコンピューターとのやりとりに限りません。ウェブアプリにおけるI/Oはどんどん複雑になっています。それは単なるブラウザとサーバーのやり取りに限らず、サードパーティのAPIとのやりとり、スマホなど別のデバイスを使った認証、データベースへの多重同時接続などなど。
つまるところネットワークにおけるI/Oは複雑で詳細な予測が難しいということです。
そしてI/Oの処理にはときに長い時間がかかり、データを読み込んでいる間などに処理がそこで待機しつづけてしまうことがあります。
####非同期メソッド
この問題の解決のためにはコールバックを行います。

```javascript:asynchronous.js
const fs = require('fs')

fs.readFile('test.txt', (err, data) => {
  if(err){
    console.log(err)
    return
  }
  console.log(data)
})

console.log("this text should come first")
```

コールバックであるconsole.log(data)は"this text should come first"のあとに実行されます。なぜコードの中で下にある処理が先に実行されるのか、シングルスレッドであるnode.jsでこれを可能にしているのが**イベントループ**です。

####イベントループ

node.jsの最も重要な特徴のひとつです。イベント駆動型であるnode.jsは**何かが起きるまで**ループを繰り返して待機し続けていて、なにかすることが出てくるとすることとコールバックをキューに追加して他の一連の処理をして、次のI/Oへその処理が終了するまで待ち続けるループを行うのがイベントループです。
この特徴を最大限活かすのがnode.jsにおける効率的なコードを書くうえで大切になります。関数はイベントループをブロックしない、時間のかかる処理は細かい処理に分割するなどなど。

###その２へ続きます。
[Node.jsの基本その２](https://qiita.com/kenjiwilkins/items/c3ac2ce1fab80f400e1d"　Node.jsの基本その２")