2011-01-22 13 views
6

静的ファイル(.js、.css)を参照するhtmlファイルをレンダリングするとき、どのようにキャッシュ無効化を処理しますか?ファイルを変更するたびにblabla.css?v = VERSIONNUMBERを手動で変更しますか?あなたはファイルのmtimeに基づいていくつかの自動メカニズムを持っていますか?node.jsキャッシュ無効化テクニック

+0

最も簡単な方法でこれを実現しました。スタティックリソースごとにクエリ文字列としてアプリの開始タイムスタンプを追加するだけです。ここの例:http://ankitjain.info/ankit/2013/12/05/cache-busting-nodejs-express-jade/ – ankitjaininfo

答えて

7

HTTPプロトコルに準拠しているので、キャッシュ用に設計されています。 If-none-matchリクエストヘッダーをチェックすることによって、各レスポンスにETagレスポンスヘッダーを提供し、条件付きリクエストのサポートを追加するだけです。

エンティティタグを計算する良い方法は、ファイルを格納する方法によって異なります。典型的な* nixファイルシステムでは、inode値が良いスタートです。

例:特殊なケースで

fs.stat(filePath, function(err, stats) { 
    if (err || !stats.isFile()) { 
     //oops 
    } 
    else { 
     var etag = '"' + stats.ino + '-' + stats.size + '-' + Date.parse(stats.mtime) + '"'; 

     //if etag in header['if-non-match'] => 304 
     //else serve file with etag 
    } 
}); 

、あなたも、メモリ内のETag、あるいはファイルをキャッシュして、すぐにファイルの変更などのエントリを無効化するために、fs.watchFile()コールバックを登録したい場合があります。

+0

ありがとう。しかし、私はいくつかのブラウザがそのようなヘッダーを無視し、キャッシュにファイルがあるかどうか確認するのをやらないと思います。どういうわけか、あなたの提案がまだ解決していないのですか? –

+0

さらに.. FireFoxは..ええ.. *私に(ファイヤーバグで)嘘をついていますか?そのネットタブでは、これらの静的ファイルを取得していい200 HTTPレスポンスで返す要求が出ていますが、_reality_では自分のサーバーにヒットせず、Fiddlerに表示されません(非常に積極的なローカルキャッシュによって処理されます) - 私は何かが欠けている場合は再び私に理解させてください。 –

関連する問題