当前位置: 首页 > 知识库问答 >
问题:

promise支持Chrome扩展API?

庄实
2023-03-14

在过去的几周里,我一直在编写一些浏览器扩展,直到今天,我认为Firefox的WebExtension应该在Chrome中自动运行。所以我试着根据Mozilla的示例编写代码。
但是今天我意识到在Chrome扩展的API文档中没有提到承诺。
我在所有扩展的代码中都严格地使用了承诺。

所以现在我的问题是,我的代码能在Chrome中工作吗?或者,如果我在顶部添加一个var browser=Chrome声明,它会起作用吗?
或者,Chrome根本不支持API上的承诺吗?
如果Chrome还不支持API函数上的承诺,它将来会支持吗?

注意,我知道这个项目:https://github.com/mozilla/webextension-polyfill
,但我不愿意在任何地方都包含这个库。还有,它里面有烦人的bug。

此外,我没有铬或铬,我不能安装他们的隐私和安全原因。

编辑:他们终于开始实施对承诺的支持。

共有2个答案

丁毅庵
2023-03-14

我还没有看过browserAPI,所以我可能有点离谱,但如果唯一的区别是Firefox API返回承诺而不是使用回调,chrome-promise库可能会有所帮助。它将所有需要回调的API调用包装在返回承诺的函数中。

然后可以在Chrome中执行以下操作:

var browser = new ChromePromise(); 

然后打承诺电话:

browser.storage.local.get(null).then(data => console.log(data));

如果您将browser变量定义为全局变量,并在其他脚本之前包含该脚本,那么您就可以将其作为全局变量使用,而不必将polyfill包含在您想要使用它的每个文件中。

编辑:chrome-promise的作者不再对其进行维护,只是修复了bug。他们在这里列出了一些备选库,包括OP拒绝的Mozilla webextension-polyfill。该库的自述文件解释了如何在需要它的各种扩展上下文中使它作为全局变量可用。

柴霖
2023-03-14

…直到今天,我还认为Firefox的WebExtension应该在Chrome中自动运行。

WebExtensions创建时考虑到了与Chrome扩展的向后兼容性。chrome.*命名空间可用于受支持的API。这里的目标是简化将现有扩展移植到FF以快速引导生态系统。

但是,Mozilla忽略了与browser.*命名空间的向前兼容性。Mozilla决定使用基于Promission的API方法,但只针对新的名称空间。

所以现在我的问题是,我的代码在Chrome中能工作吗?
或者如果我在顶部添加一个var browser=chrome声明,它能工作吗?

否;他们的行为不同,签名也不同。Chrome将拒绝不需要显式回调的调用。浏览器.*变体将发出一个承诺。

还是Chrome根本就不支持API上的承诺?
如果Chrome还不支持API函数上的承诺,将来还会支持吗?

正如评论中提到的,基于承诺的API重写是Chrome考虑的,但没有做任何可见的工作。但是,也有聚填料的存在,包括你提到的那一种。除了自己包装方法来创建自己的polyfill之外,没有其他的解决方案。

此外,我没有铬或铬,我不能安装他们的隐私和安全原因。

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

 类似资料:
  • Electron 支持 Chrome 扩展API的子集, 主要是支持 DevTools 扩展和 Chromium-internal 扩展,但它同时也支持一些其他扩展能。 注意:Electron 不支持商店中的任意 Chrome 扩展,Electron 项目的目标不是与 Chrome 的扩展实现完全兼容。 加载扩展 Electron 只支持加载未打包的扩展 (即不能使用 .crx 文件)。 插件会被

  • 谷歌Chrome扩展支持Chrome的Web语音语音识别API吗?我已经包含了一些javascript来创建一个语音识别对象,但是当我启动我的扩展时,没有提示我进行麦克风访问。 这不是我的代码的问题。我在谷歌上搜索过,但是我找不到任何关于Chrome扩展是否支持Web语音API的信息。我只想要一个是/不是的答案。 注意:我相信WebSpeech API对本地文件不起作用。

  • 我正在尝试做的是创建一个chrome扩展,创建新的,嵌套的,书签文件夹,使用承诺。 执行此操作的函数是chrome.bookmarks.create()。但是我不能只循环这个函数,因为chrome.bookmarks.create是异步的。我需要等待,直到文件夹创建,并获得它的新ID,然后继续它的子级。 承诺似乎是要走的路。不幸的是,我找不到一个使用异步调用和自己的回调(如chrome.bookm

  • 我可以创建一个插件或扩展的谷歌Chrome移动(Android谷歌Chrome)? 如果没有,我可以为谷歌Chrome(桌面)创建一个扩展,它将在谷歌Chrome栏中添加一个按钮。此按钮将在另一个web浏览器中打开页面(在我自己的web浏览器中),因此,此按钮应该启动我自己的web浏览器。

  • 包含 RTL 文件 如需启用 RTL 功能,则要包含 'easyui-rtl.css' 和 'easyui-rtl.js' 文件。 <link rel="stylesheet" type="text/css" href="themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="easyui-rtl.cs

  • 一个轻量级的缓存实现,目前已支持 Redis Memcache Memcached File 四种储存模式 仓库地址: Github 安装 composer require easyswoole/cache 注意: 请确保框架已经引入了 composer 的 autoload.php 文件,否则报类不存在的错误 快速入门 如果不做任何设置,默认使用File驱动,开箱即用 use easySwool