Chrome插件快速上手

目录

前言

一、浏览器插件的主要功能

二、插件的工作原理

插件结构

manifest.json

icons

background.js

content-scripts

三、插件例子

popup.html

popup.js

styles.css

background.js

content-script.js

manifest.json

四、其它


前言

本文不做特殊说明,均在Manifest V3版本下说明

一、浏览器插件的主要功能

  1. 修改网页内容
  2. 增强浏览器功能
  3. 与外部服务交互
  4. 开发者工具

二、插件的工作原理

插件结构

  • manifest.json:插件配置文件
  • background.js:后台脚本
  • content-script.js:注入页面的脚本
  • popup:弹窗UI
  • options:插件设置页面(可选)
  • icons:插件图标(必须)
  • _locales:多语言支持(可选)

manifest.json

这是Chrome插件最重要也是必不可少的文件,用来配置所有和插件相关的配置,必须放在根目录中。

下面是一个示例manifest.json,我们将以这个示例切入,逐步说明配置项:

{"manifest_version": 3,"name": "Run script automatically","description": "Runs a script on www.example.com automatically when user installs the extension","version": "1.0","icons": {"16": "images/icon-16.png","32": "images/icon-32.png","48": "images/icon-48.png","128": "images/icon-128.png"},"background": {"service_worker": "service-worker.js"},"content_scripts": [{"js": ["content-script.js"],"matches": ["http://*.example.com//"]}],"permissions": ["scripting", "activeTab"]
}
  • manifest_version:指定扩展程序使用的清单文件格式的版本,唯一支持的值是3
  • name:插件名字
  • version:插件版本号
  • description:插件描述
  • icons:插件图标
  • background:插件的“后台脚本
  • content_scripts:用户打开网页时,使用的插入脚本
  • permissions:启用特定扩展API

icons

icons不同的键值,图标会在不同的地方使用:

  • 16:扩展程序页面和上下文菜单中的图标
  • 32:Windows计算机需要此大小
  • 48:显示在"扩展程序"页面上
  • 128:会在安装过程中和Chrome应用商店中显示

background.js

在V3版本中

background.js其实就是“Service Worker”,Service Worker是插件的“核心处理脚本”(大脑)

Service Worker的三个特点:

  • 无持久化运行:仅在需要时激活(如响应事件、处理消息),闲置时会被浏览器终止,节省资源
  • 无DOM访问能力:不能直接操作DOM(document、window等对象不可用),也不发使用alert、confirm等弹窗API
  • 生命周期由浏览器管理:无需手动控制启动 / 关闭,浏览器会根据事件自动调度

Service Worker的五个核心功能:

  • 监听浏览器级事件(chrome.runtime.onInstalled、chrome.tabs.onUpdated等)
  • 作为插件各组件的通信中枢
  • 处理跨域请求
  • 管理插件状态
  • 调度定时任务

content-scripts

用于操作网页,它一般具有下面五个能力:

  1. 修改网页DOM可以直接读取、修改当前网页的HTML结构、CSS样式或文本内容。
  2. 获取网页信息:能够提取网页中的数据(文本、图片链接等等),并通过插件的其他部分进行处理或上传
  3. 注入交互逻辑:可以为网页添加自定义的交互功能,比如添加新按钮、绑定事件监听,实现网页原本没有的功能
  4. 隔离性运行:虽然能访问网页DOM,但内容脚本运行在独立的沙盒环境中,不能直接访问网页自身的JavaScript变量/函数,也不能直接访问插件的后台脚本变量,安全性高
  5. 跨域请求能力:相比普通网页脚本,内容脚本可以通过插件的后台页面间接发起跨域请求

三、插件例子

整个插件结构如下:

-extension-icons-logo.png-popup-popup.html-popup.js-styles.css-backrgound.js-content-script.js-manifest.json

popup.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Page Info</title><link rel="stylesheet" href="styles.css">
</head>
<body><div class="container"><h1>当前页面信息</h1><p id="title">标题:加载中...</p><p id="url">URL:加载中...</p><button id="changeBg">随机背景色</button></div><script src="popup.js"></script>
</body>
</html>

popup.js

// 获取当前标签页信息
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {const tab = tabs[0];document.getElementById('title').textContent = `标题:${tab.title}`;document.getElementById('url').textContent = `URL:${tab.url}`;
});// 点击按钮修改页面背景色
document.getElementById('changeBg').addEventListener('click', () => {const colors = ['#ffcccc', '#ccffcc', '#ccccff', '#ffffcc'];const randomColor = colors[Math.floor(Math.random() * colors.length)];// 向内容脚本发送消息chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {chrome.tabs.sendMessage(tabs[0].id, { action: "changeBg", color: randomColor });});
});

styles.css

body {width: 300px;padding: 10px;font-family: Arial, sans-serif;
}
button {padding: 8px;background: #4CAF50;color: white;border: none;cursor: pointer;
}

background.js

// Manifest V3使用Service Worker,无需常驻后台
console.log("Service Worker已加载");

content-script.js

// 监听来自popup的消息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if (request.action === "changeBg") {document.body.style.backgroundColor = request.color;}
});

manifest.json

{"name": "Page Info Viewer","version": "1.0","manifest_version": 3,"description": "显示当前页面的标题和URL,并修改背景色","permissions": ["activeTab", "scripting"],"icons": {"16": "icons/logo.png",    "48": "icons/logo.png",   "128": "icons/logo.png"   },"action": {"default_popup": "popup/popup.html"},"background": {"service_worker": "background.js"},"content_scripts": [{"matches": ["<all_urls>"],"js": ["content-script.js"]}]
}

效果:

四、其它

如果您对该文感兴趣,可以参考我的专栏:

https://blog.csdn.net/zheshiyangyang/category_13023388.html

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

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

相关文章

moment和dayjs

一&#xff1a;moment和dayjs 区别moment 大且可变、维护模式&#xff1b;dayjs 小且不可变、插件化、tree‑shaking 友好。antd v4 用 moment&#xff1b;antd v5 用 dayjs。请在同一项目中统一其一&#xff0c;避免混用导致组件报错。二&#xff1a; antd 4.24.16&#xff08…

Flutter Packge - 组件应用

一、组件创建1. 在工程根目录创建 packages 目录。mkdir packages #创建文件夹 cd packages 2. 创建纯 Dart Package&#xff08;适合工具类/UI组件&#xff09;。flutter create --templatepackage common_network二、组件配置1. 在 common_network 的 pubspec.yaml 中添加…

基于双块轻量级神经网络的无人机拍摄的风力涡轮机图像去雾方法

基于双块轻量级神经网络的无人机拍摄的风力涡轮机图像去雾方法 UAV-Taken Wind Turbine Image Dehazing With a Double-Patch Lightweight Neural Network 我是菜鸡&#xff01;我是菜鸡&#xff01;我是菜鸡&#xff01; 如果老师及学姐学长对该文有任何意见&#xff0c;请…

Spring AI Alibaba 项目接入阿里云百炼平台大模型

1 依赖jdk 21 springboot 3.4.5 spring-ai-alibaba-starter-dashscope 1.0.0.2<properties><java.version>21</java.version><spring-ai.version>1.0.0</spring-ai.version><spring-ai-alibaba.version>1.0.0.2</spring-ai-alibaba.v…

电脑和手机访问网站,自动检测跳转不同网站

自动检测跳转不同网站 自动检测设备手机或电脑来跳转不同网页 开箱即用&#xff0c;不过需要自己修改一下跳转链接 源码截图&#xff1a; 下载地址&#xff1a;电脑和手机访问网站&#xff0c;自动检测跳转不同网站.zip - 蓝奏云

Spring Boot 集成 ShardingSphere 实现读写分离实践

Spring Boot 集成 ShardingSphere 实现读写分离实践 在高并发的业务场景中,数据库往往是系统性能的瓶颈。为了提高系统的吞吐量和稳定性,读写分离是一种常见的优化方案。本文将详细介绍如何使用 Spring Boot 结合 ShardingSphere 实现数据库的读写分离,并提供完整的配置和实…

以rabbitmq为例演示podman导出导入镜像文件

1. 导出镜像为 tar 文件 将镜像保存为压缩包&#xff08;默认格式为 docker-archive&#xff09;&#xff1a; podman save -o rabbitmq_management.tar docker.io/rabbitmq:management-o&#xff1a;指定输出文件名&#xff08;如 rabbitmq_management.tar&#xff09;。镜像名…

LIS(最长上升子序列)与LCS(最长公共子序列)

最长上升子序列定义&#xff1a;给出一个数字序列&#xff08;arr&#xff09;&#xff0c;求出其中长度最长的数值严格递增的子序列做法一&#xff1a;使用动态规划&#xff0c;我们定义dp[i]为以arr[i]结尾的最长上升子序列的长度。#include<bits/stdc.h> using namesp…

javaSE(基础):5.抽象类和接口

抽象类一.理解抽象类思维&#xff1a;假如我想定义一个Shape&#xff08;图形类&#xff09;类&#xff0c;我在这个类中写了一个draw()方法&#xff0c;但是这个方法是不能用来描述图形形状的&#xff08;不能有方法体&#xff09;&#xff0c;因为我只要对他进行了准确描述&a…

ESG评级可持续发展之路,ESG评级的好处

在商业文明的演进历程中&#xff0c;ESG评级正成为衡量企业价值的全新坐标系。这套融合环境&#xff08;Environmental&#xff09;、社会&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;三大维度的评估体系&#xff0c;犹如一盏明灯&#xff0c;指引…

camera人脸识别问题之二:【FFD】太阳逆光场景,人像模式后置打开美颜和滤镜,关闭heif拍摄格式对着人脸拍照,成像口红出现位置错误

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; camera人脸识别问题之二&#xff1a;【FFD】太阳逆光场景&#xff0c;人像模式后置打开美颜和滤镜&#xff0c;关…

YOLO-Count:用于文本到图像生成的可微分目标计数

摘要 https://arxiv.org/pdf/2508.00728v1 我们提出了YOLO-Count&#xff0c;一种可微分的开放词汇目标计数模型&#xff0c;旨在解决通用计数挑战并实现文本到图像(T2I)生成的精确数量控制。核心贡献是"基数"图(cardinality map)&#xff0c;这是一种新颖的回归目标…

Go 的错误处理方式深度解析—— error vs panic vs recover:机制原理与实战取舍

一、Go 的错误处理哲学Go 的设计哲学鼓励明确的、显式的错误处理方式。它不像 Java 或 Python 使用异常机制&#xff0c;而是采用了返回值 error 的方式&#xff0c;让错误成为程序流程的一部分。Go 的错误处理核心理念是&#xff1a; 错误是值&#xff08;Errors are values&a…

官方Windows系统部署下载工具实践指南

摘要&#xff1a;本文介绍两款用于获取微软正版系统部署文件的工具&#xff0c;适用于需要快速搭建Windows环境的技术人员。所有工具均基于官方渠道实现&#xff0c;不涉及系统修改或激活功能。一、Windows系统镜像下载方案工具名称&#xff1a;Windows镜像直链下载工具 核心功…

Pandas query() 方法详解

Pandas query() 方法详解query() 是 Pandas 中一个非常强大的方法&#xff0c;它允许你使用字符串表达式来筛选数据行。这种方法比传统的布尔索引更简洁、更易读。基本语法df.query(expr, inplaceFalse, **kwargs)expr: 查询字符串表达式inplace: 是否原地修改 DataFrame (默认…

Linux系统层IO

1.c语言文件操作 fopen&#xff1a;打开文件&#xff0c;模式 "w"&#xff08;写&#xff0c;覆盖&#xff09;或 "r"&#xff08;读&#xff09;。 fwrite&#xff1a;fwrite(data, size, count, fp)&#xff0c;按 size 字节写入 count 次数据。 fread…

QT中的trimmed() 方法(1)

QT中的trimmed() 方法&#xff08;2&#xff09; trimmed() 是 Qt 框架 中 QString 类提供的一个方法&#xff0c;用于 去除字符串首尾的空白字符&#xff08;whitespace characters&#xff09;。它的作用类似于标准 C 中的 std::string 的 trim 操作&#xff0c;但专为 Qt 的…

动漫软件集合分享

通过网盘分享的文件&#xff1a;动漫软件 链接: https://pan.baidu.com/s/1TD_OmaAZksfFxJ4PW6rS-w?pwd1234 提取码: 1234 打印动漫.apk 当鸟动漫.apk 动漫共和国【OmoFun复活】.apk 咕咕香.apk 黑猫动漫.apk 团次元【推荐】.apk 橘漫.apk 曼波.apk 萌国.apk 趣动漫.apk 三…

Mysql与Ooracle 索引失效场景对比

MySQL 和 Oracle 作为主流关系型数据库&#xff0c;其索引失效的场景既有共性&#xff0c;也因底层优化器、索引类型支持等差异存在不同。以下从常见索引失效场景对比两者的表现及原因&#xff1a;一、索引列上使用函数 / 表达式共性&#xff1a;若直接在索引列上使用函数或表达…

【unity知识】unity使用AABB(轴对齐包围盒)和OBB(定向包围盒)优化碰撞检测

文章目录前言一、AABB&#xff08;轴对齐包围盒&#xff09;1、基本概念2、数学表示3、Unity中的实现4、实际应用示例二、OBB&#xff08;有向包围盒&#xff09;1、Physics.ComputePenetration (Unity 物理引擎)1.1 基本概念1.2 Unity中的实现1.3 实际应用示例2、OBB (SAT) 手…