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

问题背景

最近,客户发布了一个新的任务 —— 开发一个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 = !isOnif (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 = 1000document.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.mzph.cn/news/855697.shtml

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

相关文章

【区块链】以太坊白皮书深度解读:构建智能合约的分布式平台

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 以太坊白皮书深度解读:构建智能合约的分布式平台引言1. 以太坊的诞生…

vue3 的 watch 不能监视 toRef 的值

* 情况一let props withDefaults(defineProps<{ list: Array<any> }>(), {list: () > [],})const list toRef(props.list)watch(list.value, (newVal, oldVal) >{console.log(newVal, newVal) })-------------------------------------------------------…

Nuxt快速学习开发---Nuxt3视图Views

Views Nuxt提供了几个组件层来实现应用程序的用户界面 默认情况下&#xff0c;Nuxt 会将app.vue文件视为入口点并为应用程序的每个路由呈现其内容 应用程序.vue <template> <div> <h1>Welcome to the homepage</h1> </div> </template> …

【杂记-浅谈Sequence Number/序列号】

文章目录 一、Sequence Number序列号概述二、Sequence Number序列号作用三、Sequence Number的工作原理及重要性 一、Sequence Number序列号概述 Sequence Number&#xff0c;即序列号&#xff0c;是计算机网络中TCP/IP协议的一个重要概念&#xff0c;主要用于保证数据传输的可…

油猴hook+内存爆破

hook方式 说明&#xff1a;来回翻页发现只有请求体的token需要逆向&#xff0c;而这个请求体是在params里&#xff0c;拼接到url里&#xff0c;可以直接用油猴hook url里的关键字token。 正常步骤 hook代码 // UserScript // name hookparams // namespace htt…

【C语言】扫雷游戏

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

springBoot多数据源使用、配置

又参加了一个新的项目&#xff0c;虽然是去年做的项目&#xff0c;拿来复用改造&#xff0c;但是也学到了很多。这个项目会用到其他项目的数据&#xff0c;如果调用他们的接口取数据&#xff0c;我还是觉得太麻烦了。打算直接配置多数据源。 然后去另一个数据库系统中取出数据…

深信服科技:2023网络钓鱼趋势分析报告

随着互联网的快速发展和广泛应用&#xff0c;网络钓鱼活动带来的安全隐患愈演愈烈。因应威胁发展&#xff0c;我 们编撰了此份分析报告&#xff0c;旨在全面了解其发展态势&#xff0c;并提醒相关部门、企业和公众加强防范。 在本报告中&#xff0c;我们将详细梳理网络钓鱼的近…

IBM,开始构建以量子为中心的超级计算机

6月6日&#xff0c;IBM与Pasqal宣布了一项重大合作!IBM和Pasqal打算合作开发一种以量子为中心的超级计算的通用方法并促进化学和材料科学的应用研究。IBM和Pasqal将与高性能计算领域的领先机构合作&#xff0c;为以量子为中心的超级计算奠定基础——将量子计算与先进的经典计算…

深度神经网络(DNN)详解

1.1 神经网络 神经网络是由人工神经元&#xff08;节点&#xff09;组成的网络结构。每个神经元接收输入信号&#xff0c;经过加权处理和激活函数转换&#xff0c;产生输出信号。基本的神经网络结构包括输入层、隐藏层和输出层。 1.2 深度学习 深度学习是机器学习的一个分支…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第44课-骨骼动画

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第44课-骨骼动画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

开放式耳机哪个牌子好?2024五大闭眼入开放式耳机推荐!

想要购买开放式耳机&#xff0c;但面对很多品牌和型号&#xff0c;是否感到无从下手&#xff1f;别担心&#xff0c;作为耳机发烧友和测评专家&#xff0c;我为大家带来了几款热门开放式耳机的横向对比。从各个方面进行详细对比&#xff0c;还有我自己觉得还不错的五款开放式耳…

微型导轨的摩擦系数分析!

微型导轨的摩擦力主要包括滑动摩擦力和滚动摩擦力&#xff0c;摩擦系数是一个关键参数&#xff0c;它决定了滑块在导轨上运动时所受到的摩擦力大小&#xff0c;摩擦系数越低&#xff0c;系统的运动效率和精度就越高&#xff0c;而微型导轨的摩擦系数是受多个因素影响的。 微型导…

【docker hub镜像源失效】2024年6月6日 docker 国内镜像源失效

文章目录 概述中科大镜像源阿里镜像源其他镜像源可用的镜像源写在最后 之前违反社区规定了&#xff0c;做了和谐 概述 大家都知道使用docker hub官方镜像需要魔法&#xff0c;虽然大部人有魔法&#xff0c;但是网速也是很慢&#xff0c;还有部分同学没有&#xff0c;全靠国内各…

移远通信发布高性价比智能模组SC200P系列,赋能金融支付等行业智慧升级

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;为满足智慧金融、智能家居、智能穿戴、工业手持等消费和工业应用对高速率、多媒体、长生命周期等终端性能的需求&#xff0c;其正式推出基于紫光展锐UNISOC 7861平台的全新8核4G智能模组SC200P系列…

C语言结构体位域(位段)使用

C语言中的结构体位域&#xff08;也称为位段&#xff09;是一种特殊的数据结构&#xff0c;它允许程序员以位为单位来定义和操作结构体中的成员变量。位域的使用主要目的是为了节省存储空间和实现对硬件寄存器的直接访问&#xff0c;尤其是在嵌入式系统编程中非常有用。位域的声…

关于INCA的几个实用功能

01--VUI窗口设计 这个可以按照自己的想法设计INCA观测或标定窗口 首先进入到INCA的环境内&#xff0c;点击实验→加载VUI窗口 选择空的窗口 打开后如下所示&#xff1a; 点击UI开发模式&#xff0c;如下图 如下&#xff1a; 添加标定量、观测量、示波器 窗口的大小需要在开发…

ProtoBuf序列化协议简介

首先&#xff0c;常见的序列化方法主要有以下几种&#xff1a; TLV编码及其变体(tag, length, value)&#xff1a; 比如ProtoBuf。文本流编码&#xff1a;XML/JSON固定结构编码&#xff1a;基本原理是&#xff0c;协议约定了传输字段类型和字段含义&#xff0c;和TLV类似&…

家庭财务新助手,记录收支明细,一键导出表格,让您的家庭财务一目了然!

在繁忙的现代生活中&#xff0c;家庭财务管理常常成为一项令人头疼的任务。如何记录每一笔收支&#xff0c;如何清晰地掌握家庭财务状况&#xff0c;如何合理规划未来开支&#xff0c;这些都是我们需要面对的问题。然而&#xff0c;有了这款家庭财务助手——晨曦记账本&#xf…

【启明智显产品介绍】Model3工业级HMI芯片详解系列专题(一):芯片性能

Model3工业级跨界MCU是一款国产自主的基于RISC-V架构的高性能芯片&#xff0c;内置平头哥玄铁E907&#xff0c;主频480MHz&#xff0c;片上1MB大容量SRAM以及64Mb PSRAM。 Model3工业级MCU具有丰富的屏接口、高分辨率PWM和多路高精度定时器&#xff0c;可以处理各类实时数据与实…