这篇文章可以学到什么:
1.Chrome 插件 Demo 的极速开发:从零基础开始,轻松搭建插件的基础框架,让你迅速体验 Chrome 插件的开发流程,带你开启一场高效的开发之旅。
2.Chrome 插件开发中的通信架构初体验:对 Chrome 插件开发里的通信架构有一个简明扼要的认识,掌握不同组件(如 popup 页面、content 脚本和 background 脚本)之间是如何实现信息交互的,为你深入理解插件的工作原理奠定基础。
3.基础的 manifest.json 文件配置知识:掌握 manifest.json 文件的基本配置,包括其主要元素的配置方法及作用,让你学会如何利用它来定义和定制你的 Chrome 插件,使其具备所需的各种功能。
4.插件调试实用技巧:当开发过程中遭遇问题时,能够熟练运用调试技巧,了解如何针对不同的脚本文件(如 content.js、background.js 和 popup.js)进行有效调试,迅速定位并解决问题,让你的开发过程更加顺畅。
前言:
由于作者自己也是第一次接触chrome插件开发,作者写这篇文章的目的一方面是想记录自己在探索 Chrome 插件开发过程中的学习轨迹,另一方面,也想把自己在开发过程中所积累的一些思考和实践经验分享给大家。
本文会比较基础,大佬们请跳过,但本专栏后续文章会逐步深入、层层递进,希望能跟大家一起成长。
一、什么是chrome插件?
先介绍几个大名鼎鼎的插件,无需过多文字解释,一看就知道什么是chrome插件😁
一、Tampermonkey油猴脚本扩展 通过它可以给浏览器安装各种各样的用户脚本,神器不解释!
二、uBlock Origin Lite最佳浏览器广告拦截扩展,功能全面、效果一流,而且资源占用极低。
Chrome插件是指可以在谷歌浏览器中运行的扩展程序,可以为用户提供额外的功能和定制化的体验。用户可以通过安装不同的插件在浏览器中添加新的功能、修改现有功能或者与网页进行交互。
二、如何快速开发一个简单的Chrome插件
如何快速开发一个简单的Chrome插件,旨在了解开发流程、调试流程、简单的配置文件。而不是快速开发一个功能齐全的Chrome插件(如果觉得有点基础,求大佬们轻喷)💦
介绍
chrome 插件通常由以下几部分组成:
对应的代码目录结构如下。现在,请创建工作目录及相应文件,即便文件内容暂时为空也没关系,后续我们会将其补充完整。
每个文件的用途如下,可参考下面的表格,等你把 Demo 运行起来后,再回头来看,或许会有更深刻的理解:
| 文件 | 文件作用 |
|---|---|
| background.js | 用于执行后台任务,在扩展程序的整个生命周期中持续运行。持续运行在后台,即使popup关闭也在工作,可以用来记录用户的偏好,下次使用可直接采用偏好设置 |
| content.js | 包含可以注入到网页中的脚本,可与网页的 DOM 进行交互。 |
| popup.html | 点击扩展程序图标时弹出的页面。 |
| popup.js | 为弹出页面添加交互逻辑。只在弹出窗口打开时运行,关闭后就停止 |
| popup.css | 对弹出页面进行样式设置。 |
| icon.png | 插件的图标 |
这里的文件名称,像 background.js、content.js、popup.js 等,只是一种比较常见且良好的实践命名方式,并不是强制规定,你完全可以根据自己的喜好来为文件命名,例如,可以把 background.js 改名为 a.js,只要在项目的配置文件中相应地将其配置为 a.js,整个项目依然能够正常运行。需要注意的是,扩展被安装后,Chrome就会读取扩展中的manifest.json文件。这个文件的文件名固定为manifest.json,所以manifest.json文件的名称必须是固定的
大部分插件点击之后会显示 UI,也就是插件功能页面部分,一般称为 popup 页面,如下图:
这部分的样式和交互由popup.html、popup.js、popup.css三个文件控制,并且popup页面关闭时popup.js就停止运行。
popup 无法通过程序打开,只能由用户点击打开。点击 popup 之外的区域会导致 popup 收起。
popup页面与background.js、content.js之间的通信架构如下图::
插件的架构可以参考官方文档。
实战:写一个小demo:改变页面背景颜色 的chrome插件。
上面介绍完了一个简单chrome插件所需要的部分,接下来为了能够快速体验一下开发流程,先不讲众多的概念和API如何使用,而是写一个小Demo,让小Demo能够作为插件在扩展程序中运行起来,并对当前浏览的页面作出交互。等大家看到效果之后,再进行后续的学习,主打一个循序渐进和文章的可读性。大家可以快速地把相应的代码复制粘贴,代码如下:
manifest.json:
{
"manifest_version": 3,
"name": "网页背景色修改器",
"version": "1.0",
"description": "点击按钮,修改当前网页的背景色。",
"background": {
"service_worker": "./background/background.js"
},
"icons": {
"16": "icons/icon16.png",
"32": "icons/icon32.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
},
"action": {
"default_popup": "./popup/popup.html",
"default_icon": {
"16": "icons/icon16.png",
"32": "icons/icon32.png",
"48": "icons/icon48.png",
"128": "icons/icon128.png"
}
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content/content.js"]
}
],
"permissions": ["activeTab"]
}
下面的popup.html、popup.css、popup.js文件,还记得上面说的popup文件下控制的都是插件功能页面部分,也就是这部分:
popup.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网页背景色修改器</title>
<link rel="stylesheet" href="popup.css">
</head>
<body>
<h1>网页背景色修改器</h1>
<input type="color" id="colorPicker">
<script src="popup.js"></script>
</body>
</html>
popup.js:
// 当DOM内容加载完成后执行以下函数
document.addEventListener('DOMContentLoaded', function() {
// 获取ID为'colorPicker'的HTML元素(应该是一个颜色选择器input)
const colorPicker = document.getElementById('colorPicker');
// 为颜色选择器添加change事件监听器(当用户选择新颜色时触发)
colorPicker.addEventListener('change', function() {
// 获取用户选择的颜色值
const selectedColor = colorPicker.value;
// 查询当前活动标签页
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
// 向当前标签页发送消息
chrome.tabs.sendMessage(
// 第一个参数:标签页ID
tabs[0].id,
// 第二个参数:要发送的消息对象
{
type: "changeBackgroundColor", // 消息类型
color: selectedColor // 选择的颜色值
},
// 第三个参数:回调函数,处理content script的响应(如果有的话)
function(response) {
// 如果收到成功响应
if (response && response.status === "success") {
// 在控制台打印成功消息
console.log('颜色修改成功!');
// 在popup页面上显示成功消息
document.getElementById('status').textContent = '颜色修改成功!';
}
}
);
});
});
});
popup.css:
/* 设置弹出窗口的基本样式 */
body {
display: flex;
flex-direction: column;
width: 200px; /* 设置弹出窗口宽度 */
padding: 10px;
margin: 0;
font-family: Arial, sans-serif;
}
#colorPicker {
width: 100%;
}
content.js:
// 监听来自popup.js的消息
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.type === "changeBackgroundColor") {
// 改变页面背景色
document.body.style.backgroundColor = request.color;
// 发送成功响应
sendResponse({status: "success"});
}
}
);
// 可选:添加一个初始化函数来确保脚本正常加载
console.log("Content script loaded successfully");
background.js:
本次Demo其实用不上background.js,但是后文想说说如何调试background.js这个文件,所以简单了解下background.js文件。
-
在 Manifest V3 中,background scripts 必须声明为 service worker
-
background.js 文件通常放在项目根目录下,或者放在 background 文件夹中(如 background/background.js)
-
service worker 不能直接访问 DOM,它在后台运行
主要用于:
-
监听浏览器事件
-
管理扩展的状态
-
处理长期运行的任务
-
协调不同组件之间的通信
就填充一下日志打印吧:
background.js
console.log('background.js loaded');
icon.png::注意⚠️:icon16.png、icon32.png、icon48.png、icon128.png都是用的这一张图片,改成不同的名称就可以了。
问题1:manifest.json配置项都是干什么的?
问题2:Manifest V2与V3有什么区别?
一、后台页面
Manifest V2:采用持久化后台页面,会持续占用内存,影响性能。:
Manifest V3:引入服务工作者(Service Workers),由事件驱动,按需运行,能节省资源:
二、权限管理
Manifest V2:权限管理较为宽松,容易导致开发者过度请求权限,可能带来潜在的安全隐患。
Manifest V3:权限管理更严格,要求开发者明确声明所需权限,有效降低安全风险。
三、扩展图标操作
Manifest V2:区分 browser_action 和 page_action 来配置扩展图标操作。
Manifest V3:将其统一为 action,简化了配置结构。
四、网络请求处理
Manifest V2:使用 chrome.webRequest API 处理网络请求,权限宽松,可能引发安全和隐私问题。
Manifest V3:采用 chrome.declarativeNetRequest API 进行声明式网络请求处理,安全性更高,需在 manifest.json 中预先声明规则。
具体变化,请移步官网
运行:加载已解压的扩展程序
代码填充完,现在就看一下效果吧!
一、点击浏览器右上角三个点 - 扩展程序 - 管理扩展程序
二、打开【开发者模式】 - 加载已解压的扩展程序(加载自己项目所在文件夹就可以了)
点开掘金首页,开始用一用吧!
我把背景色改成了...一言难尽的颜色😅💦我知道丑,没事的,咱们这次就是先体验一下开发流程,后面再做点有趣的小项目。
调试:插件出问题了,如何调试?
由于这次的小Demo代码是直接写好的,各位复制粘贴就可以顺利运行了,但是在实际开发插件的过程中,并不是这么一帆风顺,总是把bug缝缝补补,最后才能顺利运行。
那么插件出问题了该如何调试呢?
一、调试content.js
首先是content.js,因为这部分的代码是在manifest.json声明的,当访问的页面地址匹配我们写的正则时,才会进行注入,比如我们写的matches是https://*/*,即只要是https域名就会执行我们的脚本;
所以这部分的调试,需要我们在页面中打开控制面板(右键检查或者F12快捷键),步骤是:
- 找一个匹配得上的https的地址
- 打开控制台,找到sources下的content scripts
- 找到我们插件的名称Debuuger Demo
- 其中的content.js就是了
可以看到显示了我们的源代码,我们也可以进行插入断点
二、调试background.js
其次是background.js,我们回到安装插件的页面(在地址栏输入chrome://extensions)
- 找到我们的插件
- 点击查看视图
service worker - 会弹出一个控制台面板
- 可以看到面板输出了我们的log语句
- 同样切换到sources下,可以找到background.js进行断点
三、调试popup.js
最后是popup.js,因为这部分是属于弹窗展示的js,所以我们需要在弹窗上面右键,点击审查弹出内容;点击后同样是一个调试面板,同样可以看到我们的popup.js中的log,同样可以调试debugger源码,这里就不赘述了。
四、总结
chrome插件的调试的几种方面,其实都跟我们平常页面开发类似,有一个调试面板,关键是不同的js文件需要不同的打开方式,打开之后查看log,插入断点都是一致的。
感谢大家💗
本文是本专栏的开篇之作,内容相对基础,旨在让大家亲身体验 Chrome 扩展程序的开发流程,对于更具深度的文章,还请大家持续关注,我们会为大家带来更多精彩内容,敬请期待!
如果你觉得这篇文章对你有所帮助,不妨点赞支持一下,这样可以让更多的小伙伴看到这篇干货内容,让我们一起在开发的道路上共同进步,感谢大家的支持与鼓励 😉