在用户不刷新时更新 Web 应用程序

Updating web applications when users don't refresh

本文关键字:更新 Web 应用程序 刷新 用户      更新时间:2023-09-26

在我的工作中,我为Web应用程序编写代码,因此新代码将相对频繁地推送到服务器。但是,我们遇到了一个问题,该应用程序的某些用户倾向于一次在浏览器窗口中将其打开长达几天。然后他们遇到这个问题,其中:

  1. 他们将数据输入到上周仍在其计算机上运行的应用程序中。
  2. 他们
  3. 尝试保存他们的数据,这有时不起作用,因为服务器上的代码比本地机器上的代码更新(即,他们客户端上的JavaScript发送的数据与服务器上的新代码所期望的不同)。
  4. 他们不能简单地刷新页面来重新下载已更改的 JavaScript 代码,否则他们会丢失数据。

处理这种情况的正确方法是什么?我当然想到了显而易见的解决方案,比如告诉这些用户不要这样做,或者永远不要更改我的 AJAX API,这样请求就不会失败,但我希望有更好的方法来解决这个问题。

特别是,我们的环境由服务器上的PHP,客户端上的JavaScript和用于管理源代码的git组成。我并不特别担心支持旧版本的IE等(至少关于这个问题)。

过去,

我通过不断轮询脚本来解决此问题,该脚本在服务器上轮询revision.txt或类似内容,该脚本中有一个版本号,该版本号在每次部署时都会递增。

当版本更改时,我要么弹出一条消息,显示他们需要刷新/禁用 UI 或强制刷新它们(这通常很恶心,可能会让他们生气)。

像这个概念:

var createVersionChecker = function(seconds) {
  var version = null;
  var checkVersion = function() {
    $.get('/version.txt', function(response) {
      if(version == null) {
        version = response;
        return;
      }
      if(version != response) {
        // do some logic to show the user that they need to refresh
        // or force refresh them.. ick!
      }
    });
  };
  setInterval(checkVersion, seconds * 1000);
};
createVersionChecker(60);

我会尽量减少从客户端传递到服务器的数据中的重大更改。现在,我并不是说你不能对 API 进行更改;只是所做的任何更改通常都应该与以前的版本向后兼容。通常,这意味着如果 API 端点采用某些参数并且您想要更改它们,如果可能的话,您应该

  1. 忽略你不关心的参数(当你删除了一个必要的参数,但旧的客户端仍在结束它);和
  2. 为未提供的数据提供合理的默认值(用于添加参数时)。

类似的事情也适用于从服务器发回的数据:客户端应该忽略它无法识别的内容,并在没有得到预期的东西时应用合理的默认值。这本质上就是稳健性原则:"在发送的内容中要保守,在接受的内容上要自由。

当然,这不是一个光滑的解决方案,但如果做得好,它可以很好地工作并使您的软件更加健壮。

虽然不能替代适当的健壮性,但您可能还需要考虑提供一些version标签以及所有响应。如果用户刚刚保存完一些数据(因此可以安全地刷新),并且收到的version与客户端脚本中嵌入的version不同,则刷新页面并非不合理。但这并不能替代稳健性。