Chrome 扩展程序更新流程

vla*_*mon 5 javascript google-chrome chromium google-chrome-extension

我从 chrome 扩展开发开始,并且在开发过程中对扩展安装/更新流程和测试有几个问题:

  1. 扩展更新后后台脚本会发生什么,chrome 是否执行后台脚本重新加载?
  2. 扩展更新后,内容脚本是否与后台脚本分离?
  3. 如果后台脚本中有一个 onInstalled 事件处理程序,那么当 chrome 更新扩展程序时该事件处理程序会发生什么(此事件处理程序是否已分离,更新完成后,附加新处理程序然后执行或执行其他一些流程)?
  4. 有没有办法在开发过程中模拟更新过程,以便调试更新过程中发生的事件,例如在某些本地服务器上托管扩展并从那里更新?
  5. 在哪里搜索有关此类和类似主题的文档,chromium 源代码是正确的地方还是至少是起点?

谢谢!

Xan*_*Xan 7

  1. 扩展更新后后台脚本会发生什么,Chrome 是否执行后台脚本重新加载?

该行为取决于您是否有注册chrome.runtime.onUpdateAvailable事件的处理程序,以及您的扩展程序是否具有持久的后台页面或事件页面。

  • 如果您有一个持久的背景页面:
    • 如果您处理此事件并调用chrome.runtime.reload(),则扩展将被卸载,然后在再次加载之前更新。
    • 如果您处理此事件并且不调用chrome.runtime.reload(),则更新将仅在下次重新加载扩展时应用 - 可能是下一次完整的浏览器重新启动。
    • 如果您根本不处理此事件,将立即卸载扩展以进行更新。
  • 如果您有一个非持久性事件页面:
    • 如果您处理此事件并调用chrome.runtime.reload(),则扩展会在再次加载之前更新。
    • 如果您不调用chrome.runtime.reload(),或者根本不处理该事件,Chrome 将在下一次卸载事件页面时更新扩展程序。

无论出于何种原因卸载后台页面后,都无法以编程方式阻止更新。

  1. 扩展更新后,内容脚本是否与后台脚本分离?

是的,而且不漂亮。当使用 Chrome API 给出不一致的错误(有些什么都不做,有些触发异常)时,它们进入“孤立”状态,但仍在运行——例如,任何 DOM 事件侦听器仍将触发。

因此,如果您希望内容脚本立即再次工作,您的工作是:

  • 在现有选项卡中以编程方式注入脚本,而不假设它之前没有执行:如有必要,请先清理。
  • 确保孤立副本停止执行:通过在旧副本中注意到它是孤立的,或者通过从新副本广播 DOM 事件。

关于 WebExtensions 的重要说明:与 Chrome 不同,Firefox总是在加载时将内容脚本重新注入与清单条目匹配的页面。请务必考虑到这一点。

有几个问题涵盖了这一点;例如:

  1. 如果onInstalled后台脚本中有一个事件处理程序,那么当 chrome 更新扩展程序时该事件处理程序会发生什么(这个事件处理程序是否分离,当更新完成时,新的处理程序被附加然后执行或其他一些流程被执行)?

由于更新只能在后台页面卸载时发生,所以没有复杂的逻辑;它只会在扩展程序的第一次加载时触发,然后使用details.reason == "update". 确保在脚本加载时同步注册处理程序(例如在顶级代码中),否则您可能会错过事件——通常这仅涉及事件页面,但我怀疑这在这里​​也很重要。

  1. 有没有办法在开发过程中模拟更新过程,以便调试更新过程中发生的事件,例如在某些本地服务器上托管扩展并从那里更新?

遗憾的是,据我所知,这不再可能,除非您可以使用Enterprise Policy install。最好的办法是在 CWS 中拥有一个作为私有发布的扩展。

在某种程度上,在对解压缩的扩展进行一些更改后按“重新加载”模拟更新期间发生的情况 -onInstalled事件除外。

  1. 在哪里搜索有关此类和类似主题的文档,chromium 源代码是正确的地方还是至少是起点?

嗯.. 对于详细问题,Chromium 代码当然是权威来源。您也应该搜索 StackOverflow,因为这里已经积累了大量知识。最后,官方文档提供了很多信息,即使不是很明显——例如chrome.runtimeAPI 文档


归档时间:

查看次数:

1120 次

最近记录:

9 年,1 月 前