チームラボ オンラインスキルアップ課題

STEP2-4.パッケージマネージャのnpmとは

Node Packaged Modules(npm)とは

Node Packaged Modules(npm)とはNode.jsのライブラリやパッケージを管理することができるツールです。 ライブラリやパッケージの管理ツールを主にパッケージマネージャと呼びます。 パッケージマネージャを使うことで、使いたいライブラリの導入や削除を簡易にしたり、パッケージ同士の依存関係を管理することができます。

Node.jsのパッケージマネージャであるnpmは、Node.jsと一緒にインストールされています。 またnpmでインストールできるパッケージが登録されており、npmjs.orgからどのようなパッケージが管理できるかを確認することができます。

パッケージマネージャを使ってみる

コマンドライン上でnpmを使います。

> npm list -g

とコマンドラインで実行すること既にインストールされたパッケージを確認することができます。 「-g」というパラメータはグローバル(PC内のすべてのプロジェクトで使える)のパッケージを指定します。 「-g」を除くとローカル(現在のディレクトリ内)のパッケージの指定になります。

コマンドラインから実行するものはグローバルに、ソースコードの中で読み込むライブラリはローカルにパッケージをインストールするという風にして、「-g」をつけるかどうかの区別を行えばいいです。

supervisorを使ってみる

コマンドライン上で実行するコマンドとしてsupervisorというパッケージをインストールしてみます。 supervisorはNode.jsのプログラムを監視し、エラーが発生してプログラムが終了した場合に自動に再起動してくれます。

var http = require('http');
var num = 0;

http.createServer(function(req, res) {
  if(num < 10) {
    res.writeHead(200, {'Content-Type' : 'text/plain'});
    res.end('Hey, you are No.' + num + ' user!');
    num += 1;
  } else {
    // エラーを発生させる
    throw "exception!";
  }
}).listen(1337, 'localhost');

console.log('server running at localhost:1337');

このプログラムを実行すると、アクセスした回数を数えて表示していき10を超えるとエラーメッセージが表示されて終了するはずです。

※ Chromeでは内部処理によってページアクセス時にfaviconへのアクセスも同時に行わるため、このプログラムではカウントが2ずつ増えます。

Webサイトとして公開するときはエラーが発生したときに終了してしまうと、毎回手動でサーバを再起動しなければいけません。 SupervisorというNode.jsでプロセスを監視するプログラムを用いて、Webサイトを監視するようにします。

> npm install -g supervisor

このようにコマンドラインで実行することでsupervisorをインストールします。 Supervisorはコマンドライン上で実行するので「-g」を足してグローバルにインストールします。

再度、npm list -g を実行すると、supervisorがインストールされていることがわかります。

この状態でSupervisorを実行します。コマンドは以下のようになり、引数に先ほどのファイルを指定します。

> supervisor server.js
Running node-supervisor with
  program 'server.js'
  --watch '.'
  --extensions 'node,js'
  --exec 'node'

Starting child process with 'node server.js'
...
server running at localhost:1337

先ほど同じように10を超えた時点で前回と同様にプログラムが停止しますが、 自動的にプログラムを再起動しているのがコマンドプロンプト上で確認することができます。

/Users/xxx/nodeStudy/server.js:11
    throw "exception!";
    ^
exception!
Program node server.js exited with code 8

Starting child process with 'node server.js'
server running at localhost:1337

再度アクセスするとカウントが0からになっており、再起動が行われたことがわかります。