chrome插件本质是提供特殊功能的web页面,可以使用浏览器提供给web页面的所有功能,也能使用浏览器专属的API。前端工程师只需要了解chrome插件的组成、不同模块之间的通信方式、常见API的使用就可以轻松实现各种工具。
本次分享主要介绍chrome插件的组成、不同模块之间的通信,再完成一个小插件。
logout
新建manifest.json
{
"manifest_version": 2,
"name": "淘宝退出",
"description": "添加淘宝退出按钮到浏览器窗口,方便测试",
"version": "1.0",
"browser_action": {
"default_icon": {
"19": "images/icon19.png",
"38": "images/icon38.png"
}
},
"background": {
"scripts": ["js/logout.js"],
"persistent": false
},
"permissions": ["<all_urls>"]
}
创建js/logout.js
chrome.browserAction.onClicked.addListener(function () {
var xhr = new XMLHttpRequest();
xhr.open('get', 'http://login.taobao.com/member/logout.jhtml');
xhr.send(null);
});
创建项目所需的png文件
chrome://extensions/
-》 勾选开发者模式 -》加载已解压的扩展程序 -》选择logout文件夹manifest.json
: 插件功能, 权限, 基本信息的配置, 前往Manifest File Format查看详细介绍chrome插件可以通过以下UI与用户进行交互:
browser actions: 出现在地址栏右边工具栏的icon, 包含可选的icon, tooltip, badge, popup, 在所有页面都会展示, 通常用来实现大部分页面需要的功能.
下图是一个带icon和popup的browser action, 点击icon弹出popup
page actions: 出现在地址栏内靠右的icon, 包含可选的icon, tooltip, popup, 只展现在少数页面, 通常用来实现特殊页面所需的功能. 一个插件不能同时拥有page action和browser action
根据功能和上下文将页面分为一下几类
window.open()
打开插件中的html文件content script: 用于操作当前加载的页面, 不能直接操作插件的其他页面. content script只能通过发送消息和插件进行交互(后续会介绍).
chrome.*
APIDevTools page: DevTool窗口打开的时候会创建DevTools page,窗口关闭时销毁。它和content script一样只能使用少数API,可以使用DevTool的特殊API。和content script一样使用消息发送与background page通信。
插件内部的页面之间可以直接访问对方的方法和DOM, 使用chrome.extension.getViews()获取所有页面window的数组,chrome.extension.getBackgroundPage()获取background page的window
获取目标页面的window之后就可以直接访问对应page进行操不推荐
和content script一样使用消息发送
参考Message Passing: content script和UI页面通过消息发送进行通信。chrome支持以下几种通信方式:
简单的一次性消息发送:可以使用runtime.sendMessage()或者tabs.sendMessage()在content script和插件之间发送消息,同时支持回调
从content script发送一个请求:
chrome.runtime.sendMessage({
type: 'GET_INTERVAL'
}, function (newInterval) {
interval = newInterval
console.log(interval)
})
从插件向content script发送请求:
chrome.tabs.query({currentWindow: true}, function (tabs) {
if (tabs) {
tabs.forEach(tab => {
chrome.tabs.sendMessage(tab.id, {
type: 'STOP_COUNTDOWN'
})
})
}
})
插件和content script监听事件的方式都一样:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
var origin = sender.tab ? 'content script' : 'extension'
console.log(`content script收到来自${origin}的消息:${request.type}`)
if (request.type === 'STOP_COUNTDOWN') {
isRunning = false
}
})
插件可以使用chrome.storage或者web storage API将数据保存到本地, 也可以发送到服务器保存.