Node.jsのモジュールシステムとオブジェクトの参照

Node.jsのrequireの動作についてのメモです。

requireの大原則

一番重要なのは「requireされたファイルはキャッシュされ、2度ロードされることはない。*1」ということです。

モジュールは初めて読み込まれたときにキャッシュされます。 すなわち(他のキャッシュと同様に) require('foo') を呼ぶたびに、もし引数の意味するものが同一のファイルであったなら全く同一のオブジェクトが返されます。

require('foo') が複数回呼び出されても、モジュールが複数回実行されることにはなりません。 これは重要な特徴です。 そのため、「部分的に完了した」オブジェクトを返すことで、 推移的な依存関係が循環していてもロードすることができます。

もしモジュールを複数回実行したければ、関数を公開して、 その関数を呼び出してください。

http://nodejs.jp/nodejs.org_ja/docs/v0.8/api/modules.html#modules_caching

実験

mod.js

module.exports = {
	get: function(name) { return this[name]; }
};

mod-ex.js

mod = require("./mod");

if (mod.hoge)
	mode.hoge++;
else
	mod.hoge = 1;

以上を利用して実験をしてみます。

その1

$ node
> mod = require("./mod");
{ get: [Function] }
> require("./mod-ex");
{}
> mod.get("hoge");
1
> require("./mod-ex");
{}
> mod.get("hoge");
1

その2

$ node
> require("./mod-ex");
{}
> require("./mod").get("hoge");
1

*1:しかし、モジュールシステム(Module)自体がモジュールで実装されている以上、ハックすることはできるようです。 [http://kinjouj.hatenablog.jp/entry/20120507/1336316400], [http://kacchan6.hatenablog.com/entry/2012/03/31/133656]