By quguoliang {.text-intro}
# Chrome扩展开发 {.text-landing} ::: {.aligncenter}什么是Chrome扩展
-
Chrome扩展是一个用Web技术开发、用来增强浏览器功能的软件,它其实就是一个由HTML、CSS、JS、图片等资源组成的一个.crx后缀的压缩包.
-
Chrome 扩展还可以在 360 极速浏览器、360 安全浏览器、搜狗浏览器、QQ 浏览器等浏览器运行;除此之外,Firefox 浏览器也对 Chrome 插件的运行提供了一定的支持
开发与调试
Chrome插件没有严格的项目结构要求,只要保证本目录有一个manifest.json即可,也不需要专门的IDE,普通的web开发工具即可。
从右上角菜单->更多工具->扩展程序可以进入 插件管理页面,也可以直接在地址栏输入 chrome://extensions 访问。
核心介绍
manifest 配置
这是一个Chrome插件最重要也是必不可少的文件,用来配置所有和插件相关的配置,必须放在根目录。其中,manifest_version、name、version三个是必不可少的,description和icons是推荐填写的。
-
browser_action:右上角指示图标配置
-
background:后台常驻页面,权限高
-
chrome_url_overrides:将 Chrome 默认的一些特定页面替换掉,改为使用扩展提供的页面
-
manifest.json 完整配置项地址
:::
content-scripts
content-scripts是Chrome插件中向页面注入脚本的一种形式,也可以通过该配置传递css样式,常见广告屏蔽、页面CSS定制等
{
// 需要直接注入页面的JS
"content_scripts":
[
{
//"matches": ["http://*/*", "https://*/*"],
// "<all_urls>" 表示匹配所有地址
"matches": ["<all_urls>"],
// 多个JS按顺序注入
"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
// JS的注入可以随便一点,但是CSS的注意就要千万小心了,因为一不小心就可能影响全局样式
"css": ["css/custom.css"],
// 代码注入的时间,可选值: "document_start", "document_end", or "document_idle",最后一个表示页面空闲时,默认document_idle
"run_at": "document_start"
}
],
}
:::
#### background
background配置的是一个常驻的页面,它的生命周期是插件中所有类型页面中最长的,它随着浏览器的打开而打开,随着浏览器的关闭而关闭,所以通常把需要一直运行的、启动就运行的、全局的代码放在background里面。
background的权限非常高,几乎可以调用所有的Chrome扩展API(除了devtools),而且它可以无限制跨域,也就是可以跨域访问任何网站而无需要求对方设置CORS。
{
// 会一直常驻的后台JS或后台页面
"background":
{
// 2种指定方式,如果指定JS,那么会自动生成一个背景页
"page": "background.html"
//"scripts": ["js/background.js"]
},
}
:::
popup
popup是点击browser_action或者page_action图标时打开的一个小窗口网页,焦点离开网页就立即关闭,一般用来做一些临时性的交互。
- popup可以包含任意的HTML内容,并且会自适应大小。
- 通过default_popup字段来指定popup页面,也可以调用setPopup()方法。
- 声明周期短,长时间运行代码尽量不要放在其中
{
"browser_action":
{
"default_icon": "img/icon.png",
// 图标悬停时的标题,可选
"default_title": "这是一个示例Chrome插件",
"default_popup": "popup.html"
}
}
chrome提供的Api
- 书签控制(bookmarks)
- 浏览历史控制(history)
- 窗口控制(tabs)
- 标签控制(tabs)
- 网络请求控制,各类事件监听(Event)
- 自定义原生菜单(contextMenus)
- 桌面通知(notifications)
- 完善的通信机制
- ...
通信相关
其他
本地存储
建议用chrome.storage而不是普通的localStorage
- chrome.storage是针对插件全局的,即使你在background中保存的数据,在content-script也能获取到;
- chrome.storage.sync可以跟随当前登录用户自动同步,这台电脑修改的设置会自动同步到其它电脑,很方便,如果没有登录或者未联网则先保存到本地,等登录了再同步至网络;
webRequest
通过webRequest系列API可以对HTTP请求进行修改、定制
//manifest.json
{
// 权限申请
"permissions":
[
"webRequest", // web请求
"webRequestBlocking", // 阻塞式web请求
"storage", // 插件本地存储
"http://*/*", // 可以通过executeScript或者insertCSS访问的网站
"https://*/*" // 可以通过executeScript或者insertCSS访问的网站
],
}
// background.js
// 是否显示图片
var showImage;
chrome.storage.sync.get({showImage: true}, function(items) {
showImage = items.showImage;
});
// web请求监听,最后一个参数表示阻塞式,需单独声明权限:webRequestBlocking
chrome.webRequest.onBeforeRequest.addListener(details => {
// cancel 表示取消本次请求
if(!showImage && details.type == 'image') return {cancel: true};
// 简单的音视频检测
// 大部分网站视频的type并不是media,且视频做了防下载处理,所以这里仅仅是为了演示效果,无实际意义
if(details.type == 'media') {
chrome.notifications.create(null, {
type: 'basic',
iconUrl: 'img/icon.png',
title: '检测到音视频',
message: '音视频地址:' + details.url,
});
}
}, {urls: ["<all_urls>"]}, ["blocking"]);
:::