4

背景:

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

问题:

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

可能的解决方案:

a)定期比较资产管道指纹,window.confirm 与重新加载请求是否不相同。

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

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

如果有人以前考虑过这个问题,我很感兴趣。如果您对此主题有任何想法,请告诉我。

4

2 回答 2

3

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

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

您可以根据自己的情况更改方法,并具有以下内容:

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

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

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

应用程序每隔一段时间就会对服务器执行 ping 操作以检查版本。如果版本更改,将出现“请重新加载页面”弹出窗口。(页面顶部的一个非侵入性小东西,非常明显且需要点击)。如果用户不重新加载,您可能会遇到错误,因此如果版本不匹配,我也会禁用错误报告。

此解决方案仅确保人们最终会切换到新版本,并且在用户切换时不会出现任何错误。它不会迁移旧会话或防止用户出错。

我不会做window.confirm的。意外的模态对话框非常烦人。如果您碰巧正在输入某些内容并按下[space-bar][enter]对话框消失而您错过了它。

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

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


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

于 2013-06-24T16:52:05.107 回答