2011-01-22 136 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協議,因爲它是專爲此而設計的。只需在每個響應中提供一個ETag響應標頭,並通過檢查If-none-match請求標頭來添加對條件請求的支持。

計算實體標籤的好方法取決於您存儲文件的方式。在典型的* 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

謝謝。但我認爲,一些瀏覽器忽略這樣和那樣的標題,並且不打擾檢查304的是否他們有緩存中的文件..我想念你的建議仍然如何解決這個問題? –

+0

此外,FireFox可以..嗯.. *躺在*給我(通過螢火蟲)?在它的Net標籤頁中,我看到請求會出去獲取這些靜態文件,並返回一個很好的200 http響應,而在_reality_中它們不會打到我的服務器或者在Fiddler中顯示(它們只是由非常激進的本地緩存提供服務) - 再次請讓我明白,如果我失去了一些東西。 –