《Chrome 插件开发:构建插件与调试知识全掌握 🚀》

848 阅读10分钟

这篇文章可以学到什么:

1.Chrome 插件 Demo 的极速开发:从零基础开始,轻松搭建插件的基础框架,让你迅速体验 Chrome 插件的开发流程,带你开启一场高效的开发之旅。

2.Chrome 插件开发中的通信架构初体验:对 Chrome 插件开发里的通信架构有一个简明扼要的认识,掌握不同组件(如 popup 页面、content 脚本和 background 脚本)之间是如何实现信息交互的,为你深入理解插件的工作原理奠定基础。

3.基础的 manifest.json 文件配置知识:掌握 manifest.json 文件的基本配置,包括其主要元素的配置方法及作用,让你学会如何利用它来定义和定制你的 Chrome 插件,使其具备所需的各种功能。

4.插件调试实用技巧:当开发过程中遭遇问题时,能够熟练运用调试技巧,了解如何针对不同的脚本文件(如 content.jsbackground.js 和 popup.js)进行有效调试,迅速定位并解决问题,让你的开发过程更加顺畅。

前言:

由于作者自己也是第一次接触chrome插件开发,作者写这篇文章的目的一方面是想记录自己在探索 Chrome 插件开发过程中的学习轨迹,另一方面,也想把自己在开发过程中所积累的一些思考和实践经验分享给大家。

本文会比较基础,大佬们请跳过,但本专栏后续文章会逐步深入、层层递进,希望能跟大家一起成长。

83FFDBD88DD1575C6CB3A97A26898764.jpg

一、什么是chrome插件?

先介绍几个大名鼎鼎的插件,无需过多文字解释,一看就知道什么是chrome插件😁

一、Tampermonkey油猴脚本扩展 通过它可以给浏览器安装各种各样的用户脚本,神器不解释!

image.png

二、uBlock Origin Lite最佳浏览器广告拦截扩展,功能全面、效果一流,而且资源占用极低。 image.png

image.png

Chrome插件是指可以在谷歌浏览器中运行的扩展程序,可以为用户提供额外的功能和定制化的体验。用户可以通过安装不同的插件在浏览器中添加新的功能、修改现有功能或者与网页进行交互

二、如何快速开发一个简单的Chrome插件

如何快速开发一个简单的Chrome插件,旨在了解开发流程、调试流程、简单的配置文件。而不是快速开发一个功能齐全的Chrome插件(如果觉得有点基础,求大佬们轻喷)💦

介绍

chrome 插件通常由以下几部分组成:

image.png

对应的代码目录结构如下。现在,请创建工作目录及相应文件,即便文件内容暂时为空也没关系,后续我们会将其补充完整。

image.png

每个文件的用途如下,可参考下面的表格,等你把 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.htmlpopup.jspopup.css三个文件控制,并且popup页面关闭时popup.js就停止运行

popup 无法通过程序打开,只能由用户点击打开。点击 popup 之外的区域会导致 popup 收起。

image.png

popup页面与background.js、content.js之间的通信架构如下图::

6257e19d4999531428305724adc67916.png

插件的架构可以参考官方文档

实战:写一个小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文件下控制的都是插件功能页面部分,也就是这部分:

image.png

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都是用的这一张图片,改成不同的名称就可以了。

圣诞玩偶.png


问题1:manifest.json配置项都是干什么的?

image.png

问题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 中预先声明规则。

image.png

具体变化,请移步官网

运行:加载已解压的扩展程序

代码填充完,现在就看一下效果吧!

一、点击浏览器右上角三个点 - 扩展程序 - 管理扩展程序

image.png

二、打开【开发者模式】 - 加载已解压的扩展程序(加载自己项目所在文件夹就可以了)

image.png

image.png

点开掘金首页,开始用一用吧!

我把背景色改成了...一言难尽的颜色😅💦我知道丑,没事的,咱们这次就是先体验一下开发流程,后面再做点有趣的小项目。

image.png

调试:插件出问题了,如何调试?

由于这次的小Demo代码是直接写好的,各位复制粘贴就可以顺利运行了,但是在实际开发插件的过程中,并不是这么一帆风顺,总是把bug缝缝补补,最后才能顺利运行。

那么插件出问题了该如何调试呢?

一、调试content.js

首先是content.js,因为这部分的代码是在manifest.json声明的,当访问的页面地址匹配我们写的正则时,才会进行注入,比如我们写的matcheshttps://*/*,即只要是https域名就会执行我们的脚本;

所以这部分的调试,需要我们在页面中打开控制面板(右键检查或者F12快捷键),步骤是:

  • 找一个匹配得上的https的地址
  • 打开控制台,找到sources下的content scripts
  • 找到我们插件的名称Debuuger Demo
  • 其中的content.js就是了

可以看到显示了我们的源代码,我们也可以进行插入断点

image.png

二、调试background.js

其次是background.js,我们回到安装插件的页面(在地址栏输入chrome://extensions

  • 找到我们的插件
  • 点击查看视图service worker
  • 会弹出一个控制台面板
  • 可以看到面板输出了我们的log语句
  • 同样切换到sources下,可以找到background.js进行断点

image.png

image.png

三、调试popup.js

最后是popup.js,因为这部分是属于弹窗展示的js,所以我们需要在弹窗上面右键,点击审查弹出内容;点击后同样是一个调试面板,同样可以看到我们的popup.js中的log,同样可以调试debugger源码,这里就不赘述了。

image.png

四、总结

chrome插件的调试的几种方面,其实都跟我们平常页面开发类似,有一个调试面板,关键是不同的js文件需要不同的打开方式,打开之后查看log,插入断点都是一致的。

感谢大家💗

本文是本专栏的开篇之作,内容相对基础,旨在让大家亲身体验 Chrome 扩展程序的开发流程,对于更具深度的文章,还请大家持续关注,我们会为大家带来更多精彩内容,敬请期待!

如果你觉得这篇文章对你有所帮助,不妨点赞支持一下,这样可以让更多的小伙伴看到这篇干货内容,让我们一起在开发的道路上共同进步,感谢大家的支持与鼓励 😉

参考文章:

1.Chrome Developer官网

2.10个好用到爆的 Chrome 扩展程序推荐,尤其是第一个“真香”

3.写html页面没意思,来挑战chrome插件开发

4.chrome 插件开发指南

5.手把手:Chrome浏览器开发系列(四):调试我们开发的插件