Node.jsのrequire.cache

2012-05-07T00:00:00+00:00 JavaScript Node.js

Node.jsのrequireは読み込んだ後にその.jsファイルをキャッシュするような事は以前書いた。でこれ不都合な場合もある。それが「テストケース時にモジュールのprototypeを意図的に書き換えた場合にその後のテストケースにも影響する」っていうところがあるようで。

で色々調べてたらこういう素晴らしすぎる記事を発見

Node.jsでrequireをフックする

つまり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をキャッシュしたのが入らない(正確には消される)

Node.jsのrequire