Chrome Extension
缘由
鉴于经常使用Chrome浏览器,一些用着比较顺手的 Chrome扩展
对于提高生活幸福效率有着很大好处。随即翻阅了下关于 Chrome扩展
开发相关的资料。随即整理如下;
Chrome Extensions developer - API文档
简要说明
Chrome扩展
是一个用Web技术开发、用来增强浏览器功能的软件,一个由HTML、CSS、JS、images等资源组成后经编译发包的一个 **.crx
后缀的压缩包。扩展可以定制爬虫、屏蔽广告、网页实时数据、修改http(s)请求头等等。可以根据自己的需求定制满足自己功能的扩展(Extension)。
Chrome://命令
直接在
Chrome
地址栏输入回车
chrome://命令 | 描述 |
---|---|
chrome://about |
查看所有chrome:// 列表 |
chrome://extensions |
显示扩展 |
chrome://settings |
设置 |
chrome://version |
显示当前版本 |
chrome://history |
历史记录 |
chrome://downloads |
下载文件 |
chrome://newtab |
创建新标签 |
chrome://bookmarks |
收藏的标签 |
chrome://apps |
应用操作界面 |
chrome://components |
组件信息 |
chrome://net-internals |
网络事件信息 |
chrome://memory-redirect |
内存使用的统计信息 |
chrome://dns |
显示主机名列表、DNS 状态 |
chrome://devices |
连接的设备 |
chrome://flags |
实验项目,加“#项目名称”锚点可以直接定位到项目 |
chrome://translate-internals |
内置翻译功能页面 |
chrome://quit |
退出浏览器 |
chrome://restart |
重启浏览器 |
扩展结构
配置文件 - manifest.json
扩展必须有
manifest.json
文件,文件基本如下,
官方模板 manifest.json。
1 | { |
配置字段说明
browser_action
-
如果
browser action
设置了default_popup
,popup 可以包含任意你想要的HTML内容,并且会自适应大小。popup 会在用户点击图标后出现。若没有设置default_popup,将执行chrome.browserAction.onClicked
的内容,若没有设置,就什么都不执行了。 -
和
browser_action
对应的还有一个page_action
,区别在于:browser_action
对在浏览器中加载的所有网页都生效;page_action
针对特定的网页生效。一个Extension
最多可以有一个browser_action
或page_action
。
background
-
background
是插件的运行环境。若设置了scripts
字段,浏览器的扩展系统会自动根据scripts字段指定的所有js文件自动生成背景页。也可使用page
字段指定背景页,**二者只能设置一个**
。 -
一般情况下,会将扩展的主要逻辑都放在
background
中比较便于管理。其它页面可以通过消息传递的机制与background
进行通讯。理论上content scripts
与 popup 之间也可以传递消息,但不建议这么做。
content-scripts
content-scripts
是Chrome扩展向页面注入脚本的一种形式(可包含css文件),借助content-scripts
可实现通过配置的方式轻松向指定页面注入JS、CSS
(如需要动态注入,可以参考下文),最常见的比如:广告屏蔽、页面CSS定制,等等。
1 | "content_scripts": [{ //对页面内容进行操作的脚本 |
桌面通知
Chrome提供了一个 chrome.notifications
API以便插件推送桌面通知
1 | chrome.notifications.create(null, { |
消息通信
普通的消息传递
通过runtime
的onMessage
、sendMessage
等方法,可以在各个JS之间传递并监听消息。
在popup.js中,我们让它初始化之后发送一个消息:
1 | chrome.runtime.sendMessage({ |
然后在background.js中,监听消息的接收,并进行处理:
1 | chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { |
chrome.runtime
的常用方法:
1 | // 获取当前扩展程序中正在运行的后台网页的 JavaScript window 对象 |
需要注意的是,即便你在多个JS中注册了消息监听onMessage.addListener
,也只有一个监听者能收到通过runtime.sendMessage
发送出去的消息。如果需要不同的监听者分别监听消息,则需要使用chrome.tab
API来指定消息接收对象
长、短连接
Chrome插件中有2种通信方式:
短连接(chrome.tabs.sendMessage
、chrome.runtime.sendMessage
)
通过chrome.runtime.connect
(或者chrome.tabs.connect
)可以建立起不同类型JS之间的长链接。
长连接:
popup.js 信息的发送者需要制定独特的信息类型,发送并监听信息:
1 | var port = chrome.runtime.connect({type: "connection"}); |
content-script.js 而接受者则要注册监听,并判断消息的类型:
1 | // 监听长连接 |
chrome.tabs
要使用这个API则需要先在manifest.json
中注册:
1 | "permissions": [ |
1 | // 获取到当前的Tab |
例子 在background.js中,我们获取到当前Tab,并发送消息:
1 | chrome.tabs.getCurrent(function(tab) { |
然后在content_scripts中,进行消息监听:
1 | chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { |
chrome.storage
chrome.storage
是一个基于localStorage
的本地储存,但chrome对其进行了IO的优化,可以储存对象形式的数据,也不会因为浏览器完全关闭而清空。
使用这个API需要先在manifest.json
中注册:
1 | "permissions": [ |
chrome.storage
有两种形式,chrome.storage.sync
和 chrome.storage.local
:
1 | // 数据储存 |
例如 在browser_action
完成了用户的登录/注册操作,将部分用户信息储存在storage中。每次初始化时,都会检查是否有储存,没有的话则需要用户登录,成功后再添加:
1 | // browser_action |
而在其他环境的JS里,我们可以监听storage的变化:
1 | // background |
注意:
- chrome不允许扩展中的HTML页面内直接内嵌js脚本,而要求所有的脚本都作为外部src来引入
- json 文件不允许有注释
正式发布
如何成为一名Chrome应用开发者
Google Chrome 应用商店上传扩展程序
参考
了解以上东西就可以自己整理一个 Chrome扩展,若要深入功能丰富的 extension,便需要参考官网文档(Chrome暂时需要梯子)
参考链接:
- Chrome扩展官网
- Chrome插件(扩展)开发全攻略
- Chrome 扩展开发——编写一个自己的浏览器插件
- 谷歌(Chrome)浏览器插件开发教程
- 从零开始写一个 Chrome 扩展
- Chrome扩展程序开发
感谢以上老师整理的文章。
一些插件网址
字数统计插件
此仅为整理个人笔记,以作备忘,不做商用,请知悉,谢谢。
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!