Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
支持失效的javascript后期部署_Javascript_Deployment_Single Page Application - Fatal编程技术网

支持失效的javascript后期部署

支持失效的javascript后期部署,javascript,deployment,single-page-application,Javascript,Deployment,Single Page Application,背景: 我有一个单页JavaScript网站,每天至少部署一次用于生产。它获得了合理的流量,用户在其上停留了相当长的时间,直到他们签出并且JavaScript通过XHR与后端交互为止 问题: 部署后,浏览器中加载的JavaScript可能不再与后端兼容(本例中为Rails) 可能的解决方案: a)定期比较资产管道指纹,窗口。如果不相同,请使用重新加载请求确认 b)发送X-JS-fingerprint头和XHR请求,如果不兼容,返回409冲突,JavaScript将触发错误和窗口。确认重新加载 c

背景:

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

问题:

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

可能的解决方案:

a)定期比较资产管道指纹,窗口。如果不相同,请使用重新加载请求确认

b)发送X-JS-fingerprint头和XHR请求,如果不兼容,返回409冲突,JavaScript将触发错误和窗口。确认重新加载

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


我感兴趣的是,以前是否有人想过这个问题。如果你对这个问题有什么想法,请告诉我。

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

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

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

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

我不会打开
窗口。请确认
。意外的模态对话框非常烦人。如果您碰巧正在键入某个内容,然后按
[空格键]
[输入]
则对话框将消失,您将错过该对话框

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

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


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

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

还有一个后续想法是使用localStorage存储客户端代码库。再看一看它是一个节点项目,但可能仅仅对于获得想法仍然有用

您可以为您的案例更改方法,并有如下内容:

  • localStorage中的Store客户端资产对每个版本都有校验和
  • 现在或经常请求服务器检测是否推出了新版本
  • 如果有更新的版本,请请求修补程序并将其应用于localStorage中的资产,检查校验和。(在这里,您可能希望发送新版本的校验和以及修补程序,以便在应用后进行比较)
    您是否监控过重新加载(重新加载vs的用户没有重新加载)?您是否观察到任何用户沮丧(在显示通知后放弃等)?我目前没有监控任何与此功能相关的内容。我所做的应用程序没有产生任何统计意义的数量。我喜欢这种技术,我将研究在当前项目中实现它有多困难。谢谢。经过调查,我发现这里面有些东西。实现并不完全相同,因为我加载的是整个javascript,而不是增量。这对于过程方法非常有效,但是任何初始化的对象都会像以前一样保留在内存中,在我的例子中,几乎所有对象都是这样。尝试重新初始化所需的一切是有好处的,状态在history和document.location中处理。