支持失效的javascript后部署



背景:

我有一个单页JavaScript网站,每天至少部署一次。它获得了合理的流量,用户在它上停留了相当长的时间,直到他们结账,JavaScript通过XHR与后端交互。

问题:

部署后,浏览器中加载的JavaScript可能不再与后端兼容(本例中为Rails)。

可能的解决方案:

a)定期比较资产管道指纹,window.conf与重新加载请求(如果不相同)。

b)发送带有XHR请求的X-JS-fingerprint标头,如果它不兼容,则返回409冲突,JavaScript将触发错误并重新加载window.conf。

c)运行两个后端;一个使用新的JS和新的后端代码(SERVER-1)立即部署,另一个仍然支持旧的JavaScript XHR请求格式。与b)类似,X-JS-fingerprint标头将被发送,但它将向SERVER-2发送307临时重定向以完成请求,而不是409。一旦旧会话全部清除,SERVER-2就会部署并关闭,直到再次需要为止。

我很感兴趣以前有没有人想过这个问题。如果你对这个问题有任何想法,请告诉我。

曾经在谷歌中为类似的用例创建了一个可区分的项目。它背后的基本思想与您的变体a有些相似。唯一的区别是,当客户端检测到服务器更新时,它会自动更新客户端代码库,并且不会加载所有资源,而是加载不同的补丁并将其应用于客户端。这听起来可能有点疯狂,但从性能的角度来看,这实际上是有道理的。

还有一个后续的想法,它使用localStorage来存储客户端代码库。还可以看看https://github.com/plotnikoff/connect-diffable这是一个Node项目,但可能仍然对获得想法有用。

你可以根据你的情况改变方法,并有这样的东西:

  1. 将客户端资产存储在本地存储中每个版本都有校验和
  2. 每隔一段时间或经常请求服务器检测是否推出了新版本
  3. 如果有更新的版本,请请求修补程序并将其应用于localStorage中的资产,检查校验和。(在这里,您可能需要将新版本的校验和与补丁一起发送,以便在应用后进行比较)

我也遇到过这个问题。我的解决方案非常简单,并没有真正为用户避免错误。它类似于您的解决方案a

我保留了一个版本号,就像指纹一样(所有文件都是指纹,CSS/JS)。部署过程会自动递增版本号。即使我只更改了一行CSS,版本号也会增加。我不区分主要的或次要的版本更改,这只是语义。

应用程序每隔一段时间就会对服务器进行ping以检查版本。如果版本发生变化,将出现"请重新加载页面"弹出窗口。(页面顶部的一个非侵入性的小东西,非常明显,需要点击)。如果用户不重新加载,你可能会遇到错误,所以如果版本不匹配,我也会禁用错误报告。

此解决方案只能确保最终用户将切换到新版本,并且在用户切换时不会出现任何错误。它对迁移旧会话或防止用户出现错误没有任何作用。

我不会做window.confirm。意外的模态对话框非常令人讨厌。如果你碰巧在键入什么,然后按[space-bar][enter],对话框就会消失,你错过了

解决方案b可能看起来不错,但也有另一面。您可以更早地检测到版本不匹配,但这也可能意味着您的用户会看到更多错误。如果只有一小部分网站受到更新的影响,任何XHR请求都将失败,即使它不需要失败。这是需要考虑的。

解决方案c对用户来说非常好,但可能会让升级变得一团糟。如果您的数据库模型发生了更改,该怎么办?旧服务器将无法正确处理数据,查询将失败等。


我喜欢a解决方案,因为它非常简单,如果您经常更新许多小更改,每次更新的影响都很小。

最新更新