Chrome插件开发基础
介绍
简单来说,Chrome 插件是用来增强浏览器或页面功能的程序。我们可以用它来实现「文章预计阅读时间」、「页面一键暗黑模式」、「Chrome Tab 分组管理」等功能。开发 Chrome 插件主要用到的技术是 HTML、CSS 和 JavaScript ,对 Web 开发人员来说非常友好。
文档链接:
Welcome to Chrome Extensions - Chrome Developers
核心项目结构
1 | . |
manifest.json
这个文件必须存在于 Chrome 插件中,而且得放在项目根目录,用途是配置所有和插件相关的配置。其中,manifest_version
、name
、version
是必不可少的配置字段,description
和 icons
是推荐配置的字段。
1 | { |
文档链接:
Content Scripts
虽然叫做 Content Scripts ,但它并不限于 JS ,也可以包含 CSS 。我们可以通过在 manifest.json 中配置的方式,把 JS、CSS 注入到页面中去。
1 | { |
⚠️ 注意
如果没有配置 run_at
为 document_start
,下面这种代码是不会生效的:
1 | document.addEventListener('DOMContentLoaded', function() { |
文档链接:
Chrome extensions content scripts
Background
插件在后台运行的 js 代码,一般把「需要一直运行的」、「启动就运行的」、「全局的」代码放在 background 里面。
1 | { |
Popup
popup
是点击插件图标时打开的一个弹窗页面,一般用来做一些临时性的交互或插件本身的配置。
1 | { |
Background Script 和 Content Scripts 区别
background script
是一旦插件被安装就常驻后台运行的,background 的权限非常高,几乎可以调用所有的 Chrome 扩展 API(除了 devtools)content scripts
是指定匹配的模式后,当用户访问被匹配的URL时,对应的 js 脚本会注入到页面然后自动运行,从而有能力对页面 DOM 进行操作,或者通过 API 和background page
进行通信。它可以调用部分API:chrome.i18n(国际化)
、chrome.storage(存储)
、chrome.runtime(运行时,部分可调用)
。
通信
摘自:https://juejin.cn/post/6844903985711677453#heading-4
popup 和 background 之间的通信
首先,给一个大致通信图。关于 content script
、popup script
、background script
,它们之间的通信总体概览图如下:
开始吧。还是和以前一样,新建插件文件夹,增加必须的 manifest.json
和基本文件。
background
给 popup
发送消息
插件的 background
,对于浏览器只存在一个,而对于 popup
,不同的 tab 就会存在一个前端,如果 background
需要给不同前端发送信息,就需要特殊的tab id。这里是针对 background
给 popup
传递信息。
background.js
添加代码:
1 | function toPopup() { |
popup.js
添加代码:
1 | const bg = chrome.extension.getBackgroundPage() |
在 popup.html
引入 popup.js
,并添加id为 rBgInfo
的按钮,安装插件,点击按钮,如果弹窗如下样式,则表明成功。
popup
给 background
发送消息
background => popup
是通过 getBackgroundPage
,而 popup => background
是通过 getViews
。
下面就来瞧一下
使用长连接
在 popup.js
增加如下代码:
1 | // 使用长连接 |
在 background.js
增加如下代码:
1 | // 获取所有 tab |
点击插件刷新按钮,点击【背景页】按钮,可以看到每次点击一下插件图标,就会发送一次信息。
这也告诉了 chrome 插件的另一个机制:点击图标出现和隐藏 popup
弹窗页面,实际上是对整个页面的销毁,类似于关闭网页,而不是切换网页。(很重要的哦)
操作 DOM
除了信息传递, background
可能也需要对 popup.html
的页面进行操作,比如检测到当前是万圣节🎃,给插件页面添加个 happy halloween
。
首先给 popup.html
增加一个text
1 | <p id="pbText">不是万圣节</p> |
然后只需要在 background.js
中如下处理:
1 | // 使用长连接 - 监听 popup 传递来的消息 |
添加 getAll()
函数,将函数防止长连接即可。这里主要想展示 chrome.extension.getViews
函数的使用。
刷新插件,点击插件图标,就会弹窗如下页面了:
popup
和 content
之间的通信
有了 background
和 popup
,下面需要做的就是创建一个 content
页面。
manifest
添加下列配置
1 | { |
content
给 popup
发送消息
首先在 content.js
添加如下代码:
1 | // Chrome提供的大部分API是不支持在content_scripts中运行 |
代码负责发送信息和接收反馈,然后给 popup.js
添加:
1 | chrome.runtime.onMessage.addListener((req,sender, sendResponse) => { |
代码负责接收消息和发送反馈。
刷新插件,点击插件按钮,打开一个页面,保持插件 popup
处于活跃状态(上面讲了哈~,插件关闭等于页面销毁),然后刷新页面,会发现浏览器弹出弹窗:
最后,右键插件图标,点击“审查弹窗内容”,可以看到 content.js
和 popup.js
的 console.log
日志(👻这等于告诉您如何调试插件~)
弹窗说明我们的程序是成功运行的,日志打印表明我们的通信是成功的,现在我们已经知道了 content
给 popup
发送消息。
popup
给 content
发送消息
其实上面已经告诉了 popup
给 content
发送信息了,但毕竟不是 popup
主动地,谈恋爱了,肯定需要主动一些了。
给 popup
添加如下代码,放入 rBgInfo
按钮点击事件:
1 |
|
寄送一封信,content
得接收信:
1 | // get popup2content info |
点击插件刷新按钮,打开页面,点击弹窗的 rBgInfo
按钮,日志打印如下:
关于 popup
给 content
的通信又又又成功了~
background
和 content
之间的通信
background
和 content
之间的通信与 popup
和 content
类似的,写者就不写demo了,与上面一样。
长连接与短连接
在上面的一些demo中,可以看到通信使用了两个函数,一个就是 sendMessage
,另一个就是 connect
,其实这两个分别对应着不同的连接方式:
- 长连接:
chrome.tabs.connect
和chrome.runtime.connect
- 短连接:
chrome.tabs.sendMessage
本地开发查看插件开发效果
在开发人员模式下加载未打包的插件:
- 地址栏输入
chrome://extensions
打开新 tab 进入插件管理页面- 或者单击“扩展”菜单拼图按钮,然后在菜单底部选择“管理扩展程序”。
- 通过单击页面右侧「开发者模式」旁边的切换开关来启用开发人员模式。
- 单击“加载已解压的扩展程序”按钮,然后选择插件目录。