はい、タイトル下手くそですね。


そろそろ一人でのお勉強がつらくなってきました。
※モチベーション的な意味ではなくて

勉強会とかってどこでやってるんでしょうか?

さて今回はタイトルの通り、requireのキャッシュについてです。

オリジナルのrequireをフックして〜とは別のやり方でやってみました。

nodeではプロセスへのシグナルも監視できるので
それを利用したいと思います。

server.js

var fs = require('fs')
    , http = require('http')
    , httpServer = http.createServer(onRequest);

function onRequest(req, res) {
    res.end(require('./test').run());
}

fs.writeFileSync(__dirname + '/pid.txt', process.pid);
process.on('SIGUSR1', function(){
    for (var key in require.cache) {
        delete require.cache[ key ];
    }
});

httpServer.listen(8080);
server.js実行時のプロセスIDをpid.txtに書き出しておきます。
プロセスに「SIGUSR1」が送られるとキャッシュを消す仕組みです。

test.js

exports.run = function(){
    return 'こんにちわ';
}

requireするファイルを作ります。

ここで一旦
node server.js
で起動し、http://localhost:8080へ接続してみます。
当たり前なのですが、ブラウザに「こんにちわ」と表示されます。

test.js

ファイルを更新します。
exports.run = function(){
    return 'こんばんわ';
}
test.jsを更新、保存しても一度requireされたtest.jsはキャッシュされているので
ブラウザをリロードしても「こんばんわ」とは表示されません。

プロセスにシグナルを送ってみます。
cat pid.txt | xargs kill -SIGUSR1
これで、仕込んでおいたキャッシュクリア処理が動くので
もう一度ブラウザをリロードしてみると「こんばんわ」と表示されます。

今回は実際の運用に入ったらrequireのキャッシュってどうしてるんだろう
ってとこからやってみましたが、実際のところみんなどうしてるんだろうか。
prototypeとかいじっちゃってるんだろうか。
みんなどうしてるんだろうな〜〜〜〜

って疑問を残しつつ、以上です。