API 实现之间的差异

浏览器扩展 API 是一项新兴标准。因此,尽管它得到了大多数主流浏览器(包括 Firefox、Chrome、Edge 和 Opera)的支持,但各个实现之间存在差异。这意味着为了在多个浏览器上实现您的扩展,可能需要进行一些更改。

在支持扩展 API 的各种浏览器中,Firefox 对新兴标准的兼容性最好,因此,在开发浏览器扩展时,它是您开始的最佳选择。

浏览器 API 实现之间的差异包括四个方面:命名空间、异步事件处理、API 覆盖范围和 manifest 键。

命名空间

您使用命名空间引用所有扩展 API 函数。例如,browser.alarms.create({delayInMinutes}); 在 Firefox 中创建一个将在 delayInMinutes 指定的时间后触发的警报。

有两个 API 命名空间在使用中:

  • chrome 用于 Chrome、Edge 和 Opera。
  • browser 用于 Firefox 和 Safari。

异步事件处理

JavaScript 提供了几种处理异步事件的方法。提议的扩展 API 标准是使用 Promise。当处理链式异步事件调用时,Promise 方法具有显著优势。

Firefox 和 Safari 在扩展 API 中实现了 Promise。所有其他浏览器使用回调。在 Manifest V3 中,Chrome、Edge 和 Opera 为大多数适用方法提供了Promise。(参见 Chrome bug 328932

如果您不熟悉 JavaScript 如何处理异步事件或 Promise,请参阅了解异步 JavaScript:回调、Promise 和 Async/Await或 MDN 的使用 Promise页面。

API 覆盖范围

浏览器之间扩展 API 函数实现的差异大致分为三类:

  • 对整个函数缺乏支持。
  • 函数内对功能的支​​持存在差异。例如,在撰写本文时,Firefox 不支持notification函数方法 onButtonClicked,而 Firefox 是唯一支持 onShown 的浏览器。
  • 支持特定浏览器功能的专有函数。例如,在撰写本文时,容器是 Firefox 的特定功能,由 contextualIdentities 函数支持。

Manifest 键

支持的 manifest.json 在浏览器之间的差异大致分为两类:

  • 扩展信息属性。例如,在撰写本文时,Firefox 和 Opera 在(除 author 键之外)还包括 developer 键,用于记录有关扩展开发者的详细信息。
  • 扩展功能。例如,在撰写本文时,只有 Firefox 支持 protocol_handlers 键(该键用于注册基于 Web 的协议处理程序,即知道如何处理特定类型链接的应用程序)。

更多信息

您可以在以下位置找到有关支持的浏览器扩展 API 功能差异的更详细信息: