読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

Advent Calendar 3 - NPMの使い方

本格的なウェブアプリケーションを作ろうと思うと、既存のライブラリを活用することが事実上不可欠です。Meteorは、クライアント、サーバーともJavaScriptの世界ですから、クライアントではブラウザ用JavaScriptライブラリ、サーバーではNode.js用ライブラリが多数活用できます。
ここで少し、関連用語を簡単に説明しておきます。

  • npm: Node.jsのパッケージマネージャです。NPMレポジトリには3000以上のパッケージが登録されているようです。
  • コアパッケージ: meteor付属のパッケージです。meteor listで一覧が出力されます。バージョン0.6.6.3で40個入っています。
  • Atmosphere: Meteorのパッケージレポジトリです。今日時点で751個のパッケージがあります。
  • Meteorite: Meteorのバージョン&パッケージマネージャです。コマンド名はmrt。Atmosphereからパッケージを追加するのに使います。(meteor 1.0では、mrtではなくmeteorコマンドでAtmosphereパッケージが追加できるようになるようです)

NPMパッケージと異なり、MeteorのコアパッケージやAtmosphereにはクライアント用、サーバー用のパッケージが混在しています。

MeteorではNPMのパッケージが利用可能ですが、meteorのサーバーにデプロイする際には今のところJavaScriptで書かれたパッケージのみのサポートになります。バイナリを含むパッケージはサーバー上では使えません。
また、Meteorは同期での記述がメインになるので、NPMのパッケージそのままでは使いにくい場合もあります。NPMパッケージを使いたい場合、Atmosphereに移植されたものがないか探してみるのがいいでしょう。

さて、MeteorでのNPMパッケージの使い方ですが、まず、npmでMeteoriteをインストールします。

npm install -g meteorite

次にアプリケーションにAtmosphereのnpmパッケージを追加します。

mrt add npm

これでアプリケーションが利用可能なパッケージとアプリケーションにnpmパッケージが追加されました。smart.jsonとsmart.lockというファイルが生成されます。
(npm機能を提供するMeteoriteのパッケージをnpmパッケージ、NPMレポジトリにあるパッケージ一般をNPMパッケージと呼ぶことにします)

mrt addは利用可能なパッケージへの追加とアプリケーションへの追加を一度に行うコマンドです。この後、mrt removeもしくはmeteor removeをするとアプリケーションから削除されますが、利用可能なパッケージとしては追加されたままの状態になります。利用可能なパッケージから削除するには、smart.jsonから関連行を削除します。

実際に使うNPMパッケージを指定するには、アプリケーションフォルダーにpackages.jsonという名前のファイルを作成します。中身は以下のようにJSON形式でパッケージ名とバージョンを指定します。

{
  "cheerio": "0.12.3",
  "twitter": "0.2.4"
}

cheerioはAtmosphereに移植されたものがありましたね。使った時点で気づいていませんでした。ただ、今Atmosphereに登録されているnpmパッケージのラッパーは、パッケージ側でrequireするのでそれ用のグローバル変数が固定されること、それから、サーバーのみで使う場合にもクライアント側に小さなjsファイルがロードされるようになること、という事情があり、あまり好きになれません。

ちなみにcheerioはNode.js上でjQueryのような記述でHTMLを扱うことができるライブラリです。クライアントでもサーバーでも同じ記述ができるというのは開放感がありますね!

これでmeteorを起動した時に必要に応じてNPMパッケージがインストールされます。

パッケージを実際に使うには、requireする必要がありますが、Meteorの場合、Node.jsのrequire関数は隠蔽されているので、代わりにnpmパッケージが提供するMeteor.requireを使用します。

var cheerio = Meteor.require('cheerio');
var Twitter = Meteor.require('twitter');

npmパッケージはrequire関数の他に、非同期関数を同期動作させたり同期関数にラップしたりする関数群も提供します。くわしくはnpmパッケージのドキュメントを参照ください。