chrome扩展开发

388 阅读4分钟

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可以跟随当前登录用户自动同步,这台电脑修改的设置会自动同步到其它电脑,很方便,如果没有登录或者未联网则先保存到本地,等登录了再同步至网络;
```html // 读取数据,第一个参数是指定要读取的key以及设置默认值 chrome.storage.sync.get({color: 'red', age: 18}, function(items) { console.log(items.color, items.age); }); // 保存数据 chrome.storage.sync.set({color: 'blue'}, function() { console.log('保存成功!'); }); ```

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"]);

:::


Thanks

文章参考:www.cnblogs.com/liuxianan/p…