承诺支持Chrome扩展程序API?

问题描述 投票:12回答:3

我在过去几周一直在编写一些浏览器扩展,直到今天我还认为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,出于隐私和安全原因,我无法安装它们。

javascript google-chrome-extension firefox-webextensions
3个回答
5
投票

...直到今天,我认为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,出于隐私和安全原因,我无法安装它们。

那么你无论如何都无法正确测试你的端口;这对潜在用户来说不是一个好方法。在这种情况下你最好不要移植。


2
投票

我没有看过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。


1
投票

我创建了这个库https://github.com/lawlietmester/webextension来做这个没有像webextension-polyfill那样的一般规则。

我的库是crossbrowser方式制作一个Browser对象而无需修改原始的chrome /浏览器。就像过去的jQuery一样。

仅使用它一次 - 在后台进程中导入它并使其为后台全局,然后对于其他导入(例如从弹出窗口)使用导入

( typeof browser === 'undefined' ? chrome : browser ).extension.getBackgroundPage().Browser

© www.soinside.com 2019 - 2024. All rights reserved.