3分でできるnpmモジュール


**まずあれです、タイトルは盛りました。**
実装は3分じゃおわらないよ!!

でも公開のための作業は3分くらいで行けるんじゃないかと思います。
作ったものを、公開したくてうずうずしている方は、ぜひ読んでみてください。

## [1分目] npmアカウントを作ろう

### npmの公式ページから
なにはともあれ、npmの開発者として登録しましょう。
https://npmjs.org/signup から、「Make it so.」しましょう。

特筆するようなことはないですが、すぐに使うので

- username
- password
- email address

は、ちゃんとメモしておきましょう。

### npm adduser

登録ができたら、ターミナルから```npm adduser```を実行します。

すると、username・password・email addressを聞かれるので、
先ほど作ったアカウントのものを入力します。

これで```~/.npmrc```にtoken情報が書き込まれ、
このアカウントから、npmモジュールを公開する準備が整います。


## [2分目] モジュールを実装する

いよいよ実装です。とりあえず、プロジェクトルートを作りましょう。

```
% mkdir my-module
% cd my-module
```

そしてあとは、元気にnodeのコードを書いていけばいいんですが、
npmモジュールならではのルールがいくつかあるので、覚えておきましょう。

### モジュールに必要なファイル
- **package.json**

すべてのnpmモジュールに必須です。
主にモジュールの名前や、依存関係などが書いてあります。

ゼロから作るときには、公式などから例をコピペしてもよいのですが、
```npm init```を使うと、対話式で入力することができるので便利です。

- **app.js**

Webアプリケーションなら、メインのサーバーのコードはapp.jsに書くことが多いです。
[express](http://npmjs.org/package/express)とかでもそうですね。
ちなみに```node app```でサーバー起動する感じ。


- **index.js**

nodeでは、```require('./hoge')```と書けば、```./hoge/index.js```を読んでくれます。

てなわけで、ライブラリ的なモジュールを書く場合は、
index.jsを置いておけば、requireしやすくなります。


lib以下でコードの本体を書いて、
index.jsでそれをrequire、そのままexport、みたいな形のモジュールが多です。

```javascript:index.js
// index.jsの例

var myModule = require('./lib/myModule');
// (実際には ./lib/myModule/index.js を読む)

// それをそのまま、このモジュールからexport
module.exports = myModule;
```

**※2015/4/3 追記**
requireの挙動はちゃんと確認したところ、
*「指定したモジュールの`package.json`の`main`プロパティで指定したファイルを読む」*
ということになっていたので、ライブラリ的なモジュールを書く場合は、`index.js`(とか)を用意した上で、
`package.json`の`main`でも指定しておかないと、 **requireができなくなるので注意**しましょう。

`require('./lib/index.js')`と書いた場合など、ローカルのファイルやディレクトリをrequireする場合は気にしなくてよい。

- **bin/my-module**

nodeを使ったコマンドラインツールを作りたい場合は、
bin以下にコマンドとして実行したいjsを置きます。

その上で、package.jsonにコマンドの場所を記述しておけば、
```npm -g install```されたら、コマンドをインストールする、というモジュールになります。

```
#!/usr/bin/env node

console.log('print argv.');
console.log(process.argv);
```

```json:package.json
{
    "name": "my-module",
    "bin":  "bin/my-module"
}
```

なお、もっとちゃんとしたコマンドラインツールを作りたい場合、
[optimist](http://npmjs.org/package/optimist)とか[commander](http://npmjs.org/package/commander)とか、
引数・オプションのハンドリングをしてくれるライブラリを使った方がいいです。

- **grunt-plugin**

gruntのpluginを書くときの話は、
[さっき色々書いた](http://qiita.com/items/5590e7e92b4f2bd81d04)ので、よろしければ読んでみてください。

## [3分目] 調整と公開
### package.jsonの調整

いよいよ、公開の準備です。
package.jsonの中身をいろいろ確認しましょう。

- **private**

このプロパティが```true```になっていると、
モジュールの公開ができません。

誤って公開してしまうのを防ぐフラグなので、
この公開直前のタイミングでfalseにするのがいいと思います。

- **name**

モジュールの名前です。
npmモジュールそれぞれのURLは```http://npmjs.org/package/:name```という形式になっているので、
他の誰のモジュールとも重複禁止です。

http://npmjs.org で、公開してみる前にその名前が使われていないか、
チェックするとよいです。

また、nameに使えるのは **小文字英数字とハイフンだけ**です。
CamelCaseとか"_"区切りの名前はナシなので注意しましょう。

- **version**

最初は無難に、0.0.1とかにしておけばいいと思います。
2度目以降(アップデート)の時には、前に公開したときより大きい数字になるようにしましょう。

- **main**

このモジュールの主となるスクリプトファイルを指定します。
前の項でも触れましたが、 **requireできるモジュールを作る場合は必須**です。

grunt pluginの場合は、実は`require`される機会がないのでいらない。

- **dependencies**

依存npmモジュールです。

プロジェクトにnpmモジュールを追加するときは、
必ず```npm install --save```を使うべきだと思います。
そうすれば、常にdependenciesは最新の状態に保たれます。

ただそれでも念のため、
1度```node_modules```を削除して、再度```npm insatll```して、
モジュールが正しく動くかどうか、などチェックしておくと安心です。

### npm publish

いよいよ、公開です!!
package.jsonの準備さえ整っていれば、
```npm publish```を叩くだけで、作業は終了です。

すぐに別の場所で```npm install my-module```して、
動作確認したり、にやにやしたり、しておきましょう。

## [その後] アップデート
npmでは、公開のコマンドもアップデートのコマンドも、
どちらも```npm publish```で行うので、
公開とアップデートはほぼ動作が同じです。 
さっきも書きましたが、versionを更新することだけは忘れずに。

## まとめ

- [package.jsonのDoc](https://docs.npmjs.com/files/package.json)を読めばだいたい大丈夫