macでNode.jsの環境設定

Node.jsを使ってみたいと思った時に気になった環境設定のメモ

インストールをしようとした時に出てくるワード
・nvm(Node Version Manager)
・Express(Node.js上で動作するWebアプリのフレームワーク)

★こんがらがる「nvm」と「npm」（追記：20151215）
>
npmは Node.js をインストールすれば一緒にインストールされるとのこと。
・nvm(Node Version Manager) は Node.js 自体をバージョン管理するツール
・npm(Node Package Manager) は Node.js で作られたパッケージモジュールを管理するツール
Node.jsのパッケージを入れたいときは
　　$npm install パッケージ名
で簡単にインストールできます。
「-g」オプションをつけるとグローバルインストールになり、このグローバルインストールしたパッケージは全てのプロジェクトで使えるようになるとのことです。

★そもそも、node.jsの本家サイトからnode.jsをダウンロードするだけではいけないのか？
>
Node.jsは開発が活発に行われており、更新頻度が高いそうです。
また、古いバージョンに戻したりもしやすいように、Nodeバージョン管理のnvmを利用するほうが開発サイドとしては使い勝手がよいってことらしいです。

直接Node.jsをダウンロードしてインストールする方法の参考URL
・[tettori](http://www.tettori.net/post/293/)
nvmをインストールしてからNode.jsをインストールする方法の参考URL
・[複数バージョンのNode.jsを使い分けよう！](http://tech-sketch.jp/2014/05/%E8%A4%87%E6%95%B0%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AEnode-js%E3%82%92%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%82%88%E3%81%86%EF%BC%81.html)
nvmがすでに入っていてnvmのバージョンを上げたい場合の参考URL
・http://qiita.com/n0bisuke/items/66e32609c7d941dc8c94

★Expressって使う必要があるのか？
>
nvmのパッケージとして提供されているMVCフレームワークのExpress。
node.jsの書き方でjsファイルを書くこともできるが、複雑な処理をしたいときにexpressで書いたほうが便利。
参考：http://www.atmarkit.co.jp/ait/articles/1503/04/news047.html
nvmのパッケージはいろいろあるらしい。

#nvm(Node Version Manager)インストール
1. https://github.com/creationix/nvm より入手「Install script」参照
2.  macのターミナルを立ち上げて以下を実行すると自分の環境下にインストールされる  

```
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7149  100  7149    0     0  10209      0 --:--:-- --:--:-- --:--:-- 10198
=> Downloading nvm from git to '/Users/****/.nvm'
=> Cloning into '/Users/****/.nvm'...
remote: Counting objects: 3824, done.
 :
 : 略
 :
```
>
ホームの下に、.nvmができました。
このままだと、素直に使えないので以下のURLを参照して[.bash_profile]を作成する
[MacにNode.jsをインストールする](http://qiita.com/_daisuke/items/fb81f45314c571a678cc)

```titile:.bash_profile
# nvm設定
[[ -s ~/.nvm/nvm.sh ]] && . ~/.nvm/nvm.sh
nvm use default
npm_dir=${NVM_PATH}_modules
export NODE_PATH=$npm_dir

# 毎回実行しなくていいように設定を反映させるコマンドも書いておく
source ~/.nvm/nvm.sh
```

nvmが使えるか確認

```
$ nvm --version
0.25.4
```

[20151126.補足]
nvmのバージョンが古いなと感じたらバージョンをあげます。
[こちら](http://qiita.com/n0bisuke/items/66e32609c7d941dc8c94)を参考に以下のようにすればバージョンがあがりました。

```
$ cd ~/.nvm
$ git pull origin master
$ source ~/.nvm/nvm.sh
```
[20160510.補足]
パッケージ管理用のnvmのバージョンが古いとかどういうこと？　と疑問が・・
nvmのバージョンが古いと、node.jsのバージョンをあげたい時に確認する「nvm ls-remote」を実行したときに最新バージョンが出てきていないことがあるのです。
なので、久々にnvmコマンドを使う場合は、nvmのバージョン確認をしてみたほうがいいですね。

```:まとめ
$ nvm --version
0.29.0＜ー　新しいのかよくわからない・・・
$ cd ~/.nvm
$ git fetch
remote: Counting objects: 545, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 545 (delta 250), reused 245 (delta 242), pack-reused 275
Receiving objects: 100% (545/545), 218.27 KiB | 54.00 KiB/s, done.
Resolving deltas: 100% (355/355), completed with 52 local objects.
From https://github.com/creationix/nvm
   c742ab7..ec2f450  master     -> origin/master
:
 * [new tag]         v0.29.0    -> v0.29.0 ＜ー今これらしい
 * [new tag]         v0.31.1    -> v0.31.1
 * [new tag]         v0.30.0    -> v0.30.0
 * [new tag]         v0.30.1    -> v0.30.1
 * [new tag]         v0.30.2    -> v0.30.2
 * [new tag]         v0.31.0    -> v0.31.0　＜ーこれが最新版らしいのでupdateしよう！
$ git pull origin master
$ source ~/.nvm/nvm.sh
$ nvm --version
0.31.1
```

[20170112.補足]
久々にnvmの新しいバージョンを確認してみようと実行してみると、エラーがでました。

```
$ git fetch
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
```
Xcode のライセンスに同意する必要があるようです。Xcodeを起動して出てきたダイアログの "Agree" を押します。
インストールするためにパスワードを聞かれて、XcodeのComponentインストールが始まります。
![スクリーンショット 2017-01-12 14.33.10.png](https://qiita-image-store.s3.amazonaws.com/0/39911/ee279e14-e810-53e4-031e-9beea63aef27.png)
正常に終われば、再度ターミナルから*git fetch*して状態を確認できました。


＜ちょっとした疑問＞
macターミナルを起動した時に毎回node情報が出てくるようになりました。

```
Last login: Tue Dec 15 14:16:34 on ttys001
Now using node v0.12.8 (npm v3.5.0)
$
```
これは.bash_profileを修正したので、Terminalの起動時にnvmが自動で読み込まれる
せいです。
node用スクリプトをすぐに実行できる状態になっています。

[20160127.補足]
インストール作業の状態だとパスは通っていたのに、ターミナル立ち上げ直したらパスとおってないじゃん！
npmってうっても「-bash: npm: command not found」nodeって打ってもbashエラー
ってなったときに、、、
.bash_profileを見直してください。
「nvm use default」　のdefaultがわかっていないので起きてるみたい。
そのせいで、npmのパスも通っていない。
使用するバージョンを書いておいてください。
そうすればnpmもnodeもターミナル立ち上げたときにパスが通ります。

```:.bash_profile
:
nvm use 0.12.9　＜ーdefaultを書き換えるだけ。
:
```

# Node.jsをインストールする
インストール可能なNode.jsのバージョンを確認。安定しているバージョンをいれないといけない。
Node.jsはマイナーバージョンが偶数バージョンのものが安定版らしい。

```
$ nvm ls-remote
        v0.1.14
        v0.1.15
        v0.1.16
        v0.1.17
        v0.1.18
 : 略
        v0.12.7
    iojs-v1.0.0
 : 略
    iojs-v2.4.0
    iojs-v2.5.0
    iojs-v3.0.0
```

今回は「v0.12.7」をいれることにする。

```
$ nvm install  v0.12.7
######################################################################## 100.0%
Now using node v0.12.7 (npm v2.11.3)
```

node.jsが使えるか確認

```
$ node -v
v0.12.7
```

[20151126.補足]
[$ nvm ls-remote]した時にインストールされているバージョンは青くなります。
使用するバージョンを切り替えたい場合、[$ nvm use バージョン]とすると変わります。

```lang:v0.12.7=>v0.12.8に変更
$ node -v
v0.12.7
$ nvm use 0.12.8
Now using node v0.12.8 (npm v2.14.9)
$ node -v
v0.12.8
```

★バージョンを上げる時の注意点（補足：20151126）
処理系が変わる時はビルドし直す必要があるため、node_modules入れ直しをしないと思わぬところで動かなくなるなどの現象にハマるらしいです。
[node.jsをバージョンアップしたら最初にやるべきこと](http://qiita.com/hiro93n/items/fccf71765ecd1dbb3088)
もし、マイナーバージョンをアップして動作がおかしくなったら一旦node_modulesを削除してビルドし直す方法も視野にいれてみてください。
（v0.10 => v0.11などの場合は必要とのこと。）

〜〜〜〜〜〜
ところで、node.jsはどこにインストールされたのだろう？
nvmを使っている場合は、
~/.nvm/versions/node/ をみてみるとそこにインストールしたバージョンのnode.jsがあるようです。
なるほど、だからレンタルサーバでもインストールはできるんですね。
〜〜〜〜〜〜

＜ちょっと使用例＞
適当場所で以下の様なファイルを作ります。

```title:index.js
var http = require('http');
http.createServer(function(req,res){
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hellow World!!');
}).listen(3000);
console.log('Server running at http://localhost:3000/');
```
これは http モジュールを require して、簡易HTTPサーバを作成したjsファイルです。
このファイルを実行してみます。

```
$ node index.js 
Server running at http://localhost:3000/

  =>これでブラウザにアクセスすればindex.jsに記載している内容が実行される
```

これでブラウザから「http://localhost:3000/ 」を開いてみると・・・
![スクリーンショット 2015-08-06 17.10.55.png](https://qiita-image-store.s3.amazonaws.com/0/39911/8f0c15da-1bdb-7598-f6ed-8f1160867953.png)  
表示されちゃいました！
nodeコマンドを抜けるときは Cntl+C で抜けれます。
node.jsのモジュール群の参考は
http://nodejs.jp/nodejs.org_ja/api/index.html

#Expressのインストール
npm install express -g ではインストールできないみたいです。
参考：http://qiita.com/armorik83/items/d8c74a78759f7af18dba

```
$ npm install -g express-generator
/Users/***/.nvm/versions/node/v0.12.0/bin/express -> /Users/***/.nvm/versions/node/v0.12.0/lib/node_modules/express-generator/bin/express
express-generator@4.13.1 /Users/***/.nvm/versions/node/v0.12.0/lib/node_modules/express-generator
├── sorted-object@1.0.0
├── commander@2.7.1 (graceful-readlink@1.0.1)
└── mkdirp@0.5.1 (minimist@0.0.8)
```
適当な場所で、exsampleというWebテンプレートになるフォルダを用意します。
ここらへんを参考にしたのは
http://www.atmarkit.co.jp/ait/articles/1503/04/news047_3.html
http://qiita.com/deconcepter/items/e423046899575fe1846b

```
$ express example

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

   install dependencies:
     $ cd example && npm install

   run the app:
     $ DEBUG=example:* npm start

$ cd example && npm install
$ DEBUG=example:* npm start
```

ちょっとわかりにくかったけど、

1. expressコマンドでWeb表示されるドメイン直下のディレクトリ（example）をつくる。
2. 作ったexampleに移動し、npmコマンドでexpressのライブラリをインストールする
3. DEBUG=example:* npm start　することでブラウザ[http://localhost:3000/](http://localhost:3000/)で表示される。

ってことみたいです。

##Expressのバージョンアップについて (追記：20151126)
今使用しているGlobalパッケージが古くなっているかを確認する

```
$ npm outdated -g
Package  Current  Wanted  Latest  Location
npm       2.14.9   3.5.0   3.5.0  /Users/****/.nvm/versions/node/v0.12.8/lib > npm
```

古いパッケージをつかっているのがわかれば、それをバージョンアップする。

```
$ npm update -g
/Users/****/.nvm/versions/node/v0.12.8/bin/npm -> /Users/****/.nvm/versions/node/v0.12.8/lib/node_modules/npm/bin/npm-cli.js
npm@3.5.0 /Users/****/.nvm/versions/node/v0.12.8/lib/node_modules/npm

$ npm outdated -g
Package  Current  Wanted  Latest  Location
npm        3.5.0   3.5.1   3.5.0  
```

★★参考まで
node.jsのバージョンアップではいろいろ気をつけておく必要があるらしい
npmもインストールしている状態でnode.jsを最新にアップデートする方法として
[Node.jsとnpmをアップデートする方法](http://parashuto.com/rriver/tools/updating-node-js-and-npm)
こんなのもあるらしい。

#Node.jsをアンインストール（追記：20151215）
・・・・そんなこともあります。未検証ですがメモとして残しておきます。
参考URL:
[Macにインストールしたnode.jsをアンインストールしてHomebrewで管理する](http://www.seta-blog.co.jp/mac%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9Fnode-js%E3%82%92%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6homebrew/)

削除の順番は以下がいいらしいです。
　・npmをアンインストール
　・node.jsをアンインストール

```title:npmアンインストール
$ sudo npm uninstall npm -g
```
```title:nodeアンインストール
$lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
/usr/local/lib/node_modules \
/var/db/receipts/org.nodejs.*
```
※「\」はコマンドライン上での改行
※「lsbom」はBOMファイルの内容を表示するコマンド：[参考](http://goblous.com/Memo/index.php?Article=Japanese/IT/ShellScript_Bash/Cmd_lsbom.html)

[20170112：補足追記]
npmコマンドの参考にとても便利でした
[npmコマンドの使い方](http://qiita.com/yoh-nak/items/8446bf12094c729d00fe)
久々だと、アップデートの方法もちょっと忘れるのでメモメモ
[Node.jsとnpmをアップデートする方法](http://parashuto.com/rriver/tools/updating-node-js-and-npm)