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 功能差异的更详细信息: