Javascript 检测浏览器扩展是否在Chrome或Firefox上运行的最佳实践是什么?
我已经编写了一个Chrome扩展,我正在将它迁移到其他浏览器,如Firefox和Edge。然而,Firefox上的WebExtensions API与Chrome的API有一些不同 因此,我必须检测是否应该使用回调风格的API(在Chrome和Edge中)或promise风格的API(在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
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中使用aliaschrome=browser
。但是,我没有在Edge中进行过广泛的测试,因为我所做的测试(年初)表明扩展支持对于合理的开发来说太不稳定(即,这是一个后遗症,我没有令人信服的商业理由)。这个答案不再适用,因为Edge现在共享Chrome API:
function getBrowser() {
if (typeof chrome !== "undefined") {
if (typeof browser !== "undefined") {
return "Firefox";
} else {
return "Chrome";
}
} else {
return "Edge";
}
}