javascript - 支持已失效的 javascript 部署后

标签 javascript deployment single-page-application

背景:

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

问题:

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

可能的解决方案:

a)定期比较asset pipeline指纹,不相同则window.confirm重新加载请求。

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

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

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

最佳答案

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

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

你可以根据你的情况改变方法,比如:

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

关于javascript - 支持已失效的 javascript 部署后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280592/

相关文章:

javascript - 在纯 JavaScript 中实现自动完成下拉列表

java - 使我的 Java 程序易于分发

vue.js - Vue SPA - PhantomJS 成功运行,但 Fetch As Google 显示空白

javascript - 使用 AngularJS 进行 SPA 设计 - 在一些但不是所有页面之间共享状态

javascript - 从模型外部更改变量的值

javascript - 点击时使用 Facebook Pixel 跟踪注册情况(JS/JQUERY 代码)

javascript - 使用函数参数查找和对象键值对?

c# - WCF 中 MSI 包的自动更新

deployment - Maven:防止上传默认 jar - 只上传 jar-with-dependencies

html - 单页应用程序 (SPA) 中的命名 anchor