将更新部署到 Web 应用程序的正确方法是什么?

What is the correct way to deploy updates to your Web Application?

我有一个可用的 Web 应用程序,它包含一个 index.html 文件、多个 html 页面、一个 js 文件和一些 css

这是一个全新的应用程序,正如预期的那样,在生产过程中存在一些小错误。

我的问题是:在我纠正错误并替换相关文件后,用户的浏览器很可能仍会加载替换文件的缓冲版本,因此不会 看到更正 那些用户。

我发现了一些关于使用版本标签的建议(类似于 ...?version=x.y...),但我不清楚如何使用它。

此外,如果我更改(例如)更新文件的名称(例如从 ABC_001.htmlABC_002.html),我还需要更改引用它的文件,这意味着我会还需要更改其版本,...并重复此操作直到应用程序的 bootstrap 点(即 index.html)。

新版本文件一部署就部署的标准方法是什么?

如果您要更改文件名,则需要在引用它们的所有地方进行更改。没有办法了。

为确保您的用户始终看到文件的更新版本,使用链接末尾的版本号是一种方法。另一种方法是您可以在 HTML 页面中使用元标记 header,如下所示:

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">

将此设置为 "no-cache" 可确保浏览器始终向服务器发送请求并且不会加载缓存的内容。

您可以对 .js 和 .css 文件使用版本号技术。

两个基本假设:

  1. 如果客户看到您网站的稍微过时的版本但仍然包含错误,这并不重要;毕竟,那个有问题的版本大概已经存在了几个 hours/days/weeks,再多几个小时也不会有太大的不同。
  2. 您想确保您的访客获得一致的版本;即,如果您更新了两个 Javascript 文件,并且文件 A 依赖于文件 B 中的修复,那么您要么希望访问者拥有这两个文件的旧版本,要么都拥有这两个文件的新版本,但不是新旧版本不兼容。

为确保第 2 点,您需要对文件进行版本控制,如您所示。简单地附加类似 foo.js?v=2 的东西会使 URL 不同,这会使浏览器认为它是一个不同的文件,并确保它从服务器获取它。 理想情况下 您的服务器实际上能够提供请求的版本;也就是说,如果浏览器请求 v=2 它实际上会收到文件的版本 2,v=3 将提供文件的版本 3 等。虽然实现起来可能相当复杂,但收效甚微。

所以你想要的是对你的资产进行自动版本控制。这意味着您要么拥有像 PHP 这样的服务器端语言,它在模板中包含所有 JS 文件并自动向它们添加 ...?v=...;或者您有一个 构建系统,它会在您将文件上传到服务器之前执行一次。有很多不同的方法可以做到这一点,具体建议有点超出这个答案的范围。

一旦你有了它,你就会遇到以下两种情况之一:

  1. 访问者正在从您的服务器获取您的最新 HTML 文件,该文件引用了它不知道的 Javascript 文件版本,这导致访问者获取最新的文件- 从您的服务器更新文件。正是你想要的。
  2. 一位访问者正在访问您的 HTML 文件的缓存版本,该版本引用了缓存中已有的 Javascript 文件版本,因此它 运行 完全是一个旧的缓存版本您网站的版本。再一次,请参见主要假设 #1,这并不是真正的问题。

不幸的是还有第三种情况:

  1. 一位访问者正在访问您的 HTML 文件的缓存版本,该版本引用了您的 Javascript 文件的过时版本,而浏览器 不会 发生这种情况不再在缓存中。如果您的服务器无法实际提供那些过时的文件,浏览器将获取最新的 Javascript 文件,您可能会遇到内部兼容性问题,因为某些内容不匹配。

同样,如果您的服务器具有版本控制的实际概念,则可以解决此问题,但实现起来可能相当复杂,对于这种不太可能的情况可能不值得。

避免这种情况的最实用方法是为您的 HTML 文件选择合理的缓存策略,这样缓存就不会过时太久,并且 window 出现这种不匹配的时间有可能被减少到尽可能短的时间。

基本上不需要自己对 HTML 文件进行版本控制。最重要的是它引用的 HTML + Javascript/CSS 资产是 一致的 ,要么都在同一个旧版本上,要么都在最新版本上。 HTML 本身的版本并不重要,只会影响您网站的最新显示程度,这是您必须通过合理的缓存策略进行控制的事情。

底线:资产的自动版本控制 + 引用 HTML 文件的合理较短的过期时间在实践中对 99% 的情况都有效。在不完全放弃缓存的情况下压缩剩余的 1% 可能会非常耗费工作。