背景:
我有一个单页 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 项目,但对于理解想法可能仍然有用。
你可以根据你的情况改变方法,比如:
- 在 localStorage 中存储客户端 Assets 每个版本都有校验和
- 每隔一段时间或经常请求服务器检测是否推出了新版本
- 如果有更新的版本,请求补丁并将其应用到 localStorage 中的 Assets ,检查校验和。 (在这里您可能希望将新版本的校验和与补丁一起发送,以便在应用后进行比较)。
关于javascript - 支持已失效的 javascript 部署后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280592/