Help us understand the problem. What is going on with this article?

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とかでもそうですね。
ちなみにnode appでサーバー起動する感じ。

  • index.js

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

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

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

index.js
// index.jsの例

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

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

※2015/4/3 追記
requireの挙動はちゃんと確認したところ、
「指定したモジュールのpackage.jsonmainプロパティで指定したファイルを読む」
ということになっていたので、ライブラリ的なモジュールを書く場合は、index.js(とか)を用意した上で、
package.jsonmainでも指定しておかないと、 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);
package.json
{
    "name": "my-module",
    "bin":  "bin/my-module"
}

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

  • grunt-plugin

gruntのpluginを書くときの話は、
さっき色々書いたので、よろしければ読んでみてください。

[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を更新することだけは忘れずに。

まとめ

fnobi
面白法人のテクニカルディレクター 兼 作曲家 兼 ドルヲタ ⌨️ http://github.com/fnobi 🎼 http://soundcloud.com/fnobi
http://fnobi.com/
kayac
古都鎌倉から新しい技術と面白いサービスを、次々にリリースする面白法人カヤックのフロントエンジニアチーム
http://www.kayac.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした