Node.jsのrequire.cache
Node.jsのrequireは読み込んだ後にその.jsファイルをキャッシュするような事は以前書いた。でこれ不都合な場合もある。それが「テストケース時にモジュールのprototypeを意図的に書き換えた場合にその後のテストケースにも影響する」っていうところがあるようで。
で色々調べてたらこういう素晴らしすぎる記事を発見
つまりrequireは行われた後にmodule.loadで何やらしているらしい。上記の記事にも書いてあるような方法を使用することでrequireでキャッシュされたのを意図的に消すことも出来る。もちろんrequire.cacheを利用する仕組み関係なやつはやっちゃダメだけど。で実際やってみると
var module_load = module.constructor.prototype.load;
module.constructor.prototype.load = function(filename) {
if (filename in require.cache) {
delete require.cache[filename];
}
return module_load.call(this, filename);
};
var express = require("express");
console.log(require.cache);
console.log(express);
deleteな記述な部分をコメントするとrequire.cacheにはたしかにexpressをロードしたのをキャッシュしたものが格納されているが、このまま動かすとrequire.cacheにはexpressをキャッシュしたのが入らない(正確には消される)