gpt4 book ai didi

angular - Angular中SwUpdate.activateUpdate()的作用是什么?

转载 作者:行者123 更新时间:2023-12-03 16:45:43 25 4
gpt4 key购买 nike

Angular documentation提供了以下示例来激活软件更新:

constructor(updates: SwUpdate) {
updates.available.subscribe(event => {
if (promptUser(event)) {
updates.activateUpdate().then(() => document.location.reload());
}
});
}

根据我的观察,调用本身不足以激活新版本,需要重新加载。但是,即使没有 document.location.reload()调用, activateUpdate()也足够。
activateUpdate()调用的目的是什么?重新加载就足够了,为什么还要调用它呢?

最佳答案

Angular ServiceWorker幕后工作的一些背景知识:

  • 总是有一个SW版本,但是它可以有多个版本的应用程序。
  • 保留client IDs到应用程序版本的映射,因此它知道为每个客户端提供哪个版本。
  • 找到新版本时,它将下载并标记为最新版本。
  • 从那时起,将为新客户端(例如新标签)提供该最新版本,但现有客户端(标签)仍将获得其先前分配的版本。

  • 此行为与ServiceWorkers通常的工作方式略有不同。它旨在允许向新客户端提供最新版本,但又不会破坏现有客户端(通过向其提供新内容,而这些新内容并非旨在与他们已经使用的旧HTML/CSS/JS代码一起使用)。

    现在,回到 activeUpdate():
    这基本上告诉SW将最新版本分配给客户端。操作完成后,客户端的新请求将使用最新的应用程序版本进行处理。这是不安全的,因此建议重新加载页面以确保所有代码都来自新版本。

    只需重新加载就足够了吗?
    这基本上取决于浏览器在重新加载时如何分配 Client.id。如果浏览器在重新加载时为标签分配了新的ID,则SW仍将提供最新版本,因此 swUpdate.activeUpdate()是不必要的。另一方面,如果浏览器保留相同的客户端ID,则SW将提供不带有 swUpdate.activeUpdate()的旧版本。
    目前,Chrome似乎分配了一个新ID(因此,在重新加载之前不需要 activeUpdate())。我在 the SW spec中找不到结论性的内容,因此我不确定这是否符合规范以及所有浏览器是否都执行相同操作。
    (过去浏览器的行为过去也可能不同,因此必须添加 activeUpdate(),但此后规范/浏览器已进行了更新,如果您打算重新加载,则使其变得多余。)

    因此,如果您验证支持的浏览器在这方面的行为符合预期,则无需在重新加载之前调用 activeUpdate()
    请注意,文档示例只是可用API的简化图示。在实际的应用程序中,有几种处理更新的方法(取决于应用程序的要求)。
    例如,您可以:
  • 立即激活更新(如果您确定您的应用程序可以处理该更新),并且不重新加载。
  • 显示有关可用更新的通知,并让用户单击以重新加载(并由此更新)。
  • 让应用程序知道有可用的更新,并在下一次应用程序内导航时自动将其重新加载。 (这是我们在https://angular.io/ btw中所做的。)

  • 同样,并非所有策略都适用于所有类型的应用程序,因此请选择最适合您的策略。

    编辑:
    顺便说一句,如果您对如何改进文档有任何建议,请提出一个问题(或者最好还是提交拉取请求)!

    关于angular - Angular中SwUpdate.activateUpdate()的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55494181/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com