最近少しだけ、プライベートで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