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

Javascript 检测浏览器扩展是否在Chrome或Firefox上运行的最佳实践是什么?,javascript,google-chrome,firefox,google-chrome-extension,firefox-addon-webextensions,Javascript,Google Chrome,Firefox,Google Chrome Extension,Firefox Addon Webextensions,我已经编写了一个Chrome扩展,我正在将它迁移到其他浏览器,如Firefox和Edge。然而,Firefox上的WebExtensions API与Chrome的API有一些不同 因此,我必须检测是否应该使用回调风格的API(在Chrome和Edge中)或promise风格的API(在Firefox中) 例如: if(RUNNING_ON_CHROME) chrome.permissions.request({ permissions: ..., ori

我已经编写了一个Chrome扩展,我正在将它迁移到其他浏览器,如Firefox和Edge。然而,Firefox上的WebExtensions API与Chrome的API有一些不同

因此,我必须检测是否应该使用回调风格的API(在Chrome和Edge中)或promise风格的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
        ...
    });
我想知道如何在CHROME上运行测试。我应该检查UserAgent中的相关字符串,还是检查
browser==未定义的


ps.Edge使用
浏览器。*
API,但其API是回调样式。

从现在起,您可以依赖
浏览器
浏览器

(切换到铬基发动机后,不再用于检测边缘)

一方面,每次你想调用API的时候都使用它,这将是一大堆样板文件;您可以多填充其中一个(例如,在Chrome中使用以获取
浏览器
),并且只使用一个


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

最佳实践可能会因个人而异。您是否可以执行类似于
browser=browser | | chrome
?@freginold No,因为他们有不同的签名。不过Mozilla维护了一个polyfill。@freginold他们的API有些不同。就像我问题中的代码一样,Chrome使用回调,Firefox使用Promise。Mozilla确实有一个,但它对于我的扩展来说太重了。@xmcp定义为“太重”。毕竟,您没有通过网络加载脚本,因此大小的影响较小。您可能需要提到Firefox本机支持使用
chrome.*
名称空间和回调。因此,Chrome和Firefox之间最简单的代码兼容性就是在两者中都使用
Chrome.*
。如果你真的想使用Promissions,你只需要使用
浏览器。*
polyfill。@问题中明确提到Makyen Edge。但是,在Edge中,他们还是使用回调。因此,您通常可以在Edge中使用alias
chrome=browser
。但是,我没有在Edge中进行过广泛的测试,因为我所做的测试(年初)表明扩展支持对于合理的开发来说太不稳定(即,这是一个后遗症,我没有令人信服的商业理由)。这个答案不再适用,因为Edge现在共享Chrome API:
function getBrowser() {
  if (typeof chrome !== "undefined") {
    if (typeof browser !== "undefined") {
      return "Firefox";
    } else {
      return "Chrome";
    }
  } else {
    return "Edge";
  }
}