一小部分用户正在加载使用了几天的HTML?

时间:2018-06-20 08:58:09

标签: html browser-cache cache-control offline-caching

我们有一个拥有+50.000有效用户的页面。有时,当我们进行更新时同时更改后端和前端时,我们会看到一小部分似乎加载了旧HTML的人出现JavaScript错误。 (它找不到对象X,因为我们从后端的JSON中删除了它)。

我们至少在Android和IOS设备中都见证了这一点,但在台式机浏览器中也见证了这一点。

这可能是更改代码后的几天。

我觉得这与书签或真正的旧标签页有一定关系。

  • 这是一个常见的众所周知的问题吗?
  • 这种旧的HTML加载可能是什么原因?
  • 有什么要反对的吗?

我认为我们的用户并没有真正感到消极的事情(也许是一个预加载,他们甚至没有看到它),但是它却制造了很多噪音,掩盖了我们可能遇到的实际问题。

以下页面之一的示例:https://poules.com/en/pools/aaygun96-wk-poule/world-cup-2018/ranking

3 个答案:

答案 0 :(得分:5)

这实际上是缓存的常见问题。因此,您可以采取一些措施来避免或减少问题。

  1. 在文件名中添加哈希-缓存清除«这对资产特别有用»。
    如果您在构建链中使用了webpack,gulp或grunt之类的东西,这很容易。这意味着您所有的javascript,css或其他文件都应在名称上嵌入一个随机密钥,例如bundle-21mn3j32j2.js 这将确保它们将是全新的负载。

  2. 就像添加哈希(有时效果不佳)一样,在URL处向此文件添加版本-添加查询字符串
    在这种情况下,您将添加类似myscript.js?v = 26062018的内容«实际上您经常会看到这一点。» 这里有一篇不错的文章,why not to use it
    还有关于Why and How to Use Cache Busting

  3. 使用服务器上的缓存配置,用于文件。
    在这种情况下,请配置文件的响应标头«“这特别适用于index.html之类的初始文件,在其中您将无法添加哈希”。
    使用Etags Cache-ControlHere more之类的配置。
    是的,这取决于服务器,因此我将为主要的«apache,nginx和IIS»添加url。 Etags的使用非常有趣,因为它告诉浏览器文件何时更改。

现在,我的建议以及我正在做什么。制作一个小的index.html文件,并将其移出缓存,或者对该文件使用非常好的Etag配置,使用webpack(其他方法之一)对所有依赖项使用哈希缓存无效化,针对图像,音频,等

请记住,从缓存中删除的所有内容都会增加带宽消耗,缓存中的所有内容都可以节省带宽并提高速度。

最后一个建议,使用cloudflare.com,可以轻松进行所有这些微调,甚至更多。

阅读:
-Related to Webpack, cache and filename hashing
-Cache Busting Front-end Resources: Is File Name Revving Still Necessary? -Cache-control

关于服务器上的缓存:
-Apachehere
-Nginxhere
-ISS

希望对您有帮助。

答案 1 :(得分:2)

看看您的页面代码,这是服务器响应标头为我提供的HTML文档:

Cache-Control: private, no-transform, s-maxage=0

打破现状:

私有意味着只有我的机器可以缓存它,没有代理服务器。

不进行转换意味着代理应该保留内容类型,编码和范围标头。

s-maxage表示将响应视为新鲜的秒数。它的优先级高于max-age,但实际上,s-maxage仅是公共(即代理)缓存的指令,而私有缓存只会忽略它。尝试使用最大年龄。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

答案 2 :(得分:1)

miknik对发生的事情做出了很好的回答。我希望我能更多投票。

除了缓存清除之外,我还想添加一个额外的选项来处理这种情况,因为我认为这种情况在许多情况下都是过度使用和欠佳的。


首先,“过期”缓存非常常见。几乎计算机中的所有东西都有某种缓存方案,通常是多层缓存。

我建议使用适合您API的版本。客户端将发送其版本  到中央端点和/或请求版本端点。该API可以根据版本执行以下两项操作之一:

  1. 返回客户希望在该版本上获得的所有数据(至少在删除的数据中有意义)
  2. 返回标准错误,指出“抱歉,您太过时了,必须进行更新才能继续”

这将使人们可以尽可能长地使用其缓存版本,从而减少了负载并提高了性能和用户体验。这样还可以避免所有这些无关紧要的错误的发生,因为版本调整会适当处理它。

最终,用户的缓存将过期,并且他们将与您保持最新。或最终,您将向他们发送该错误消息,然后他们将刷新其页面/清除cookie /所有内容以进行自我更新。