HTML5 - ApplicationCache不更新(仅)某些文件

时间:2017-07-07 15:38:01

标签: javascript html5 caching cache-manifest application-cache

我有一个使用AppCache将资源存储在浏览器缓存中的应用程序。我已经能够在PHP文件上设置清单,以便自动写入必须缓存(正确过滤)的所有文件。该文件的标题如下:

header('Content-Type: text/cache-manifest');
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

它被称为appcache.php,并且在我的HTML中正确引用了它:

<html manifest="appcache.php">

每次我更新清单时,应用检测到更新并正确触发事件,更新缓存并刷新页面以便重新加载。

然而,某些文件(主要是Javascript和CSS文件)无法正常刷新。有时它需要一些清单更新(整个过程),有时它只需要一个,有时它需要永远,我必须删除浏览器缓存或隐身模式

该应用会检测到更新,因此清单不会被捕获并且它会正确更新。问题是,即使文件再次下载,它们仍然以旧版本提供。主要问题是这只发生在一些文件中(有时它们是某些 css 文件,有时它们是 js ,依此类推:< strong>未更新的文件是随机的)。

实际上,我使用的是Chrome v59,在我的Android设备上使用Chrome v60时也是如此。

有没有解释为什么他们没有正确刷新?这是一个已知的错误?我有什么办法可以解决它吗?

更新

当我在他们之间完成一些短时间的更新时,似乎发生了最多的事情。在等待24小时后,它在第一次尝试时起作用。也许这可以帮助你猜出它为什么会发生。

谢谢。

1 个答案:

答案 0 :(得分:0)

您的清单文件可能会被缓存,您可以设置它的expires标头立即过期

我建议添加swapCache方法

$(function() {    
 if (window.applicationCache) {
        applicationCache.addEventListener('updateready', function() {        
     if (window.applicationCache.status == 
       window.applicationCache.UPDATEREADY) {
       window.applicationCache.swapCache();
       console.log("appcache updated");
       window.location.reload();
      }
     });
    }
  }

其他方面,要强制下载任何新的(或更改的)文件,您必须这样做  更新清单文件(看起来你正在这样做)。

最常见的一个是您可能没有使用正确的mime类型(text / cache-manifest)提供清单。

您可能会收到错误,检查错误的最简单方法是在Chrome中打开该页面,然后在AppCache下的控制台和资源标签中查看是否有错误(它会抱怨正在提供的文件)您也可以使用curl -I命令测试它:

curl -I $manifest_file_URL