Chrome插件开发入门:手把手教你创建第一个扩展

news2024/12/26 6:42:49

问题背景

最近,客户发布了一个新的任务 —— 开发一个Chrome插件。之前没有这方面的开发经验,准备想学习一下这块的内容,我发现网上的大多数视频都是几年前的,开发版本都是基于MV2,当前谷歌已经开始使用MV3(Manifest V3)版本了,我决定利用这次机会,从零开始,探索并记录整个开发过程。

我的第一个目标是创建一个简单的Chrome插件,当用户点击工具栏上的图标时,如果插件处于激活状态,则在图标下方显示蓝底白字的“ON”。此外,当激活时,https://juejin.cn/* 网站上将新增一个导出按钮。

在开始编码之前,我强烈推荐大家访问 Chrome 开发者文档,这里提供了详尽的入门指南和最佳实践

解决方案

创建项目结构

首先,您需要创建一个项目文件夹,例如命名为hello-chrome,在这个文件夹中,我们将创建以下基础文件:

  • manifest.json:插件配置文件,描述插件的基本信息和权限。
  • background.js:插件的后台脚本,用于管理插件的状态和监听事件。
  • popup.html:点击插件图标时展示的弹窗页面。(当前示例不涉及这个文件)
  • popup.js:与popup.html页面相关联的脚本文件。(当前示例不涉及这个文件)
  • content.js:内容脚本,用于在特定网页中执行代码。(当前示例不涉及这个文件)
  • 图标文件:图标资源文件,用于展示插件图标。

现在让我们深入到每个文件的详细内容。

配置 manifest.json

manifest.json 是插件的核心,定义了插件的名称、版本、描述、权限、图标等信息。以下是本次示例插件开发的配置,这个配置文件定义了插件的基本信息和所需权限,同时指明了在用户点击插件图标时需要显示的弹出页面和图标资源

{
  "manifest_version": 3,
  "name": "Hello Chrome Extension",
  "version": "1.0",
  "description": "A simple Chrome extension for juejin.cn",
  "permissions": ["activeTab", "storage"],
  "host_permissions": ["https://juejin.cn/*"],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_icon": {
      "16": "images/icon16.png",
      "48": "images/icon48.png",
      "128": "images/icon128.png"
    }
  },
  "icons": {
    "16": "images/icon16.png",
    "48": "images/icon48.png",
    "128": "images/icon128.png"
  }
}

实现 background.js

background.js文件负责监听用户的操作并响应插件的状态变化。比如监听浏览器事件、管理插件状态等。

  • 示例内容:

// 定义一个变量来跟踪 "ON" 状态
let isOn = false

// 监听工具栏图标点击事件
chrome.action.onClicked.addListener(async (tab) => {
  // 切换 isOn 状态
  isOn = !isOn

  if (isOn) {
    // 设置徽章文本为 "ON"
    chrome.action.setBadgeText({ text: 'ON' })
    // 设置徽章背景颜色为蓝色
    chrome.action.setBadgeBackgroundColor({ color: 'blue' })

      // 调用 addExportButton 函数在页面上添加导出按钮
      chrome.scripting.executeScript({
        target: { tabId: tab.id },
        function: addExportButton
      })
    }
  } else {
    // 清除徽章文本
    chrome.action.setBadgeText({ text: '' })

    // 检查当前标签页的 URL 是否包含 'https://juejin.cn/'
    if (tab.url.includes('https://juejin.cn/')) {
      // 调用 removeExportButton 函数从页面上移除导出按钮
      chrome.scripting.executeScript({
        target: { tabId: tab.id },
        function: removeExportButton
      })
    }
  }
})

// 定义一个函数在页面右下角添加导出按钮
function addExportButton() {
  const button = document.createElement('button')
  button.textContent = '导出'
  button.id = 'exportButton'
  button.style.position = 'fixed'
  button.style.bottom = '10px'
  button.style.right = '10px'
  button.style.zIndex = 1000
  document.body.appendChild(button)
}

// 定义一个函数从页面移除导出按钮
function removeExportButton() {
  const button = document.getElementById('exportButton')
  if (button) {
    button.remove()
  }
}

在上述代码中,当用户点击工具栏图标时,chrome.action.onClicked.addListener 事件监听器触发。根据 isOn 状态,设置或清除徽章文本,并在 https://juejin.cn/ 网站上添加或移除导出按钮。chrome.scripting.executeScript 用于在当前活动的标签页中执行 addExportButtonremoveExportButton 函数,以便动态地修改页面内容。

Chrome API 函数说明

  1. chrome.action.onClicked.addListener:用于监听工具栏图标的点击事件。当用户点击扩展程序的图标时,会触发提供的回调函数。参考文档:chrome.action.onClicked

  2. chrome.action.setBadgeText:用于设置工具栏图标上的徽章文本。徽章通常用于显示状态或通知。参考文档:chrome.action.setBadgeText

  3. chrome.action.setBadgeBackgroundColor:用于设置工具栏图标徽章的背景颜色。参考文档:chrome.action.setBadgeBackgroundColor

  4. chrome.scripting.executeScript:用于向指定的标签页注入 JavaScript 脚本。可以注入单个函数或文件中的脚本。参考文档:chrome.scripting.executeScript

加载和测试插件

最后,加载插件进行测试:

  1. 打开 Chrome 浏览器,访问 chrome://extensions/
  2. 开启“开发者模式”。
  3. 点击“加载已解压的扩展程序”,选择你的项目文件夹。

现在,当你点击插件图标时,应该能够看到“ON”的提示,并且在网站上看到新增的导出按钮。这个例子也只能说是体验一些chrome插件的快乐,这里面也有bug,比如刷新一些网页导出的按钮就消失了,大家猜猜这是为什么呢?

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式编程】-C语言结构体成员对齐、填充和数据打包

C语言结构体成员对齐、填充和数据打包 文章目录 C语言结构体成员对齐、填充和数据打包1、内存中的数据对齐2、C语言中的结构填充3、如何减少结构填充4、C语言中结构填充的常见问题解答 在 C 语言中,结构用作数据包。它们不提供任何数据封装或数据隐藏功能。在本文中…

HarmonyOS【ArkUI组件--TextInput】

1.文本输入框基本用法 2. 使用文本输入框组件(如何实现输入数字改变图片大小) 在此博客的基础上继续编写:HarmonyOS【ArkUI组件--Text】-CSDN博客 ①代码如下: import font from ohos.font Entry Component struct Index {State …

【吊打面试官系列-Mysql面试题】Myql 中的事务回滚机制概述 ?

大家好,我是锋哥。今天分享关于 【Myql 中的事务回滚机制概述 ?】面试题,希望对大家有帮助; Myql 中的事务回滚机制概述 ? 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位…

RK3568技术笔记十二 Android编译方法

Android源码说明 Android源码在SAIL-RK3568开发板光盘->Android->源代码中,由于android源码太大,在进行压缩时,进行分包压缩,因此有4部分,如图所示: 进行解压时,需将4部分压缩包放置同一…

linux写代码环境和工具

基础指令 目录 前言 二、yum工具的使用 1.yum是什么? 2.查看软件包 3.配置sudo 4.如何卸载软件 三、vim的使用 1. vim的基本概念 2. vim的基本操作 3. vim正常模式命令集 4.简单vim配置 四、Linux编译器-gcc/g使用 1、格式 2、gcc选项 3.gcc/g工作和…

四连杆机构运动学仿真 | Matlab源码+理论文本【超详细】

【程序简介】💻🔍 本程序通过matlab实现了四连杆机构的运动学仿真编程,动态展现了四连杆机构的角位移、角速度和角加速度的时程曲线,除了程序本身,还提供了机构运动学详细的公式推导文档,从而帮助大家更好…

录屏软件OBS简单使用

录屏软件OBS简单使用 官网下载地址: https://obsproject.com/ window解压直接使用版: 链接: https://pan.baidu.com/s/1495KDkvuDnjqdOvm1IG4Fw 提取码: 9xcr 复制这段内容后打开百度网盘手机App,操作更方便哦 简单使用 解压 解压window解…

Sui主网升级至V1.27.2版本

其他升级要点如下所示: 重点: #17245 增加了一个新的协议版本,并在开发网络上启用了Move枚举。 JSON-RPC #17245: 在返回的JSON-RPC结果中增加了对Move枚举值的支持。 GraphQL #17245: 增加了对Move枚举值和类型的支持。 CLI #179…

SpringBoot配置第三方专业缓存技术Ehcache

Ehcache缓存技术 我们刚才是用Springboot提供的默认缓存技术 我们用的是simple 是一个内存级的缓存 我们接下来要使用专业的缓存技术了 Ehcache 是一个流行的开源 Java 分布式缓存,由 Terracotta 公司开发和维护。它提供了一个快速、可扩展、易于集成的内存缓存…

CI /CD学习

CI/CD概述 CI/CD 是持续集成和持续交付/部署的缩写,旨在简化并加快软件开发生命周期。 持续集成(CI)是指自动且频繁地将代码更改集成到共享源代码存储库中的做法。持续交付和/或持续部署(CD)是一个由两部分组成的过程…

山东大学软件学院创新项目实训开发日志——收尾篇

山东大学软件学院创新项目实训开发日志——收尾篇 项目名称:ModuFusion Visionary:实现跨模态文本与视觉的相关推荐 -------项目目标: 本项目旨在开发一款跨模态交互式应用,用户可以上传图片或视频,并使用文本、点、…

flutter 打包 exe

采用官方的MSIX打包 原文链接 https://blog.csdn.net/weixin_44786530/article/details/135308360 第一步:安装依赖 在项目根目录,执行命令: flutter pub add --dev msix 等待安装完成,就好了 第二步:打包编译 当m…

嵌入式技术学习——Linux环境编程(高级编程)——shell编程

一、shell编程的基础介绍 1.为什么要进行shell编程? 在Linux系统中,虽然有各种各样的图形化接口工具,但是shell仍然是一个非常灵活的 工具。 Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。 您可以通过使用shell使大量的任务自动化…

群辉NAS与电脑间的文件自动同步

目录 一、套件简介 二、套件的安装 三、电脑端程序 (1)启用团队文件夹 (2)设置同步任务 (3)测试同步 四、手机同步 (1)安装app (2)测试 (3)同步任务 (3)其它同步任务 最早使用的网盘叫“快盘”,不知道朋友们有用过的没有。当时最常用的功能就是电脑与…

相交链表(Leetcode)

题目分析: . - 力扣(LeetCode) 相交链表:首先我想到的第一个思路是:如图可知,A和B链表存在长度差,从左边一起遍历链表不好找交点,那我们就从后面开始找,但是这是单链表&…

期望23K,go高级社招面试复盘

面经哥只做互联网社招面试经历分享,关注我,每日推送精选面经,面试前,先找面经哥 我最终还是上岸了,花了一周总结了3万字的go社招高级面试知识体系思维导图,分享出来希望能帮助有缘人吧,以下只是…

AI金融投资:批量下载巨潮资讯基金招募说明书

打开巨潮资讯的基金招募说明书页面: http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey%E5%B0%81%E9%97%AD%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E8%AF%81%E5%88%B8%E6%8A%95%E8%B5%84%E5%9F%BA%E9%87%91%E6%8B%9B%E5%8B%9F%E8%AF%B4%E6%98%…

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址:node.js…

Windows下MySQL数据库定期备份SQL文件与删除历史备份文件.bat脚本

目录 一、功能需求 二、解决方案 (1)新建文件夹及批处理文件 (2)编写备份脚本 ①完整脚本 ②参数修改 (3)编写定期删除备份脚本 ①根据文件名识别日期进行删除 ② 根据文件的修改日期删除 (4)设置定时器 (5)常见报错与处理 一、功能需求 在Windows系统下…

【吊打面试官系列-Mysql面试题】SQL 语言包括哪几部分?每部分都有哪些操作关键字?

大家好,我是锋哥。今天分享关于 【SQL 语言包括哪几部分?每部分都有哪些操作关键字?】面试题,希望对大家有帮助; SQL 语言包括哪几部分?每部分都有哪些操作关键字? SQL 语言包括数据定义(DDL)、…