Sun Dec 7 19:09:35 JST 2014

In nodejs let require reload

require は二度と同じ物を読み込まないようにキャッシュを持っているために、 途中にファイルの中身に変更が生じても、 ただ require するだけでは中身は変わらない。

terminal A

cat datum.json
{
    "message": "wait"
}

terminal B

coffee> require './datum'
{ message: 'wait' }
coffee> # ここで terminal A に戻って中身を変更する
coffee> require './datum'
{ message: 'wait' } # キャッシュした結果を返すだけ

動的に中身が変わるファイルをリアルタイムに読み込みたいときや、 あるいは開発中のREPLでの動作確認で困る。

キャッシュは require.cache に連想配列として持っている。 連想配列のキーは 読み込むファイルの絶対パスである。

拡張子の省略を許したパスから絶対パスへの変換は require.resolve で行われる

coffee> require './datum'
{ message: 'wait' }
coffee> delete require.cache[require.resolve './datum']
true
coffee> require './datum'
{ message: 'ready' }