移植有道云笔记扩展程序到Firefox

最近尝试迁移到Firefox,有很多Chrome没有的玩意,除了极个别扩展程序不能使用,总体体验较好

使用

地址在这里,下载安装就好了

https://addons.mozilla.org/zh-CN/firefox/addon/%E4%BF%9D%E5%AD%98%E7%BD%91%E9%A1%B5%E5%88%B0%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0/

代码开源在 https://github.com/ttttmr/YoudaoNote-FirefoxAddons,欢迎提issues和pr

开发之路

在移植开发的过程中的一点笔记吧

我不太熟悉前端,JavaScript一通乱写,也没开发过浏览器扩展,以至于之前的坑还没有填

下载

第一步当然是下一个Chrome版扩展了,官方下不到可以去这里下 https://chrome-extension-downloader.com/

还有一个办法是安装好了之后找到本地路径

开发者模式,复制对于扩展的ID,然后用Everthing搜一下就出来了

文档学习

目标是开发Firefox扩展,当然是先去看文档了 https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions

先了解整体结构,从Getting_started的例子入手

manifest.json

撸完Getting_started大概就有概念了,对照下好的Chrome的扩展把manifest.json改好

把对应的值复制一下,加点描述就基本上完事了

JavaScript APIs

两个浏览器扩展不兼容的根本原因就是API不一样,所以主要工作就是把原本调Chrome的API改成Firefox能用的

比如Chrome里很多都是chrome.开头,查看文档Firefox里对应改成browser.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
chrome.contextMenus.create({
title: chrome.i18n.getMessage('pageMenu'),
contexts: ['page'],
onclick: function(info, tab) {
count = 0;
startClip(tab.id, 'm_clipperPage');
}
});

chrome.contextMenus.create({
title: chrome.i18n.getMessage('selectionMenu'),
contexts: ['selection'],
onclick: function(info, tab) {
count = 0;
startClip(tab.id, 'm_clipperSelection');
}
});

就这样查文档,然后替换关键字,会发现有很多Chrome的API不被支持,需要用另外一个实现,这时就需要注意它们调用方式是否一致,参数,返回值等等,做对应的更改

比如chrome.extension.sendRequest不支持需要用runtime.sendMessage

坑点

有那么一个函数,它们名字一模一样,我就没注意,直接替换关键字,然后debug发现有问题…

tabs.executeScript,函数名一模一样,Chrome多了一个callback,而Firefox没有…

https://developer.chrome.com/extensions/tabs#method-executeScript

https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript

然后有道云笔记里用到了callback…

callback很常见其他地方我也用过,看了Firefox里的感觉很有意思,它提供了匿名函数的返回值,叫Promise,然后用then调用

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

这样似乎是比callback要好,可以实现不即时调用,到需要的再用then调用,当然牺牲了一些存储空间

想想这和直接返回值有什么区别,都可以实现不即时调用,或许是更方便吧

总之折腾了一晚上还算是能用了

已知问题

选择图文混合无法右键保存(单文字或图片没问题)..

经常会出现“抱歉,由于页面设置,页面抓取失败!”..

嗯,以上都是有道的锅