开发chrome扩展插件修改地址

news2024/9/26 5:15:05

引言

在前端开发过程中,一般分为三个环境:开发环境、测试环境和生产环境。这三个环境对于前端而言,不过就是请求的 API 接口不同罢了。如果是vue3项目,可以通过 import.meta.env.MODE来区分环境,可是站在后端兄弟角度,就必须修改配置文件的地址才能调试。如果要在本地调试,必须 clone 前端代码部署才行,这极为不方便。为此,我开发了一个 Chrome 插件用于解决这个问题,与项目的配置文件配合使用,可以提高后端同事的调试效率。

为什么采用插件

一般情况下,前端项目的配置文件会单独拧出来,方法网站根目录下。如果项目部署需要部署在不同的环境或者平台中,只需修改 config.js 的地址即可。我们可以将其挂载到window上,使之成为一个全局变量。通过浏览器的控制台console修改,这个没问题,但是如果页面刷新,修改的内容由于是保存在内存中,会被清空。

为此,修改的内容需要持久化储存。没错,数据可以储存在storage中,页面刷新后,可以从storage中读取应用。但是数据在控制台修改毕竟很繁琐,因此还需要一个可视化的页面去修改数据,将数据存储到storage中。如果开发一个前端页面去做这事,就有点得不偿失,而选择开发插件是一种更优的选择。

插件的介绍与开发

谷歌的插件网上有非常多的文档,本文只讲述为项目定制插件的核心实现。

其效果如下:
在这里插入图片描述
在这里插入图片描述

插件的功能

插件提供的功能非常简单。用户安装插件后,可以动态修改 接口地址,项目自动刷新,启用新的接口地址访问后台;在修改接口地址后,也可以恢复默认配置,系统会启用默认地址。

插件要主要解决的问题就是将输入的地址存储到网页的storage中,网页会去读取storage的值,并刷新页面,应用新值。

其核心工作与实现如下:

popup.html 界面

popup.html提供数据的入口以及交互操作界面,其中还会引入popup.js

<div class="container">
  <div class="formItem">
    <h3>MMS自定义API地址:</h3>
    <img id="reset" title="重置" />
  </div>
  <div>
    <p>BASE_URL:</p>
    <div class="formItem">
      <input type="text" id="baseURL" placeholder="http://" />
      <button id="btn">保存</button>
    </div>
  </div>
</div>
<script src="../js/popup.js"></script>
popup.js

popup.js的作用包括设置弹窗内容、响应用户交互、处理事件以及与后台脚本进行数据交换。由于popup.js无法与网页进行通信,因此需要借助于后台脚本。

响应用户交互,其实现如下,通过chrome.runtime.sendMessagebackground.js发送消息

/** 监听保存按钮事件 */
doms.btn.addEventListener("click", () => {
  const val = doms.input.value;
  if (val) {
    if (isValidURL(val)) {
      //判断输入是否是合法的url
      chrome.runtime.sendMessage(
        { action: "UPDATE_GLOBAL_VAR", value: val },
        (response) => {
          if (response.status === "success") {
            console.log("🚀设置BASE_URL成功");
            window.close();
          } else {
            alert("🚀设置BASE_URL失败");
          }
        }
      );
    } else {
      doms.input.value = preValue;
      alert("接口地址不合法");
    }
  }
});
background.js

background.js主要用于处理插件的后台逻辑和管理扩展的生命周期,此次开发中background.js主要做了两件事:

  • 1.安装成功后初始化storage.local的变量
  • 2.监听popup.js发送的消息以及接收到消息后,给popup.js一个反馈,并且将数据通过chrome.tab.sendMessage发送给content_script.js

其实现如下:

// background.js
console.log("🚀 加载background.js成功");

// background.js
chrome.runtime.onInstalled.addListener(() => {
  chrome.storage.local.set({ globalVar: null });
});

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.action === "UPDATE_GLOBAL_VAR") {
    chrome.storage.local.set({ globalVar: message.value });
    sendResponse({ status: "success" });
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
      chrome.tabs.sendMessage(tabs[0].id, {
        type: "UPDATE_CONTENT",
        data: message.value,
      });
    });
  }
});
content_script.js

插件中的content_script.js就像一个中转站一样,用于脚本和网页之间沟通的桥梁,监听二者的消息再转发。

content_script.jschrome.runtime.onMessage监听background.js的消息,再通过window.postMessage转发数据给网页
其实现如下:

chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
  console.log("Message received in content script:", message);
  if (message.type === "UPDATE_CONTENT") {
    console.log("Data from background:", message.data);
    window.postMessage({
      type: _CONST_.FROM_CONTENT_SCRIPT,
      data: message.data,
    });
  }
});

此外,由于插件还做到了初始配置的回显,所以在content_script.js中还通过window.addEventListener监听了网页的消息,如下

window.addEventListener("message", function (event) {
  if (
    event.source === window &&
    event.data.type &&
    event.data.type == _CONST_.FROM_CONTENT_WEBPAGE
  ) {
    console.log("🚀 ~ WebPage`s Message received in content script:", event);

    // 定义你想要获取的数据键
    const keys = ["globalVar"];

    chrome.storage.local.get(keys, function (result) {
      console.log("🚀 ~ result:", result);
      // 确保获取的数据存在
      if (chrome.runtime.lastError) {
        console.error("Error retrieving data:", chrome.runtime.lastError);
        return;
      }

      const webPageValue = event.data.data;

      //存储最初始的值,用于重置
      if (result.globalVar == null) {
        chrome.storage.local.set({ originalValue: webPageValue });
      }
      // 处理获取的数据
      if (result.globalVar != webPageValue) {
        chrome.storage.local.set({ globalVar: webPageValue });
      }
    });
  }
});

content_script.js接收到网页消息后,将数据存储在chrome.storage.local中。

config.js

config.js不属于插件的内容,存在于前端项目中,但是config.js相当于是数据的最终接收方和响应对象。

其实现如下:

window.addEventListener("message", function (event) {
  if (
    event.source === window &&
    event.data.type &&
    event.data.type == _CONST_.FROM_CONTENT_SCRIPT
  ) {
    window.localStorage.setItem(
      _CONST_.CONFIG_PLUGIN,
      JSON.stringify({ BASE_URL: event.data.data })
    );
    window.location.reload();
  }
});

let CONFIG_PLUGIN_STORAGE = window.localStorage.getItem(_CONST_.CONFIG_PLUGIN);

CONFIG_PLUGIN_STORAGE = CONFIG_PLUGIN_STORAGE
  ? JSON.parse(CONFIG_PLUGIN_STORAGE)
  : {};

window.config = {
  BASE_URL: "http://192.168.145.74:18430",
  ...CONFIG_PLUGIN_STORAGE,
};

window.postMessage({
  type: _CONST_.FROM_CONTENT_WEBPAGE,
  data: window.config.BASE_URL,
});

config.js的作用增强了,除了提供接口地址。它还承担了重要的作用。主要功能如下:

  • 监听content_script.js脚本发送的消息,然后将新数据存储到localStorage中去,最后刷新页面
  • 读取localStorage中数据,组装成环境地址接口
  • content_script.js发送消息

总结

插件的开发一定要符合 chrome 插件开发规范,脚本间的通信要一 一对应。通过crx格式安装的扩展插件的前提是插件要打包发布在 Chrome 的应用商店中,一次性收费25$

github地址,如果本文或插件对您有帮助,请给一个star。

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

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

相关文章

短剧看剧系统+商城功能,开发uniapp+PHP,正版片源供授权,短剧影视小程序带支付收益等模式 付费短剧小程序源码

目录 一、短剧看剧系统是什么&#xff1f; 二、短剧授权是什么&#xff1f; 三、短剧有哪些类型&#xff1f; 四、区别&#xff1f; 总结&#xff1a; 一、短剧看剧系统是什么&#xff1f; 首先小程序上架需要有资质(办资质需要20-30天)。 1、短剧微信小程序要求:《广播电…

无外网的redis本地登录测试

输入命令&#xff1a; redis-cli -h 127.0.0.1 -p 6379 redis 127.0.0.1:6379> redis 127.0.0.1:6379> keys * (error) ERR operation not permitted redis 127.0.0.1:6379> select 1 (error) ERR operation not permitted redis 127.0.0.1:6379[1]> …

保姆级教程:Dupay从注册到充值开卡全过程,可开GPT Plus、可绑定GPT充值API余额

前言 想要购买GPT Plus&#xff0c;或者给GPT充值&#xff0c;绑定国内visa信用卡&#xff0c;会被拒&#xff0c;于是便问问度娘&#xff0c;找到了一篇关于注册虚拟卡的教程&#xff0c;搬过来顺便修改下&#xff01; 应用场景 1、Depay Master Visa卡支持绑定宝、微、美外…

高并发代理IP有哪些优势?

在当今数字化时代&#xff0c;随着互联网的迅猛发展&#xff0c;各类在线服务、电商平台、社交媒体及云计算应用等正以前所未有的速度增长&#xff0c;而这些系统的稳定运行和高效性能往往依赖于强大的服务器架构和高效的数据处理能力。高并发代理IP作为应对高流量、高并发访问…

Java导入包com.alibaba.fastjson2.JSONObject

com.alibaba.fastjson2.JSONObject 是阿里巴巴的 fastjson 库中的一个类&#xff0c;用于处理 JSON 数据。 这里提供一些常见的使用示例和可能的问题解决方法。 解决方案和示例代码: 创建 JSONObject 对象: import com.alibaba.fastjson2.JSONObject;JSONObject jsonObject …

TeeChart助力科研软件:高效实现数据可视化

在当今的科学研究中&#xff0c;数据可视化已经成为理解和传播复杂信息的关键工具。尤其是在物理研究领域&#xff0c;科学家们经常需要处理大量的数据&#xff0c;并通过可视化将这些数据转化为更易理解的形式。TeeChart作为一个强大且灵活的图形展示工具&#xff0c;能够帮助…

SpringBoot2:RESTFUL风格接口开发及源码解读

一、RESTFUL简介 Rest风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…

Hadoop是什么?

Hadoop 是什么 1&#xff09;Hadoop 是一个由 Apache 开发的分布式系统基础架构&#xff1b; 2&#xff09;主要解决&#xff1a;海量数据的存储和海量数据的分析计算问题&#xff1b; 3&#xff09;广义上来说&#xff0c;HADOOP 通常是指——HADOOP 生态圈&#xff1b; H…

福田区专精特新小巨人奖励最高50万元!

深圳市福田先进制造业-专精特新企业认定支持&#xff0c;对小巨人给予最高50万元补贴。下面深科信整理项目完整申报条件如下&#xff1a; 专精特新企业奖励标准 对入选专精特新企业名单的企业&#xff0c;符合以下申请条件的&#xff0c;给予一般不超过50万元支持。同一企业同…

【圣诞营销秘籍】Newsbreak上引爆欧美圣诞饰品电商广告的创意攻略

【圣诞营销秘籍】Newsbreak上引爆欧美圣诞饰品电商广告的创意攻略 随着冬日雪花的悄然飘落&#xff0c;欧美大地迎来了最为温馨浪漫的节日——圣诞节。对于电商行业而言&#xff0c;这不仅是销售旺季的巅峰&#xff0c;更是品牌展示创意与魅力的绝佳时机。Newsbreak&#xff0c…

计算机毕业设计选题推荐-餐饮管理系统-餐厅点餐系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

充电桩变压器电容补偿要带电抗器吗

为充电桩变压器配置电容补偿时&#xff0c;是否需要加装电抗器取决于具体的电力环境和负载特性。以下是一些考虑因素&#xff1a; 1、谐波含量 充电桩通常是非线性负载&#xff0c;会产生较多的谐波。如果电力系统中谐波含量较高&#xff0c;直接使用电容补偿可能会导致电容器…

2024年最强图纸加密软件大揭秘!图纸加密软件推荐

在数字化时代&#xff0c;信息安全成为企业发展的重要保障&#xff0c;尤其是对于设计图纸等敏感数据的保护&#xff0c;选择一款可靠的图纸加密软件尤为重要。本文将为您推荐2024年十大图纸加密软件&#xff0c;帮助企业在日常工作中更好地保护知识产权和商业机密。 2024年最强…

《JavaEE进阶》----6.<SpringMVC实践项目:【简易两整数加法计算器】>

本篇博客简单的记录了我的第一个JavaEE实践项目 网页版 简易两整数加法计算器 的前段代码&#xff0c;前端页面&#xff0c;后端代码、及计算结果的展示。 使用了form表单来进行前后端的交互 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <…

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…

近2千消防题库工程师题库ACCESS\EXCEL数据库

这次获得的一批行业题库&#xff0c;数据库表结构都是一样的&#xff0c;有《近万条电气工程师考试题库》、《1万2千多条电工考试题库》、《5千多道安全生产证考试题库》以及今天的消防工程师题库。 大类记录汇总情况&#xff1a;高级#注#册#消防工程师&#xff08;790&#xf…

如何在算家云搭建OpenSora 1.2(文本生成视频)

一. OpenSora 1.2简介 1. 技术特点 高清视频生成 &#xff1a; OpenSora 1.2 在 720p 高清文生视频质量和生成时长上取得了突破性进展&#xff0c;支持无缝产出任意风格的高质量短片。通过引入视频压缩网络&#xff08;VAE&#xff09;和更优的扩散模型算法&#xff0c;显著…

设置电子签名

设置点赞签名代码 export class Signature {width: number 300height: number 300canvas!: HTMLCanvasElementctx!: CanvasRenderingContext2Dprivate drawing: boolean falsepreTask: string[] []nextTask: string[] []private allTask: { x: number; y: number; color: …

阿里巴巴API在电商中的新应用:商品详情实时获取与解析

阿里巴巴API在电商中的新应用主要体现在商品详情实时获取与解析上&#xff0c;这对于提升电商平台的数据处理能力、用户体验以及运营效率具有重要意义。以下将详细介绍这一应用&#xff0c;并包含具体的代码示例。 一、阿里巴巴商品详情API概述 阿里巴巴商品详情API是阿里巴巴…

监控易赋能行动:打造专业运维监控团队,助力代理商成长

在当今数字化转型的浪潮中&#xff0c;运维监控作为确保业务连续性和稳定性的关键一环&#xff0c;其重要性日益凸显。作为行业领先的运维监控解决方案提供商&#xff0c;监控易深知合作伙伴在市场拓展和服务交付中的核心作用。为此&#xff0c;我们隆重推出“监控易赋能行动”…