当我们部署新版本的应用程序时,我们的用户可能仍在使用可能导致错误的旧前端Java脚本代码。
我们的应用是一个单页应用,所以人们不会刷新很多,用户有时会暂时搁置一下。因此,每当我们推送新代码时,这个问题都很容易发生。
我们在想可能会弹出一个带有刷新按钮的弹出按钮,这会强制他们重新加载前端缓存代码。
你如何正常触发?我有很多方法可以做到这一点,但也许有一种标准的方法可以做到这一点?
答案 0 :(得分:1)
你实际上有两个独立的问题。
通常,您希望使用版本化的API。每个API请求都应以某种方式指示请求对应的版本。这通常在请求的路径中完成,这使得到不同的API服务器的路由非常容易。例如:
http://api.example.com/1.0/foo/bar
您的网络服务器可以在/1.0/
上匹配,并路由到您的API的相应应用服务器。
这为您提供了一些灵活性,允许滚动发布过程,并且不会强制客户端每次发布时都重新加载。 (你有一天可能希望每天发布50次,而你的客户对此感到非常高兴。除非你有特殊的理由,否则不需要强制重新加载。)
最简单的方法是尽可能向后兼容新版API。但是,确实会发生变化。发生这种情况时,请同时运行两个API服务器实例。如果您有一个主要的基础数据结构更改,或者其他一些阻止此操作的巨大更改,您将需要在启动新版本的同时停止旧版本,并强制重新加载。
您必须根据自己的应用和业务条件决定每次发布时是否需要重新加载。同样,你有一天可能想要在一天内发布50个版本,其中大部分都是针对大多数客户永远不会看到的小问题。让用户知道新版本可用并让他们在需要时重新加载是很常见的。如果绝对必要,您可以随时强制重新加载(由于严重的安全问题或重大突破性更改)。
有关如何执行此操作的具体信息取决于您,但一种简单的方法是使用基本JSON文件,指示最新版本:
{
"apiVersion": "1.0.5"
"appVersion": "1.1.352"
}
更具创造性的是,您可以让此文件指示是否需要杀死特定版本,从而强制重新加载。
答案 1 :(得分:0)
我会将?<version>
添加到脚本的src。
<script src="myFile.js?1"></script>
例如,您可以使用代码推送更改此版本,因此客户端因为查询字符串而被迫采用新版本。
答案 2 :(得分:0)
您可以使用Web Worker定期ping服务器以获取新的代码更改或版本号(例如来自数据库)并强制刷新(如果有新内容的话)。这将为您提供更多的按需可能性,而不是仅使用say setTimeout
。
答案 3 :(得分:0)
这是semver真正派上用场的情况。您希望拥有一个更新客户端代码的自动化流程。要确保更新兼容,您应该确保有一种方法可以比较新旧代码的版本字符串,并确定它是否是“主要”更新。对于“次要”或“补丁”更新,您可以即时更新。但是对于重大更新,在帮助用户保存他们的工作之后强制完全重新加载是明智的。
就实时更新的过程而言,您可以使用AMD模块之类的东西。您将使模块缓存失效,下载新代码并重新初始化系统的相关部分(由新代码执行)。
还有一个问题是知道什么时候有更新。我建议为此查看Server Sent Events。但是,如果您需要Internet Explorer支持,则可能需要使用基于setTimeout的轮询机制或类似方法。