有没有一种方法可以将Chrome扩展移植到其他浏览器?

20

有没有一种方法可以将Chrome扩展程序移植到其他浏览器,而不必完全重写代码? 我的Chrome扩展程序使用browser_action命令在扩展窗口中打开“popup.html”...

更新:我找到了adblockforchrome port.js,发现它对于移植到Safari只有些许帮助...

4个回答

5

苹果公司提供了一些指导,介绍如何将Chrome扩展程序转换为Safari,但你会遇到的问题是每个浏览器对扩展程序允许的功能集不同。即使是从Chrome转换到Safari,你在Chrome中可以做的事情,在Safari中也许无法实现,反之亦然。


4
这取决于扩展类型,但并不完全如此。为了更清楚地回答你的问题,你需要说明你的扩展是关于什么的:修改某些页面(如用户脚本/用户样式),扩展浏览器功能或其他内容。
然而,有一些可移植性注意事项可以帮助你简化此过程:
1. 不要编写特定于浏览器的代码。在一些现代浏览器中,你可以使用HTML5功能,如Web SQL数据库API。例如,在IE上模拟这种行为很困难。 2. 保持你的JavaScript模块化;不要使用供应商特定的JavaScript方法,这样你的代码将是可移植的,并且不会依赖于TraceMonkey或V8; 3. 将HTML与CSS和Javascript分离,不要使你的代码变得混乱和复杂。

2
为什么要关心IE的兼容性?它不支持扩展。 - serg

4

有点晚了,但还是想提供帮助。

我们公司 - Slice Factory(在此完全公开!)提供浏览器扩展转换服务:http://gallery.extensionfactory.com/labs/conversion/。 在大多数情况下,您的Chrome扩展程序将在Firefox和Safari中无缝运行。

该服务仍处于测试阶段,Firefox转换效果比Safari好。 我不能完全透露我们的技术解决方案,但作为SO答案,我可以添加一些细节:我们重新开发了一个完整的Javascript API堆栈,模仿了大多数Chrome扩展API,用于Safari和Firefox;在Firefox中,我们基于JetChrome进行工作。此外,我们还有包装器,重新打包Chrome扩展程序,添加我们的库并重写清单等。

除此之外,这主要是一些好主意、试错和大量的开发时间。

例如: Safari 5.1刚刚引入了与Chrome的browser_action对应的弹出窗口,但我们已经有了适用于以前版本的替代解决方案。Firefox不支持HTML5 WebSQL,但我们有一个API可供使用。我们还提供了一种将Web应用程序带到FF的方法,很快也会带到Safari。 目标是以Chrome API为参考,在所有其他浏览器上模仿它。

不想推销我们的解决方案,但我可以补充一点:在Safari和Firefox上完全覆盖Chrome API的时间可能不值得 - 除非您计划转换多个扩展程序。因此,对于仅一个或两个扩展程序,我建议尽可能使您的代码模块化,并创建三个扩展程序 - 或尝试我们的服务!


哦,还有针对IE的网页片段。我们将它们用作我们另一个产品的“代理” :) - Stefano
1
@Stefano,你的Chrome转换器真是太棒了!你写道:“哦,对于IE,有webslices。我们将它们用作我们另一个产品的“代理”。那么这个IE解决方案在哪里呢?我有一个想要移植到IE的Chrome扩展程序。 - Ofir Hadad
@ofear 谢谢!很抱歉,我们的网页切片解决方案尚未自动化,因此我们无法轻松地提供它。网页切片的交互性非常有限,因此它不是一个好的整体解决方案,并且通常需要使用不同的方法重新编写大部分扩展程序。IE10和Win8可能会改变这一点,我们认为我们的努力应该更好地针对更可持续的解决方案,因此我们正在进行研究。对于IE 8/9,存在一些ActiveX包装器解决方案,但我们不提供该解决方案。 - Stefano
@Stefano 我尝试了你的服务多次,但我总是得到一个504网关超时错误(已经持续好几天了)。 - Kristijan
@Kristijan,我已经转向其他项目了,公司现在专注于其他产品;但你可以尝试直接在这里询问:http://builder.extensionfactory.com/crm/request_create。否则,自那以后出现了其他解决方案 - 尽管大多数需要一些代码修改,据我所知... - Stefano
显示剩余4条评论

0

是的,使用webextension-polyfill的Webextension API可以实现。

我利用它构建了this,在其中只需将回调方法更改为Promises并使用browser.something而不是chrome.something来调用浏览器API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接