node.jsでモジュールを再ロードする

requireされたモジュールは、モジュールのフルパスをキーとしてrequire.cacheというオブジェクトに格納されており、これを削除すればモジュールを再びロードできるらしい。というわけでテスト。

# main.js
console.log(process.pid);

setInterval(function() {
    var a = require('./a');
    console.log(a.value);
}, 3000);

process.on('SIGINT', function() {
    console.log('clear module a');
    var key = require.resolve('./a');
    delete require.cache[key];
});
# a.js
console.log('load module a');

exports.value = 'wang';

実行すると、3秒毎にwangと書かれる。キャッシュされるので load module a というログは1回しかでない。

$ node hoge.js
13330
load module a
wang
wang
wang
wang
wang

別のターミナルでa.jsを編集する

# a.js
console.log('load module a');

exports.value = 'nyan';

a.jsを書き換えて保存し、

$ kill -SIGINT 13330

nodeプロセスにSIGINTを投げると…

wang
clear module a
load module a
nyan
nyan
nyan

再度 load module a が出力され、書き換えた内容が反映されている。モジュールがロードしなおされたようだ。

開発用のhot reloadingに使えると思うが、既存のアプリに適用するには設計レベルで見直しが必要なので難しそう。hot reloading機能付きのフレームワークを設計するならアリでしょう。