【问题标题】:Correct method for ensuring users get the latest version of a website after an update确保用户在更新后获得最新版本网站的正确方法
【发布时间】:2019-02-12 12:49:09
【问题描述】:

每次我向我们的 Web 应用程序部署更新时,客户都会遇到问题,因为他们的浏览器没有发现 index.html 已更改,并且由于 .js 文件的名称已更改,因此他们会遇到错误。大概是因为他们的 index.html 仍然指向不再存在的旧 javascript 文件。

什么是确保用户在系统更新时始终获得最新版本的正确方法。

我们有一个 HTML5 + AngularJS 网络应用程序。它使用 WebPack 将供应商和应用程序 javascript 捆绑到两个 js 文件中。这些文件包含一个哈希名称,以确保它们在发布后是不同的。

其他一些信息

  • 我永远无法在本地复制此问题(我的意思是在调试中,在我们的暂存站点或生产站点上)
  • 我们使用 CloudFlare,但在发布后清除整个缓存
  • 我们在 JS 中有一种机制,可以检查页面加载或每 5 分钟检查一次我们的 API 版本是否已更改,如果是,则显示“请刷新您的浏览器”消息。单击此运行window.location.reload(true);
  • 我们的后端是 IIS

【问题讨论】:

  • 仅清除 CloudFlare 缓存并不能绕过浏览器缓存。使用页面规则禁用它,或者告诉您的客户在加载您的网站时使用 CTRL+Shift+R
  • 您可以尝试将时间戳附加到您的 javascript 文件中,这将导致浏览器始终获取最新版本,请查看 add a timestamp to javascript filename 了解更多信息
  • @vikscool - OP 已经在文件名中使用了哈希。问题是过时的index.html,而不是过时的 JavaScript 文件。

标签: javascript browser-cache devops


【解决方案1】:

如果您需要用户在更新文件后立即加载您的网站时选择最新的index.html,请将index.html 设为不可缓存。这意味着浏览器、CloudFlare 和任何中间代理都不允许缓存它,并且将始终从您的规范服务器提供一个文件。

当然,这会影响流量和延迟(对您和他们而言),但如果这确实是您的要求,我看不到任何其他选择。

在这方面有一些旋转。它可能不是index.html 本身不可缓存,如果index.html 非常大并且缓存它很重要,您可以插入另一个资源(一个写出正确script 标签的小JavaScript 文件),等等。但是,如果您需要立即获取更改,则需要一个不可缓存的资源来识别更改。

【讨论】:

  • 如果开发人员清楚 HTML 何时更改,CloudFlare 仍可以保留其缓存,只需在更改应该推出时清除它。
  • @LucaKiebel - 是的。需要阻止缓存的是浏览器(以及中间代理。浏览器和 CloudFlare,如果有的话)。
猜你喜欢
  • 2011-12-28
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多