はい、タイトル下手くそですね。
そろそろ一人でのお勉強がつらくなってきました。
※モチベーション的な意味ではなくて
勉強会とかってどこでやってるんでしょうか?
さて今回はタイトルの通り、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とかいじっちゃってるんだろうか。
みんなどうしてるんだろうな〜〜〜〜
って疑問を残しつつ、以上です。