Node.js学習メモ


インフラレイヤーの仕事ばかりしていた数年間でだいぶ浦島太郎なのでリハビリのためにNode.jsを学習中。そのメモ。随時加筆。

# インストール

公式サイトからインストーラーをダウンロードしてきてインストールしても良いが、複数バージョンの切り替えなどを考慮するとツール経由でインストールする方が良い。
ここでは、nodebrewを利用する。

## 既に他のツールでnode.jsがインストール済みの場合

例えばhomebrew経由でインストール済みの場合は予め以下のコマンドで削除する。

```
sudo brew uninstall --force node
```

## nodebrew経由でのインストール

まず以下を実行する。

```
curl -L git.io/nodebrew | perl - setup
```

実行後以下のように出力されるはずなので、環境変数を追加する。自分の場合は、zshを利用しており、自分用の設定は.zshrc.mineに全て記載しているので、そこの末尾に追加した。

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:03 --:--:--     0
100 23558  100 23558    0     0   5736      0  0:00:04  0:00:04 --:--:--  5736
fetching nodebrew...
install nodebrew in $HOME/.nodebrew

========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

次にインストール可能なnode.jsのバージョンを調べるために、

```
nodebrew ls-remote
```

を実行する。大量のバージョンが表示されるはずだ。

次に最新のバイナリをインストールする。引数には上記のコマンドで表示されたバージョン文字列を指定すれば良い。

```
nodebrew install-binary v4.1.1
nodebrew install-binary io@v3.3.1
```

ここで無事にインストールされているかを確認するには、

```
nodebrew ls
```

コマンドを実行すれば良い。ただこの時点ではどのバージョンのnode.jsを利用するかは設定されていないので、最後に

```
nodebrew use v4.1.1
```

と実行して利用バージョンを指定する。

# Hello Worldを試してみる

適当なファイル(`hello.js`)を作成し、以下のような内容にする。

```
var http = require('http');

http.createServer(function(request, response){
  response.writeHead(200, {'Content-type': 'text/html'});
  response.end("Hello World\n");
}).listen(8124);

console.log("Server is runnning at http://localhost:8124");
```

終わったらコマンドラインで以下のように実行すれば良い。

```
node hello.js
```

# 外部モジュールの管理

外部のモジュールを管理するためにはnpmを使うが、まずはそのためのpackage.jsonを作成する。

```
npm init
```

色々聞いてくるので適当に入力すればOK。

何かモジュールを追加する場合は、以下のようにする。引数に`--save`を付けることで、そこにある`package.json`もあわせて更新される。

```
npm install http --save
```

こうすることで当該ディレクトリの`node_modules`以下にモジュールがインストールされる。
もちろん、package.jsonを手で編集してもOK。


# 学習

とりあえず以下の2つを真面目にやればだいたいどんなものか分かる。本を買うよりもこちらをやった方が良さそう。

* [Nodeビギナーズブック](http://www.nodebeginner.org/index-jp.html)
* learnyounode (node.js 基礎) 初心者向け
 * 全部で課題は13個。最初はHello Worldから始まって、引数の読み取り、ディレクトリのファイル一覧取得、その非同期版、モジュール作成、httpクライアント作成、TCP Server、HTTPのAPI作成で終わる。一通りやればだいたい分かった感じにはなる

```
LEARN YOU THE NODE.JS FOR MUCH WIN!
Select an exercise and hit Enter to begin
────────────────────────────
» HELLO WORLD                                [COMPLETED]
» BABY STEPS                                 [COMPLETED]
» MY FIRST I/O!                              [COMPLETED]
» MY FIRST ASYNC I/O!                        [COMPLETED]
» FILTERED LS                                [COMPLETED]
» MAKE IT MODULAR                            [COMPLETED]
» HTTP CLIENT                                [COMPLETED]
» HTTP COLLECT                               [COMPLETED]
» JUGGLING ASYNC                             [COMPLETED]
» TIME SERVER                                [COMPLETED]
» HTTP FILE SERVER                           [COMPLETED]
» HTTP UPPERCASERER                          [COMPLETED]
» HTTP JSON API SERVER                       [COMPLETED]
────────────────────────────
HELP
CHOOSE LANGUAGE
CREDITS
EXIT
```
* その他にもWorkshoppersが[多数公開](http://nodeschool.io/#workshopper-list)されているので試してみると良い

# Express

ExpressはNode.jsでWebアプリケーションを作るためのフレームワーク。最新のバージョンは4系(4.13.3)。出回っている情報は3系のものが多いが非互換な箇所もあるので注意が必要。
まず試すということであれば[公式サイト](http://expressjs.com/)にチュートリアルがあるのでそれに従う。

## インストール

npm経由でインストールすればOK。

```
npm install express -g
npm install express-generator -g
```

## Express Generatorによる自動生成

ソースコードをExpress Generatorで自動生成する。適当な作業ディレクトリを作成し

```
express .
```

を実行する。以下のように表示されファイルが作成される。

```
   create : .
   create : ./package.json
   create : ./app.js
   create : ./public
   create : ./public/images
   create : ./routes
   create : ./routes/index.js
   create : ./routes/users.js
   create : ./views
   create : ./views/index.jade
   create : ./views/layout.jade
   create : ./views/error.jade
   create : ./public/stylesheets
   create : ./public/stylesheets/style.css
   create : ./public/javascripts
   create : ./bin
   create : ./bin/www

   install dependencies:
     $ cd . && npm install

   run the app:
     $ DEBUG=express-study:* npm start
```

package.jsonも作成されるので、このディレクトリで`npm install`を実行する。

これで準備が完了したのでアプリケーションを以下のようにして起動する。

```
DEBUG=express-study:* npm start
```

これで、`http://localhost:3000`にアクセスすれば画面が表示される。
CakePHPやRailsのようにコマンド一発でガシガシとやってくれる感じではないので、あとは自分で色々中身を作っていく。

### 気づいた点

* デフォルトのテンプレートエンジンが`Jade`になっている。Jadeはhamlのような感じの独自記法でテンプレートを記述するが、自由度や共同編集の兼ね合いもあるので、`ejs`の方が良い気がする。その場合は、Express Generatorを実行する際に引数`-e ejs`を追加すればOK。

# 構文チェックや静的解析

各種言語で存在するようにNode.jsでもlint用のツールが使える。メジャーなのは`jslint`と`jshint`だが、`jslint`はチェックが厳しすぎるきらいもあり、`jshint`を使うのが定番の様子。

* vimのsyntasticプラグインとjshintを組み合わせることでvimでのファイル編集中にリアルタイムにlintを実行できる
* `plato`を使うとレポートの出力も含めて良きに計らってくれる。`Grunt`と組み合わせれば処理を自動化できる

# テスト自動化

色々なフレームワークが存在しているが、以下が定番。

* Qunit
* mocha
* jasmine

標準のassertメソッドだけを使うのではなくAssertionライブラリと組み合わせるのが定番の模様

* chai
* power-assert-js