require は二度と同じ物を読み込まないようにキャッシュを持っているために、 途中にファイルの中身に変更が生じても、 ただ require するだけでは中身は変わらない。
cat datum.json
{
"message": "wait"
}
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' }