Node.jsでロードパスをプログラム内から追加する

その昔はrequire.pathsというのがあってプログラム内からロードパスを設定できたんだけど、いつしかrequire.pathsは廃止され、NODE_PATHで設定するしかなくなった。

でもNODE_PATHだとプログラムの中からロードパスを変更することができない。

// libにパスを通して./lib/foo.jsをrequire('foo')で読み込みたい
process.env['NODE_PATH'] = __dirname + '/lib';
require('foo'); // Error

とやっても ./lib/foo.js は読み込めない。でも環境変数いちいち指定するのめんどいよ!ってこともある。

そこでソース読んでたらModule._initPathsってのを呼べばNODE_PATHを見てパスを再設定してくれそうだなーと思ってやってみたらできた。

process.env['NODE_PATH'] = __dirname + '/lib';
require('module')._initPaths();
require('foo'); // Success

現状の最新の安定バージョン(v0.10.7)で動くのを確認した。

ただしアンドキュメントだし全くもって正攻法ではないので使う場合はその辺をわかった上で使いましょう。むしろ使わないにこしたことはない。