支持已解散的javascript post部署

时间:2013-06-24 16:39:54

标签: javascript deployment single-page-application

背景

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

问题:

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

可能的解决方案:

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

还有一个继承的想法,它使用localStorage来存储客户端代码库。另请参阅https://github.com/plotnikoff/connect-diffable这是一个Node项目,但仍然可能只是为了获得这个想法。

你可以改变你的方法,并有类似的东西:

  1. 在localStorage中存储客户端资产包含每个版本的校验和
  2. 现在或经常请求服务器检测新版本是否已推出
  3. 如果有更新版本,请求补丁并将其应用于localStorage中的资产,请检查校验和。 (在这里,您可能希望发送新版本的校验和以及补丁,以便在应用后进行比较)。

答案 1 :(得分:2)

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

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

应用程序经常对服务器进行ping操作以检查版本。如果版本更改“请重新加载页面”将出现弹出窗口。 (页面顶部的非侵入式小 thingie 非常明显且需要点击)。 如果用户没有重新加载,则可能会遇到错误,因此如果版本不匹配,我也会禁用错误报告。

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

我不会window.confirm。意外的模态对话框非常令人讨厌。如果您正在键入内容并按[space-bar][enter],则对话框会消失,您错过了。

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

解决方案 c 对用户来说非常好,但可能会升级地狱。如果数据库模型发生变化怎么办旧服务器无法正确操作数据,查询将失败等。


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