当前位置: 首页 > news >正文

记一次基于manifest v3开发谷歌插件

背景

头疼在国际化功能普遍的前端项目中,如果你在处理或者在某一块功能上新增一些需求的时候,在没有国际化功能的页面中,我们随便复制一些文本,然后在vs code中全局搜索,很快就可以找到所要更改的代码文件在哪里;但是
众所周知,国际化功能中的项目(如果你的国际化文件,写死在项目中,那就可以退场啦),所有的文本都是唯一key的映射产物,而我们的代码中也只是引用这个唯一的key,怎么快速找到这个key,成为了让我们头疼的事情!

目的

为了节省自己日常开发的时间成本,为工作增效(哈哈哈哈,顺带哈)

分析

遇到问题,解决问题!

灵感来源于,谷歌浏览器的翻译插件

可不可以有类似的插件,当我选中某一段文本,他就会检索出来包含这段文本的一些key或者一个key呢,所以解决问题的版本就出来了

  • 好,接下来,我们有了新的问题,怎么开发一个谷歌浏览器的插件?
  • 多得博主之前有相关经验,也不难,大家要接受新的事物进入自己的世界,直接上一个manifestV3开发文档
  • 都准备好,那就开始

技术栈

  • Manifest v3

具备技能,前端三座大山。

配置文件

对于谷歌浏览器的插件开发来说,manifest.json的配置是至关重要的,它是一切的源头,相当于我们日常开发项目中的 index.js 入口文件

manifest.json

{"name": "插件的名称","description": "插件的描述","version": "0.1","permissions": ["contextMenus"],"background": {"service_worker": "service_worker.js"},"content_scripts": [{"js": ["lucky.js"],"matches": ["https://*.bxingupdate.com/*", "https://*.bitvenus.live/*", "https://www.bvox.com/*"],"run_at": "document_end","world": "MAIN"},{"js": ["func.js"],"matches": ["https://*.bxingupdate.com/*", "https://*.bitvenus.live/*", "https://www.bvox.com/*"],"all_frames": true,"run_at": "document_end"}],"manifest_version": 3, // 制定manifest开发版本,最新是3 "host_permissions": ["https://*.bxingupdate.com/*", "https://*.bitvenus.live/*", "https://www.bvox.com/*"],"web_accessible_resources": [],"action": {"default_popup": "popup.html","default_icon": {"16": "icons/icon16.png","48": "icons/icon16.png","128": "icons/icon16.png"}},"icons": { // 配置的插件图标"16": "icons/icon16.png","48": "icons/icon16.png","128": "icons/icon16.png"}
}

这里,以谷歌浏览器插件 redux devtools为例:
在这里插入图片描述
上图,绿色区域就是manifest中的名称,红色部分就是描述;左侧图标,就是icons配置的

那 action 中的 default_popup 就是我们在使用浏览器扩展的时候,
在这里插入图片描述
在这里插入图片描述
类似这里弹出来的这个弹窗,就是popup.html所书写的内容。

以上,其他的一些key的含义,可自行前往官网去查看,且官网上面会有你需要的各种案例。

目录结构

在这里插入图片描述

  1. service_worker.js, 也常被称为background.js,它的作用是 如此

  2. func.js, 它是content-scripts的一种,是当前页面与扩展程序沟通的媒介

  3. lucky.js, 与func.js一样都是content-scripts,不过它的特征在于 它是以script脚本直接运行在当前页面的,

    这样看更清晰一些,以下两张图,看得出他们所处在不同的加载位置
    在这里插入图片描述
    在这里插入图片描述

  4. popup.js, 这个是用于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></head><style>....</style><body>....<script src="./popup.js"></script></body>
</html>

接下来,介绍下,以上这个插件中,我们需要用到的通信方法

通信

1. conent-script与background之间的通信

  • content-script怎么给background发送消息呢?

    使用chrome.runtime.sendMessage api,给background发送消息。

  • background又怎么接收消息?
    使用chrome.runtime.onMessage.addListener api,来接收其他人给他发送的消息,包括下面的popup!而且这个api的第一个参数是个函数,该函数中的第三个参数可以用作消息通信,可以发送一些消息给传递给他消息的人,

content-script background { data: '123' } sendResponse({ data: '456' }) background经过自己的处理, 最终 把相应结果给出. content-script background
  • 那么,background又怎么主动发送消息给content-script呢? conent-script又怎么接收的消息?
    使用 chrome.tabs.sendMessage api,主动发消息给content-script,而content-script也是通过chrome.runtime.onMessage.addListenerapi来接收消息
带有两个参数 标签页的id, data
background
content-script

2. popup和background之间的通信

与content-script类似,只不过不能直接与 content script 通信,必须通过 background script 作为中介

总结一下通信关系

(1) popup.html

  • 由 popup.js 负责逻辑处理。
  • 只能在用户点击扩展图标时显示,生命周期短。
  • 不能直接与 content script 通信,必须通过 background script 作为中介。

(2) content script

  • 运行在网页环境,能操作网页 DOM。
  • 不能直接访问 background,但可以通过 chrome.runtime.sendMessage() 与 background 通信。

(3) background script

  • 持续运行,负责处理长期任务、监听事件、管理扩展的状态等。
  • 能与 popup 和 content script 进行通信。
主要通信方式

(1) popup ↔ background

  1. 单次消息传递
// popup.js
chrome.runtime.sendMessage({ action: "getData" }, (response) => {console.log("收到后台返回的数据:", response);
});// background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if (request.action === "getData") {sendResponse({ data: "这是来自后台的数据" });}
});
  1. 长连接(持久连接)
// popup.js
let port = chrome.runtime.connect({ name: "popup" });
port.postMessage({ action: "ping" });port.onMessage.addListener((msg) => {console.log("从后台收到:", msg);
});// background.js
chrome.runtime.onConnect.addListener((port) => {console.log("popup 连接上了:", port.name);port.onMessage.addListener((msg) => {if (msg.action === "ping") {port.postMessage({ reply: "pong" });}});
});

(2) content script ↔ background

  1. 单次消息传递
// content.js
chrome.runtime.sendMessage({ action: "fetchData" }, (response) => {console.log("收到后台返回的数据:", response);
});// background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if (request.action === "fetchData") {sendResponse({ data: "这是后台发送给 content script 的数据" });}
});
  1. 长连接
// content.js
let port = chrome.runtime.connect({ name: "content_script" });
port.postMessage({ action: "hello" });port.onMessage.addListener((msg) => {console.log("收到后台的回复:", msg);
});// background.js
chrome.runtime.onConnect.addListener((port) => {console.log("content script 连接上了:", port.name);port.onMessage.addListener((msg) => {if (msg.action === "hello") {port.postMessage({ reply: "world" });}});
});

(3) popup ↔ background ↔ content script(间接通信)
因为 popup 不能直接访问 content script,所以它们必须通过 background script 作为中介。

// popup.js
chrome.runtime.sendMessage({ action: "sendToContent", message: "你好,content script!" });// background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if (request.action === "sendToContent") {chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {chrome.tabs.sendMessage(tabs[0].id, { message: request.message });});}
});// content.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {console.log("收到 popup 传来的消息:", request.message);
});

写在最后

  1. 如果大家对开发扩展程序感兴趣,博主也贡上自己的扩展程序完整代码给大家 国际化助手
  2. 如果大家看到这里了,就给人美心善的博主点个赞赞支持一下吧,后续大家有任何相关的问题,可以评论区,也可以私信,博主有应必回,在此先感谢大家支持!!!

相关文章:

记一次基于manifest v3开发谷歌插件

背景 头疼在国际化功能普遍的前端项目中&#xff0c;如果你在处理或者在某一块功能上新增一些需求的时候&#xff0c;在没有国际化功能的页面中&#xff0c;我们随便复制一些文本&#xff0c;然后在vs code中全局搜索&#xff0c;很快就可以找到所要更改的代码文件在哪里&…...

C# OpenCvSharp 部署MOWA:多合一图像扭曲模型

目录 说明 效果 项目 代码 下载 参考 C# OpenCvSharp 部署MOWA&#xff1a;多合一图像扭曲模型 说明 算法模型的paper名称是《MOWA: Multiple-in-One Image Warping Model》 ariv链接 https://arxiv.org/pdf/2404.10716 效果 Stitched Image 翻译成中文意思是&…...

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …...

神经网络常见激活函数 5-PReLU函数

文章目录 PReLU函数导函数函数和导函数图像优缺点pytorch中的PReLU函数tensorflow 中的PReLU函数 PReLU 参数化修正线性单元:Parametric ReLU 函数导函数 PReLU函数 P R e L U { x x > 0 α x x < 0 ( α 是可训练参数 ) \rm PReLU \left\{ \begin{array}{} x \qua…...

2025我的第二次社招,写在春招之季

先说一个好消息&#xff0c;C那些事 4w star了&#xff01; 前面断更了一个月&#xff0c;本篇文章就可以看到原因&#xff0c;哈哈。 大家好&#xff0c;我叫光城&#xff0c;腾讯实习转正做后端开发&#xff0c;后去小公司做数据库内核&#xff0c;经过这几年的成长与积累&am…...

Visual Studio Code中文出现黄色框子的解决办法

Visual Studio Code中文出现黄色框子的解决办法 一、vsCode中文出现黄色框子-如图二、解决办法 一、vsCode中文出现黄色框子-如图 二、解决办法 点击 “文件”点击 “首选项”点击 “设置” 搜索框直接搜索unicode选择“文本编辑器”&#xff0c;往下滑动&#xff0c;找到“Un…...

threejs开源代码之-旋转的彩色立方体

效果&#xff1a;旋转的彩色立方体 效果描述&#xff1a; 一个立方体在场景中旋转。立方体的每个面有不同的颜色。使用自定义着色器为立方体添加动态的光影效果。 代码实现 import * as THREE from three; import { OrbitControls } from three/examples/jsm/controls/OrbitC…...

visual studio 2008的试用版评估期已结束的解决办法

visual studio 2008试用期过了后&#xff0c;再次启动时提示&#xff1a;visual studio的试用版评估期已结束。 需要的工具&#xff1a;补丁文件PatchVS2008.exe 解决办法&#xff1a; 1.在“控制面板”-“添加删除程序”中选择visual studio 2008&#xff0c;点击“更改/卸载”…...

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

Http和Socks的区别?

HTTP 和 SOCKS 的区别 HTTP 和 SOCKS 都是用于网络通信的协议&#xff0c;但它们在工作原理、应用场景和实现方式上有显著的区别。以下是详细的对比和说明。 一、HTTP 协议 1. 定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09;是用于传输超文本数据的应用层协…...

VC播放mp3的方法

1、使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") .......//打开文件MCI_OPEN_PARMS mciOpen; mciOpen.lpstrDeviceType _T("mpegvideo"); mciOpen.lpstrElementName _T("c://1.mp3"); MCIERROR mciError mci…...

Docker 部署 verdaccio 搭建 npm 私服

一、镜像获取 # 获取 verdaccio 镜像 docker pull verdaccio/verdaccio 二、修改配置文件 cd /wwwroot/opt/docker/verdaccio/conf vim config.yaml config.yaml 配置文件如下&#xff0c;可以根据自己的需要进行修改 # # This is the default configuration file. It all…...

49-拓展(1)

49-拓展&#xff08;1&#xff09; 扩展概述 扩展可以为在当前 package 可见的类型&#xff08;除函数、元组、接口&#xff09;添加新功能。 当不能破坏被扩展类型的封装性&#xff0c;但希望添加额外的功能时&#xff0c;可以使用扩展。 可以添加的功能包括&#xff1a; …...

国产编辑器EverEdit - 在文件中查找和替换

1 在文件中查找和替换 1.1 应用场景 某些场景&#xff0c;用户需要在所有工程文件中进行查找和替换关键词&#xff0c;比如&#xff1a;查找工程中哪些文件使用了某个常量。 1.2 使用方法 选择主菜单查找 -> 在文件中查找和替换&#xff0c;或使用快捷键Ctrl Shift F&a…...

安全行业大模型SecLLM技术白皮书

在ChatGPT 呈现全球现象级热度时&#xff0c;通用大语言模型&#xff08;Large Language Model, LLM&#xff09;技术成为了推动创新和变革的关键驱动力。但由于安全行业的特殊性和复杂性&#xff0c;LLM 并不能满足其应用需求。安全行业大模型(Security Large Language Model,…...

基础入门-HTTP数据包红蓝队研判自定义构造请求方法请求头修改状态码判断

知识点&#xff1a; 1、请求头&返回包-方法&头修改&状态码等 2、数据包分析-红队攻击工具&蓝队流量研判 3、数据包构造-Reqable自定义添加修改请求 一、演示案例-请求头&返回包-方法&头修改&状态码等 数据包 客户端请求Request 请求方法 …...

2025年日祭

本文将同步发表于洛谷&#xff08;暂无法访问&#xff09;、CSDN 与 Github 个人博客&#xff08;暂未发布&#xff09; 本蒟自2025.2.8开始半停课。 任务计划&#xff08;站外题与专题&#xff09; 数了一下&#xff0c;通过人数比较高的题&#xff0c;也就是我准备补的题&a…...

git命令行删除远程分支、删除远程提交日志

目录 1、从本地通过命令行删除远程git分支2、删除已 commit 并 push 的记录 1、从本地通过命令行删除远程git分支 git push origin --delete feature/feature_xxx 删除远程分支 feature/feature_xxx 2、删除已 commit 并 push 的记录 git reset --hard 7b5d01xxxxxxxxxx 恢复到…...

centOS8安装MySQL8设置开机自动启动失败

提供一个终极解决方案虽然systemctl 更符合管理预期但是不能用 使用一下命令 修改配置文件、修改mysql.service全是问题 systemctl start mysqld systemctl enable mysqld systemctl daemon-reload完全不生效各种报错 提示配置文件内容有问题 Main process exited, codeexite…...

对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xff0…...

基于LM22678的树莓派硬盘专用电源设计:解决供电不稳与电流冲击

1. 项目概述&#xff1a;为什么我们需要一个“专用”电源&#xff1f;如果你正在用树莓派搭配一块机械硬盘搭建一个家庭服务器或者个人云存储&#xff0c;可能已经遇到了一个不大不小的麻烦&#xff1a;供电不稳。树莓派官方推荐的5V/3A电源&#xff0c;单独带树莓派4B跑满负载…...

告别手写UI!用NXP GUI Guider拖拽设计LVGL界面,5分钟搞定音乐播放器Demo

嵌入式UI开发革命&#xff1a;5分钟用GUI Guider构建LVGL音乐播放器在嵌入式系统开发中&#xff0c;用户界面(UI)设计曾长期是工程师的痛点——既要考虑资源受限的硬件环境&#xff0c;又要实现流畅美观的交互体验。传统手动编写UI代码的方式不仅效率低下&#xff0c;调试过程更…...

全链路压测实战:双十一级别的流量,我是这样扛住的

作为一名在质量保障领域摸爬滚打多年的测试工程师&#xff0c;我深知传统的单接口压测在如今分布式架构下的无力感。当业务流量达到双十一这种脉冲式、高并发的级别时&#xff0c;任何一个非核心链路上的“短板”都可能引发系统性的雪崩。全链路压测不再是选择题&#xff0c;而…...

为什么92%的团队用DeepSeek生成方案仍需人工重写?揭秘缺失的2个元认知层与1套校验协议

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么92%的团队用DeepSeek生成方案仍需人工重写&#xff1f;揭秘缺失的2个元认知层与1套校验协议 当团队将DeepSeek-R1或DeepSeek-VL模型用于技术方案生成时&#xff0c;表面看响应迅速、逻辑连贯&…...

通过用量看板分析团队大模型API消耗发现优化调用策略的机会

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板分析团队大模型API消耗发现优化调用策略的机会 作为团队的技术负责人&#xff0c;确保大模型API调用在满足业务需求的…...

Ubuntu经常安装软件

1、垃圾清理工具stacer sudo apt updatesudo apt install stacer apt cleanapt autocleanapt autoremove 2、类似与everything的工具Fsearcch 1sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-stable 2sudo apt update 3sudo apt install fsearch (注&#xf…...

【国家级攻防演练级建议】:DeepSeek私有化部署中4类隐蔽后门植入路径与实时检测方案

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek私有化部署中隐蔽后门植入的攻防对抗本质 在私有化场景下&#xff0c;DeepSeek模型的部署链路常跨越镜像构建、权重加载、推理服务启动及API网关接入等多个环节。攻击者可利用构建上下文污染、依赖包劫…...

如何在5分钟内免费搭建工业级OpenPLC虚拟控制器

如何在5分钟内免费搭建工业级OpenPLC虚拟控制器 【免费下载链接】OpenPLC Software for the OpenPLC - an open source industrial controller 项目地址: https://gitcode.com/gh_mirrors/op/OpenPLC OpenPLC是一款功能强大的开源虚拟PLC&#xff08;可编程逻辑控制器&a…...

YOLO训练前数据检查必备:一个脚本批量转换LabelImg的txt标签并可视化核对

YOLO训练前数据检查实战&#xff1a;批量转换与可视化核验脚本开发指南 在计算机视觉项目的实际落地过程中&#xff0c;数据质量往往比模型架构更能决定最终效果的上限。许多团队花费大量时间调整超参数和网络结构&#xff0c;却忽略了最基础的标注数据验证环节。当使用LabelIm…...

机器学习预测细菌耐药性:从全基因组数据到公共卫生预警

1. 项目概述与核心价值抗菌药物耐药性&#xff08;AMR&#xff09;这事儿&#xff0c;现在谁提起来都头疼。它不再是实验室报告上的一个数字&#xff0c;而是直接关系到我们每个人生病了还有没有药可用的现实问题。弯曲杆菌&#xff0c;这个听起来有点拗口的名字&#xff0c;其…...