Node.jsのインストール 〜 ハローワールド 


# 目的
業務でNode.jsを触らなくなって3ヶ月ほど放置していたら、
PC再セットアップ時に思ったよりいろいろ忘れてるなぁと感じたので、
星の数ほどある導入記事を備忘のために書く。


# まずはインストール、の前に登場人物紹介
`Node.js`： 
今回の主役。
サーバサイドで動作するJavaScript。

`npm`： 
Node.js用のパッケージ(ライブラリ)管理ツール。インストールすると一緒についてくる。
nodeコマンドよりnpmコマンドを使うことが多くて、正直主役より目立ってる。

`nodebrew`:
Node.jsのバージョン管理ツール。Javaでいうjenv、rubyでいうrbenv。
Node.jsはアップデートが頻繁なので、一緒にいれちゃうのがおすすめ。
同じバージョン管理ツールの`nvm`というライバルがいる。

# 気を取り直してインストール
※ 対象はmacユーザです

1. nodebrew をインストール

    ```
    インストールして
   　　$ curl -L git.io/nodebrew | perl - setup

    .bashrc へ以下を追記
    　$ export PATH=$HOME/.nodebrew/current/bin:$PATH

    反映（もしくはターミナル再起動）
   　　$ source ~/.bashrc
    ```

2. Node.js をインストール

    ```
    $ nodebrew install-binary stable 
    ```
バリ早いです。5秒位で終わります。
stableは安定版という意味で、コマンド実行時点での安定版がインストールされます。
`stable`の代わりに`v10.14.2`みたいに直接バージョン指定ももちろんできます。


3. 使うNodeのバージョンの指定、確認

    ```
    使うバージョン指定して
    $ nodebrew ｕｓｅ stable 

    Nodeのバージョン確認
    $ node -v
    v10.14.2
    ```

    これでNode.jsのインストールは完了です。


# ハローワールド

```
適当なディレクトリで index.js を作成
  $ vi index.js

以下を記述
  console.log('Hello World!');

実行
  $ node index.js
  Hello World!
```

# 流石にちょっと寂しいので、サーバ起動してハローワールド
1. index.js を編集

    ``` index.js
    // httpという名前のネイティブライブラリをインポートして、httpという変数につめる
    const http = require('http'); 

    // サーバセットアップ
    http.createServer((req, res) => {
      res.writeHead(200, {'Content-Type': 'text/plain'}); // Content-Type指定
      res.end('Hello World!');
    })
    .listen(3000, () => console.log('Server http://localhost:3000')); // ポート3000で起動
    ```

2. 実行
`$ node index.js`

3. http://localhost:3000 へアクセス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/278872/2e2c149a-ad4e-3288-9186-4d235c8c63ab.png)

ね、簡単でしょ？

# フレームワークをつかう 
`express`というフレームワークを使ってルーティング処理。
フレームワークを導入したり、外部のライブラリを使用するには、`package.json`というファイルを作成する必要があります。
`pom.xml`とか`build.gradle`みたいな感じのやつ。

1. プロジェクト初期設定

    ```
    $ npm init
    対話形式で色々聞かれるが、とりあえずエンター連打でOK
    package name: (hello)
    version: (1.0.0)
    description:
    entry point: (index.js)
    test command:
    git repository:
    keywords:
    author:
    license: (ISC)

    Is this OK? (yes) yes
    ```
これでpackage.jsonが生成される。
中身はこんな感じ。

    ```
    {
      "name": "hello",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
    ```

2. express をインストール
`$ npm install express --save`

    なんかビャビャーってコンソールに出て、package.jsonを再確認すると、

    ```
    {
      "name": "hello",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "dependencies": { 
         "express": "^4.16.4"
      }
    }
    ```
    
    `dependencies`が増えてますね。
    package.jsonを見れば、このプロジェクトでどんなライブラリ使ってるかわかります。
    依存性とか言われても、最初「は？」ってなりますよね。未だになります。

3. express用にコード修正

    ```
    const express = require('express')
    const app = express()

    app.get('/', (req, res) => res.send('Hello World!'))
    app.get('/bye', (req, res) => res.send('Goodbye World!'));

    app.listen(3000, () => console.log('Server http://localhost:3000'))
    ```

4. アクセス
    ルートへアクセスするとHello、`/bye`へアクセスするとGoodbyeが表示されます。
    これでRESTfulなAPIが作れますね。
    ちなみに、package.jsonは依存性を書いておくだけではなく、`scripts`にスクリプトを書けます。
    試しに、以下のように修正して`$ npm run start`すると今まで同様index.jsを実行できます。

    ```
      "scripts": {
        "start": "node ./index.js",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
    ```
    
    gradleでいうTaskみたいなもんですね。最初は恩恵感じられないですが、そのうち欲しいと思うときがきます。


# おわり
ターミナル、nodeの純正ライブラリ、expressフレームワークでそれぞれ`Hello World`してみましたが、
どれもこれもあっさり出来ました。
今回はスクラッチでやりましたが、expressならそもそもテンプレートを作成する機能もあるのでここまで0からやる必要はないかも？

# つぎは
GAE(Google App Engine)がいつの間にかnodeに正式対応していたので、トライしてみます。