在github页面上确定页面已过时

Wil*_*ill 40 javascript github browser-cache

Github页面在所有服务内容上设置非常积极的缓存标头(Cache-Control: max-age=864001天,Expires提前1个月).

如果您更新页面并推送到github,那么重新访问已经拥有缓存副本的页面的人将无法获得新页面而无需实际清理其浏览器缓存.

如何在页面中运行的脚本确定它是陈旧的并强制更新?

步骤可能是:

  1. 确定你在github页面上运行:easy,parse window.locationforgithub.com/
  2. 确定网页的当前版本:很难,Git并不让你嵌入SHA1 一个COMMITED页面; 没有RCS $id$.那你怎么知道你的版本是什么?
  3. 获取github中的当前版本; 很难,github摆脱了未经身份验证的v2 API.推送到github和github之间也有时间脱节.那么你怎么知道你可以得到什么版本?
  4. 确定你是陈旧的,如何使页面无效并强制重新加载? 很难,window.location.reload(true)在Safari/Chrome中不起作用,例如......

所以它解决了这些步骤; 当然可能有另一种方式?

rsp*_*rsp 37

为了更好地控制网站的缓存,您可以使用HTML5缓存清单.看到:

您可以使用它window.applicationCache.swapCache()来更新网站的缓存版本,而无需手动重新加载页面.

这是来自HTML5 Rocks的代码示例,说明如何将用户更新到您网站的最新版本:

// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {

  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);

}, false);
Run Code Online (Sandbox Code Playgroud)

为了避免一些混淆,我将添加GitHub为cache.manifest文件设置正确的HTTP头:

Content-Type: text/cache-manifest
Cache-Control: max-age=0
Expires: [CURRENT TIME]
Run Code Online (Sandbox Code Playgroud)

所以你的浏览器知道它是一个缓存清单,应该始终检查新版本.

  • @IanKuca GitHub将缓存清单的Expires头设置为**当前时间**,更重要的是将Cache-Control设置为**max-age = 0**(max-age指令始终覆盖HTTP /中的Expires头) 1.1 - 参见RFC 2616)因此它在交付时已经过期.没有必要控制清单头,因为它们已经很好了,包括Content-Type:text/cache-manifest (5认同)
  • 哦,我的坏.我认为所有非HTML文件的标题都是相同的.那么剧本很好.抱歉. (3认同)
  • @IanKuca我很想听听**为什么**做OP想要做的事情是无用的,这是为了强制更新过时的网站.你是说[HTML5 Rocks](http://www.html5rocks.com/en/)的例子不起作用**尽管**与[规范]一致(http://www.whatwg.org /specs/web-apps/current-work/multipage/offline.html)**或**第6.7.4和6.7.5节中的规范应该理解为与我理解的不同?你没有回答. (2认同)
  • 对于像我一样在现代遇到过这个问题的人:这个 API 已被弃用。如果您尝试在 Chrome 中使用它,它会显示: > [Deprecation] 应用程序缓存 API 使用已被弃用,并将于 2020 年 4 月左右在 M82 中删除。有关更多信息,请参阅 https://www.chromestatus.com/features/6192449487634432细节。该网页将依次建议您: > 新的 Web 应用程序应围绕 Service Workers 构建。使用 AppCache 的现有应用程序应迁移到 Service Workers。 (2认同)