2013年4月13日土曜日

Node.jsのexportsとmodule.exportsについて

どうも、俺@休日中です。

最近少しだけ、プライベートでNodeをいじっています。
そういえば、初めてNodeを触ってからもう2年も経つんだなぁとシミジミ。
安定版なんかもうv0.10.3なんですね。

さて、過去のオデの日記で「node.jsで自作モジュールの作り方」というエントリーをポストしてますが、
この頃は多分あまりexportsとmodule.exportsの意味を理解していなかったようです。
※今もしていません。

今回それらを調べてみたところ、
exports
 関数をモジュール化する
module.exports
 オブジェクト(関数、配列、JSON、など)をモジュール化する
という認識で良いような気がしました。

あまり意味が分からない場合は、
Node.js Module – exports vs module.exports(※英語)にあるように、
標準は「module.exports」、補助的に「exports」という事なので、
特に深く考えずmodule.exportsを使うという認識でほぼ間違いはない気がします。

前回の僕のエントリーを元に考えます。
・exportsの場合
Person.js
exports.setName = function(name) {
  this.name = name;
};
exports.hello = function() {
  console.log("hello!");
};
exports.myName = function() {
  console.log(this.name);
};
app.js
var p = require("/path/to/Person");
p.setName("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
これらはつまり、setName(name)、hello()、myName()という3つの関数を
var p = require("/path/to/person");
をp変数にオブジェクトとしてexportして使っています。
「意味的にPersonオブジェクトを生成して・・・」というより、上記3つの関数をまとめたオブジェクト、という感じでしょうか。

・module.exportsの場合]
Person.js
var Person = function(name) {
  this.name = name;
};
Person.prototype.hello = function() {
  console.log("hello");
};
Person.prototype.myName = function() {
  console.log(this.name);
};
module.exports = Person;
app.js
var Person = require("/path/to/Person");
var p = new Person("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
こっちは、Personオブジェクトを取り出して使っています。

両方とも意味合いは同じですが、Person型のオブジェクトとして利用するという意味合いを持たせるには
module.exportsを利用するべきです。

ちなみにexportsとmodule.exportsが1つのファイル(例:Person.js)に混在している場合は
module.exportsが優先されてしまうので要注意。

以上でぇぇぇぇぇす。
もし間違いがあればご指摘下さいm(___)m

0 件のコメント: