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機能付きのフレームワークを設計するならアリでしょう。