在 Chrome 或 Firefox 上检测浏览器扩展是否为 运行 的最佳实践?

The best practice to detect whether a browser extension is running on Chrome or Firefox?

我写了一个 Chrome 扩展,我正在将它迁移到其他浏览器,如 Firefox 和 Edge。但是,与 Chrome 的 API.

相比,Firefox 上的 WebExtensions API 有一些差异

所以我必须检测是否应该使用回调式 APIs(在 Chrome 中,以及在 Edge 中)还是 promise 式 APIs(在火狐)。

例如:

if(RUNNING_ON_CHROME)
    chrome.permissions.request({
        permissions: ...,
        origins: ...,
    }, function(result) { // callback-style
        ...
    });
else // running on firefox
    browser.permissions.request({
        permissions: ...,
        origins: ...,
    }).then(function(result) { // promise-style
        ...
    });

我想知道如何执行 RUNNING_ON_CHROME 测试。我应该检查UserAgent中的相关字符串,还是检查browser!==undefined?

ps。 Edge 使用 browser.* APIs 但其 API 是回调样式。

截至目前,您可以依赖 browserchrome:

(自从切换到基于 Chromium 的引擎后不再用于检测 Edge)

function getBrowser() {
  if (typeof chrome !== "undefined") {
    if (typeof browser !== "undefined") {
      return "Firefox";
    } else {
      return "Chrome";
    }
  } else {
    return "Edge";
  }
}

一方面,每次调用 API 时都使用它会充满样板;您可以填充其中之一(例如,使用 webextension-polyfill 在 Chrome 中获取 browser)并且只使用一个。

另一方面,在实现上存在真正的差异(即使您获得相同的签名),因此您将需要上述浏览器检测来分离一些逻辑。