For*_*vin 12 javascript google-chrome-extension firefox-addon-webextensions
我在过去几周一直在编写一些浏览器扩展,直到今天我还认为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,出于隐私和安全原因,我无法安装它们.
官方承诺支持终于来了,并且已经在一些 API 上实现了。在撰写本文时:
在 GoogleChrome 的 Github 上,您已经可以找到使用 chrome.tabs API 和 Promises (await) 的 Hello world 示例:
chrome.runtime.onInstalled.addListener(async () => {
let url = chrome.runtime.getURL("hello.html");
let tab = await chrome.tabs.create({ url });
console.log(`Created tab ${tab.id}`);
});
Run Code Online (Sandbox Code Playgroud)
如您所见,promise 支持已经简单地在chrome对象上实现,现在它同时支持 Promise 和回调。Firefox 仍然使用该browser对象作为 promise API。
...直到今天,我认为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,它将来是否会支持它们?
正如评论中所提到的,Chrome会考虑基于Promise的API重写,但尚未完成任何可见的工作.但是,存在填充物,包括您提到的填充物.除了自己包装方法以创建自己的polyfill之外,没有其他解决方案.
除此之外,我没有Chrome或Chromium,出于隐私和安全原因,我无法安装它们.
那么你无论如何都无法正确测试你的端口; 这对潜在用户来说不是一个好方法.在这种情况下你最好不要移植.