从零开始,轻松打造个人化Chrome浏览器插件

说在前面

在我日常开发以及娱乐生活中,浏览器是我使用频率较高的一个应用,当我大学拥有第一部电脑开始,之后不论电脑换成什么,以及使用的是什么系统,我的首选浏览器都是Chrome,不仅仅是因为其速度快,更多是它丰富的扩展在吸引我,那么大家有没有想过如何自己来开发一个Chrome浏览器插件呢?是不是有的同学会觉得Chrome浏览器插件的制作难度会很大呢?今天就让我来带你们看看一个简单的Chrome浏览器插件的编写过程,并给大家制作一个简单的插件模板,大家可以通过模板来进行快速开发。

一、项目结构

一个完整的插件目录结构如下:

(一)html + js

1、manifest.json

简单配置,具体配置说明已在配置项后标出。

{
  "manifest_version": 2, //版本号,由google指定为2
  "name": "helloWorld", //插件名称
  "version": "1.0", //插件版本
  "description": "hello world 插件", //插件描述
  "icons": {
    //插件图标
    "128": "img/logo.jpg",
    "48": "img/logo.jpg",
    "16": "img/logo.jpg"
  },
  "browser_action": {
    "default_icon": "img/logo.jpg", //插件图标
    "default_popup": "default_popup" //点击图标后弹出的html互动文件
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"], //匹配url
      "js": ["bg.js"], //执行脚本
      "run_at": "document_start" //脚本运行时机
    }
  ],
  "permissions": ["tabs", "activeTab"] //权限申请
}

使用"content_scripts"你可以修改你当前访问的页面的dom,主要是靠js实现的,里面的"matches"是一个数组,里面装的是一些匹配的规则,意思就是当你的页面的地址满足数组里面的值的时候就会操作js文件,all_urls表示所有网页都会加载脚本。而"js"里面的是具体的操作,具体操作就是要自己写了。

2、popup.html

插件弹窗页,可以直接编写一个html页面,在manifest.json中的default_popup项进行配置即可。

<!DOCTYPE html>
<html lang="">
  <head>
    <title>helloWorld</title>
    <meta charset="utf-8" />
  </head>
  <body style="width: 200px; height: 200px">
    <h1 id="message">你好</h1>
    <input id="input1" type="text" />
  </body>
  <script src="js/popup.js"></script>
</html>
3、popup.js

插件弹窗页的脚本js代码,在popup.html页面中引入即可。

(function () {
  const input1 = document.getElementById("input1");
  const message = document.getElementById("message");
  input1.addEventListener("keyup", (e) => {
    message.innerHTML = "你好" + e.target.value;
    chrome.tabs.query({ active: true, currentWindow: true }, function (tab) {
      chrome.tabs.sendMessage(
        tab[0].id,
        {
          action: "hello",
          data: message.innerHTML,
        },
        function (response) {
          console.loig("收到回复:", response.state);
        }
      );
    });
  });
})();
4、bg.js

运行在浏览器打开tab窗体的脚本,需要在manifest.json中的content_scripts中进行配置。

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  const { action, data } = request;
  console.log("%c Line:4 🥔 action,data", "color:#b03734", action, data);
  sendResponse({ state: "已接收到数据" + data });
});

(二)vue + js

1、使用vue来编写插件弹窗页

1676816205721.png

使用vue来编写插件弹窗页面,我们可以将项目结构简化成这样,只需要修改manifest.json中的default_popup为vue项目打出的dist包即可。

{
  "manifest_version": 2, //版本号,由google指定为2
  "name": "helloWorld", //插件名称
  "version": "1.0", //插件版本
  "description": "hello world 插件", //插件描述
  "icons": {
    //插件图标
    "128": "img/logo.jpg",
    "48": "img/logo.jpg",
    "16": "img/logo.jpg"
  },
  "browser_action": {
    "default_icon": "img/logo.jpg", //插件图标
    "default_popup": "demo/dist/index.html" //点击图标后弹出的html互动文件
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"], //匹配url
      "js": ["bg.js"], //执行脚本
      "run_at": "document_start" //脚本运行时机
    }
  ],
  "permissions": ["tabs", "activeTab"] //权限申请
}

并将popup.js文件移到vue项目中,在index.html中引入即可。

1676821818851.png

二、浏览器导入插件

(一)进入chrome扩展程序管理页

1676816452670.png

1676816528511.png

(二)加载扩展程序

1676816613593.png

1676819409171.png

(三)页面使用插件

1676819535278.png

1676819559826.png

三、模板源码

(一)gitee源码下载

模板代码已上传到gitee,具体地址如下:

https://gitee.com/zheng_yongtao/chrome-plug-in.git

1676819669819.png

(二)依赖下载

拉取模板代码之后需要先下载vue模板的依赖(npm install)。

1676819821457.png

(三)vue打包

安装好vue模板的依赖之后,就可以对vue项目进行打包(npm run build)。

1676819895550.png

(四)命令行快速安装

目前插件模板已集成到脚手架jyeontu工具中,我们可以通过它来快速生成一个插件目录模板。

  • 安装脚手架
npm install -g jyeontu

安装完成后运行创建模板命令

jyeontu create

拉取最新模板文件之后选择创建chrome浏览器模板即可。
在这里插入图片描述

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis中的缓存穿透、雪崩、击穿(详细)

目录 一、概念 1. 缓存穿透&#xff08;Cache Penetration&#xff09; 解决方案&#xff1a; 2. 缓存雪崩&#xff08;Cache Avalanche&#xff09; 解决方案&#xff1a; 3. 缓存击穿&#xff08;Cache Breakdown&#xff09; 解决方案&#xff1a; 二、三者出现的根本原…

dbeaver连接amabri-hbase

目录 尝试过程 解决之道 总结 尝试过程 注意此章节为记录试错过程&#xff0c;无需跟随操作&#xff0c;仅作试错记录。真正操作方法请看“解决之道”章节 环境ambari安装的hbase2.1.6 使用apche phoenix默认驱动配置 备注&#xff1a;Apache Phoenix 是一个开源的、基于…

Amazon CodeWhisperer 使用体验

文章作者&#xff1a;STRIVE Amazon CodeWhisperer 是最新的代码生成工具&#xff0c;支持多种编程语言&#xff0c;如 java,js,Python 等&#xff0c;能减少开发人员手敲代码时间&#xff0c;提升工作效率。PS:本人是一名 CodeWhisperer 业余爱好者 亚马逊云科技开发者社区为开…

文件中找TopK问题

目录 1.解题思路2.创建一个文件并在文件中写入数据3.为什么要建立小堆而不建立大堆&#xff1f;4.如何在现有的数据中建立适合的大堆&#xff1f;5.代码实现 1.解题思路 TopK问题即是在众多数据中找出前K大的值&#xff0c;则可以根据堆的性质来实现&#xff0c;但在使用堆之前…

R语言gWQS包在加权分位数和回归模型的应用

在流行病学研究中&#xff0c;相较于单一因素的暴露&#xff0c;多因素同时暴露的情况更为常见。传统模型在评价多因素联合暴露时存在数据维度高、多重共线性等问题. WQS 回归模型的基本原理是通过分位数间距及加权的方法&#xff0c;将多种研究因素的效应综合成为一个指数&…

华为云cce负载配置时间同步

华为云cce将负载配置好之后&#xff0c;发现里面的时间与真实时间不同步&#xff0c;差了12小时&#xff0c;怎么办&#xff1f; 这时候就需要配置时间同步了。 华为云cce里面通过配置数据存储的路径来解决这个问题的&#xff0c;配置后&#xff0c;需要重启负载。 新建负载…

python实验3 石头剪刀布游戏

实验3&#xff1a;石头剪刀布游戏 一、实验目的二、知识要点图三、实验1. 石头剪刀布2. 实现大侠个人信息 一、实验目的 了解3类基本组合数据类型。理解列表概念并掌握Python中列表的使用。理解字典概念并掌握Python中字典的使用。运用jieba库进行中文分词并进行文本词频统计。…

JSON.stringify方法详解 后端接受JSON数据格式

1、方法定义&#xff1a;JSON.stringify(value, replacer, space) 参数说明&#xff1a; value&#xff1a;js对象 replacer&#xff1a;替换对象&#xff0c;可以是一个方法、对象或数组&#xff0c;将value按照替换规则展示。 space&#xff1a;填充参数&#xff0c;可以是数…

Protocol handler start failed

背景 上一次启动项目还好好的&#xff0c;关闭项目重新打开时&#xff0c;报错了&#xff01; 报错提示 英文&#xff1a;Protocol handler start failed 翻译&#xff1a;协议处理程序启动失败 原因 端口被其他程用了&#xff0c;导致端口冲突。 解决方案 打开任务管理…

深入理解Java中的String、StringBuilder和StringBuffer(每天一个技术点,第一天)

大家好&#xff0c;我是你们的博主每天一个技术点。今天&#xff0c;我们将探讨Java中的一个重要主题&#xff1a;String、StringBuilder和StringBuffer。这些类在Java编程中无处不在&#xff0c;但它们之间的区别和用法可能并不是所有人都清楚。所以&#xff0c;让我们深入了解…

10分钟的时间,带你彻底搞懂JavaScript数据类型转换

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热衷分享有趣实用的文章&#xff0c;希望大家多多支持&#xff0c;一起进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 JS数据类型 3种转换类型 ToBoolean ToString ToNumber 对象转原…

Flutter加固原理及加密处理

​ 引言 为了保护Flutter应用免受潜在的漏洞和攻击威胁&#xff0c;加固是必不可少的措施之一。Flutter加固原理主要包括代码混淆、数据加密、安全存储、反调试与反分析、动态加载和安全通信等多个方面。通过综合运用这些措施&#xff0c;可以提高Flutter应用的安全性&#xf…

【UE】热成像效果

效果 步骤 1. 新建一个空白项目&#xff0c;勾选“光线追踪”选项 2. 添加一个第一人称游戏内容包到项目 3. 打开第一人称角色蓝图“BP_FirstPersonCharacter”&#xff0c;添加一个后期处理组件 在事件图表中设置通过按键N来切换不同的后期处理效果 将后期处理设置引脚提升为…

golang—kafka架构原理快速入门以及自测环境搭建(docker单节点部署)

kafka Apache Kafka 是一个分布式的流处理平台。它具有以下特点&#xff1a; 支持消息的发布和订阅&#xff0c;类似于 RabbtMQ、ActiveMQ 等消息队列支持数据实时处理能保证消息的可靠性投递支持消息的持久化存储&#xff0c;并通过多副本分布式的存储方案来保证消息的容错高…

SaaS模式C/S检验科LIS系统源码

适用于医院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和住…

TEMU和SHEIN平台的卖家了解测评吗?

最近越来越多的商家都入驻了temu和shein平台&#xff0c;为了让自己的产品能更具有优势&#xff0c;就会用到测评来做一些产品销量和评论&#xff0c;那么测评应该怎么做呢&#xff1f; 测评就是卖家通过测评平台&#xff0c;社区&#xff0c;红人等等这些联系国外的买家&…

el-select多选框,数据拼接

将多选框数据 按照逗号拼接为字符串 getTagIds(data, type) {if (type "array") {let array data.join(",")return array} else {let string data.split(",");return string}}, 在调用这个方法时需要&#xff0c;另外传一个字符串type,以此来…

面试篇之微服务(一)

目录 概览 1.什么是微服务&#xff1f; 2.微服务带来了哪些挑战&#xff1f; 3.现在有哪些流行的微服务解决方案&#xff1f; 这三种方案有什么区别吗&#xff1f; 4.说下微服务有哪些组件&#xff1f; 注册中心 5.注册中心是用来干什么的&#xff1f; 6.SpringCloud可…

Embassy 库下载代码示例

解决方案&#xff1a; swift import Embassy let downloader Downloader() // 使用代理主机和端口 downloader.useProxy(proxyHost: ") // 下载 URL 的内容 let content downloader.download(from: "") // 输出下载的内容 print(content) 这个程序首先…

Spring Cloud Stream如何屏蔽不同MQ带来的差异性?

引言 在当前的微服务架构下&#xff0c;使用消息队列&#xff08;MQ&#xff09;技术是实现服务解耦和削峰填谷的重要策略。为了保证系统的灵活性和可替换性&#xff0c;我们需要避免对单一开源技术的依赖。 市面上有多种消息队列技术&#xff0c;如 Kafka、RocketMQ、Rabbit…