我在过去几周一直在编写一些浏览器扩展,直到今天我还认为Firefox的WebExtension应该在Chrome中自动运行。所以我试着根据Mozilla的例子编写我的代码。 但是今天我意识到Chrome扩展程序的API文档中没有提到Promises。 我在所有扩展程序的代码中都严格使用了Promise。
所以现在我的问题是,我的代码会在Chrome中运行吗?或者,如果我在顶部添加var browser = chrome
声明,它会起作用吗?
或者Chrome根本不支持API上的Promise?
如果Chrome尚未支持API函数的Promises,它将来是否会支持它们?
注意,我知道这个项目:https://github.com/mozilla/webextension-polyfill 但我不愿意经历在任何地方包括该图书馆的麻烦。此外,它有令人讨厌的错误。
除此之外,我没有Chrome或Chromium,出于隐私和安全原因,我无法安装它们。
...直到今天,我认为Firefox的WebExtension应该在Chrome中自动运行。
创建WebExtensions时考虑到了与Chrome扩展的向后兼容性。 chrome.*
命名空间可用于支持的API。这里的目标是简化现有的FF扩展,以快速引导生态系统。
但是,Mozilla无视与browser.*
名称空间的向前兼容性。 Mozilla决定采用基于承诺的API方法,但仅适用于新的命名空间。
所以现在我的问题是,我的代码会在Chrome中运行吗? 或者,如果我在顶部添加
var browser = chrome
声明,它会起作用吗?
没有;他们的行为不同,并有不同的签名。 Chrome会在没有必要的显式回调的情况下拒绝来电。 browser.*
变体将发出一个Promise。
或者Chrome根本不支持API上的Promise? 如果Chrome尚未支持API函数的Promises,它将来是否会支持它们?
正如评论中提到的,基于Promise的API is considered by Chrome的重写,但没有做过明显的工作。但是,存在polyfill,包括the one you mentioned。除了自己包装方法以创建自己的polyfill之外,没有其他解决方案。
除此之外,我没有Chrome或Chromium,出于隐私和安全原因,我无法安装它们。
那么你无论如何都无法正确测试你的端口;这对潜在用户来说不是一个好方法。在这种情况下你最好不要移植。
我没有看过browser
API,所以我可能会偏离基础,但如果唯一的区别是Firefox API返回promises而不是使用回调,那么chrome-promise库可能会有所帮助。它包含所有需要在返回promises的函数中进行回调的API调用。
然后,您可以在Chrome中执行以下操作:
var browser = new ChromePromise();
然后做出承诺电话:
browser.storage.local.get(null).then(data => console.log(data));
编辑:除了修复错误之外,chrome-promise
的作者不再维护它。他们列出了一些替代库here,包括被OP拒绝的Mozilla polyfill。
我创建了这个库https://github.com/lawlietmester/webextension来做这个没有像webextension-polyfill那样的一般规则。
我的库是crossbrowser方式制作一个Browser
对象而无需修改原始的chrome /浏览器。就像过去的jQuery一样。
仅使用它一次 - 在后台进程中导入它并使其为后台全局,然后对于其他导入(例如从弹出窗口)使用导入
( typeof browser === 'undefined' ? chrome : browser ).extension.getBackgroundPage().Browser