检测浏览器扩展程序是在 Chrome 还是 Firefox 上运行的最佳实践?

xmc*_*mcp 4 javascript firefox google-chrome google-chrome-extension firefox-addon-webextensions

我已经编写了一个 Chrome 扩展程序,我正在将它迁移到其他浏览器,如 Firefox 和 Edge。但是,与 Chrome 的 API 相比,Firefox 上的 WebExtensions API 有一些差异。

所以我必须检测我是否应该使用回调风格的 API(在 Chrome 中,以及在 Edge 中)或承诺风格的 API(在 Firefox 中)。

例如:

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
        ...
    });
Run Code Online (Sandbox Code Playgroud)

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

附:Edge 使用browser.*API,但它的 API 是回调式的。

Xan*_*Xan 5

截至目前,您可以依赖browserchrome

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

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

一方面,每次要调用 API 时都使用它会充满样板;您可以对其中之一进行 polyfill(例如webextension-polyfill用于进入browserChrome)并仅使用其中之一。

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

  • 您可能想提及 Firefox 本身支持使用 `chrome.*` 命名空间和回调。因此,Chrome 和 Firefox 之间最简单的代码兼容性就是在两者中都使用 `chrome.*`。如果*真的*想使用 Promises,你只需要使用 `browser.*` polyfill。 (3认同)