2016-05-23 126 views
0

通常情況下,我會通過http2的文件服務解決這樣的請求:更新緩存請求

if (req.url === '/main.html') { 
    let files = { 
    'main.css': { 
     type: 'text/css' 
    }, 
    'main.js': { 
     type: 'application/javascript' 
    } 
    }; 
    for (let name in files) { 
    let push = res.push('/' + name, { 
     response: { 
     'Content-Type': files[name].type, 
     'Cache-Control': 'public, max-age=31556926' 
     } 
    }); 
    push.on('error', er => console.log(er)); 
    push.end(fs.readFileSync('/home/src/' + name)); 
    } 
    res.writeHead(200, { 
    'Content-Type': 'text/html' 
    }); 
    res.end(` 
    <html> 
    <head> 
     <link rel="stylesheet" href="/main.css"> 
     <script src="/main.js"></script> 
    </head> 
    <body></body> 
    </html> 
`); 
} 

我有一個問題,當他們的新內容都可以更新這些2個文件main.cssmain.js。 它們會通過發送另一個/main.html請求來更新嗎?如果不是,我如何更新它們?

回答

1

不,他們不會更新。當您嘗試推送資產的新版本時,瀏覽器將重置流,因爲它認爲這些資產仍然是新鮮的。它將繼續使用舊版本的資產。

至少現在,解決方案是使用高速緩存摘要機制緩存清除。

在這裏閱讀細節:

https://www.shimmercat.com/en/info/articles/caching/

又見this answer

+0

非常感謝您的回答。我還考慮通過'max-age'設置一個很短的生命期來移除舊的緩存。你有沒有嘗試過這種方法?它是否適用於所有瀏覽器? – Lewis

+0

嗨!是的,這種方法在Internet Explorer,Chrome和Firefox中運行良好。 Safari不支持HTTP/2 Push,所以不需要它。 – dsign