【问题标题】:Detect application version change on a single page application检测单页应用程序上的应用程序版本更改
【发布时间】:2014-05-28 05:15:29
【问题描述】:

今天这里提出了一个问题,我没有明确的答案。

假设我们连接并缩小所有资源文件(CSS 和 Javascript)并在“母版页”中声明它们。

在多页面应用中,如果 CSS 文件发生更改,它将在下一次完整页面加载时重新加载。

在单页应用上,用户可以连续工作数天,而无需在声明 CSS 文件的主页上充值。在发出 Ctrl-F5 之前,用户永远不会看到更改。

我相信有人已经想到了这一点并且有经验可以分享:)

对我来说,使用 WebSockets 不是一种选择。首先是因为它太过分了,其次是因为并非我所有的客户都支持这项技术。同样的原因适用于所有 WebSockets 后备...因此我不会继续访问我的服务器。

那么,有什么想法吗? :)

顺便说一句,我们正在使用 AngularJS,如果这对特定的解决方案有帮助的话。

谢谢!

【问题讨论】:

    标签: javascript angularjs versioning single-page-application


    【解决方案1】:

    我也遇到了同样的问题。我的解决方案可能无法满足您的标准:

    当我打包我的前端应用程序和我的服务器应用程序时,我共享一个包含当前前端应用程序版本的配置文件。

    前端:我 75% 的路由更改隐式调用 Web 服务(路由更改解析)。所以每次我调用我的服务器时,我都会包含一个自定义 HTTP 标头(或 GET/POST 参数),其中包含前端应用程序的客户端版本。

    服务器端:我将前端应用程序版本(用户浏览器中的那个,在用户上次刷新/加载 SPA 时加载)与共享配置文件的前端应用程序版本进行比较:

    • 如果版本匹配:我什么都不做。
    • 如果版本不匹配,我会发送自定义 HTTP 状态错误代码(例如 418)

    然后是前端:我添加了一个响应拦截器,它拦截任何 418 错误代码并强制刷新整个应用程序

    就是这样。基本上,“检查”前端应用程序版本是否为最新的事件是路由更改(通过 ajax 调用 WS)。但是你可以添加一些无限的 $interval 每 5 分钟左右调用一个专用的 WS ...... 如果需要,我可以添加一些代码。

    希望这会有所帮助;)

    【讨论】:

    • 我最初的想法是反过来做,让后端发送版本并在客户端进行比较,但这两种方法都有一个共同的问题:我每个都有多个 RESTful 服务那些拥有独立版本并且对特定应用一无所知的人,因此他们永远无法验证这一点。尽管如此,在我写这篇文章的时候,我在想也许反向代理,也就是特定于应用程序的,可以完成这项工作......
    • infinite $timeout 转换为 WebSockets,或者更具体地说是 Longpolling 的后备,我不想为此使用它。这通常不足以证明不断访问服务器进行验证是合理的。
    • 是的,这里的选择取决于你的整个技术架构。顺便说一句,如果 websockets 是过度杀伤和太新,你可以看看 SSE(服务器发送事件:w3schools.com/html/html5_serversentevents.asp)这是方式例如,socket.io 更轻(它是单向服务器->客户端推送)
    • 是的,有一些 polyfills 可用,但与往常一样有或多或少的限制。你现在有所有可能的选择;)
    • 所以我们现在选择了一种简化的解决方案。由于我们有一个“代理服务”(现在再次)是唯一与此应用程序交互的服务,因此我们在所有响应的 http 标头中添加了应用程序版本。如果我们收到更新的版本,则会出现一个弹出窗口通知用户并发出整页刷新...此解决方案不适用于连接到多个服务的应用程序,我不完全同意它,但它适用于现在。
    【解决方案2】:

    假设你通过 $route 服务和提供者使用 AngularJS 的路由,那么如果有重大更改需要更改,你可以使用$routeChangeSuccess 事件来执行服务器请求;如果有,那么您可以执行 window.location.reload() 来刷新页面并获取所有更新的资源和 html。

    以下过程可以根据您想要的实现方式进行更改:

    1。在您的服务器中设置一个配置文件,指示应用程序的版本。您也可以选择为不同的文件分配不同的版本,但是由于您已经连接了所有资源文件,所以我猜您可能会在配置中限制您的版本选项。

    2。创建一个服务,其中包含所有必要信息(来自服务器的文件版本)和方法以向您的服务器执行服务器请求,以检查服务中存储的当前文件版本。

    3。使用$routeChangeSuccess 事件,使用您在步骤2 中创建的服务执行服务器请求,如果请求返回有效确认,表明有更改,则通过window.location.reload() 强制页面重新加载。

    【讨论】:

    • 谢谢伙计。我对 Bixi 的回答的最后回复解释了我们现在最终做了什么。
    【解决方案3】:

    我决定也在这里添加我的最终想法作为答案:

    我们现在寻求一种简化的解决方案。

    由于我们有一个“代理服务”(现在再次)是唯一与此应用程序交互的服务,因此我们在所有响应的 http 标头中添加了应用程序版本。如果我们收到更新的版本,则会出现一个弹出窗口通知用户并发出整页刷新...

    此解决方案不适用于没有自己的“私有”服务的应用程序。

    【讨论】:

    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2019-09-06
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多