浏览器插件的开发

文章目录

  • 构成
  • 使用vue编写插件
  • 插件中向其他服务器发送请求

官方文档地址: https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world?hl=zh-cn

构成

插件目录的主要构成:

  • manifest.json文件:描述了扩展程序的功能和配置
    有如下几个常用配置:

    • name:扩展程序名字
    • icons: 声明扩展程序图标
    • manifest_version: 扩展程序版本
    • content_scripts:声明插件的主要执行代码,入口文件
    {
      "content_scripts": [
        {
          "js": ["scripts/content.js"], //执行的js文件
          "css": [], //执行的css文件
          "matches": [ // 需要在哪些网站上使用该插件
            "https://developer.chrome.com/docs/extensions/*",
            "https://developer.chrome.com/docs/webstore/*"
          ]
        }
      ]
    }
    

    由于插件运行在浏览器中,所以在content_scripts声明的js代码中可以获取到当前页面的所有内容,可以对页面的DOM进行操作。

    • background:配置插件本身的一些js代码
     "background": {
            "service_worker": "background.js"
        },
    
    • action:用于声明 Chrome 应用作扩展程序的操作图标的图片,以及当用户点击扩展程序的操作图标时在弹出式窗口中显示的 HTML 页面。
    {
      "manifest_version": 3,
      "name": "Hello Extensions",
      "description": "Base Level Extension",
      "version": "1.0",
      "action": {
        "default_popup": "hello.html",
        "default_icon": "hello_extensions.png"
      }"icons": {
        "16": "images/icon-16.png",
        "32": "images/icon-32.png",
        "48": "images/icon-48.png",
        "128": "images/icon-128.png"
      }
    }
    

    API配置文档:https://developer.chrome.com/docs/extensions/reference/api/accessibilityFeatures
    通过多种方式构建扩展程序项目;不过,唯一的前提条件是将 manifest.json 文件放在扩展程序的根目录中。

  • js文件:content_scripts声明的js文件,包含插件的主要逻辑,主要是对目标网站做一些DOM和BOM操作。

  • backgrounds.js文件:service_worker声明的js
    该文件用于处理扩展程序一些监听事件,如插件安装,更新等。
    eg:

    // 插件安装完之后执行的一些操作
    chrome.runtime.onInstalled.addListener(() => {
      chrome.action.setBadgeText({
        text: "OFF",
      });
    });
    //插件更新之后执行的一些操作
    chrome.runtime.onUpdateAvailable.addListener(() => {
      chrome.runtime.reload();
    });
    

使用vue编写插件

可以使用vue编写插件,只是manifest.json中”content_scripts“ 字段对应的”js“是vue打包后的代码路径。

  • 固定vue打包的包名:
    一般情况下vue打包的包名是动态改变的,但是如果他作为”content_scripts“ 字段的参数我们希望他是静态的,所以需要在打包的时候做一些配置:
    vue.config.js

     chainWebpack: (config) => {
      // 指定打包的名字
        config.output.filename("js/[name].js").end();
        config.plugin("MiniCssExtractPlugin").use(
          new MiniCssExtractPlugin({
            filename: "css/[name].css", //输出文件名 ,地址名
          })
        );
        // babel-polyfill:用于在旧版本的浏览器中添加缺失的功能和新的 JavaScript API 的垫片(polyfills)
        config.entry("main").add("babel-polyfill");
        config.module
          .rule("vue")
          .use("vue-loader")
          .tap((options) => ({
            ...options,
            compilerOptions: {
              // 将任何以ion-开头的标签视为自定义元素
              isCustomElement: (tag) => ["marquee"].includes(tag),
            },
          }));
      },
    
  • manifest.json
    manifest.json清单中将vue打包生成的所有js,css文件都一起引入:

    "content_scripts": [
            {
                "js": [
                    "dist/js/app.js",
                    "dist/js/chunk-vendors.js",
                    "dist/js/main.js",
                    "dist/js/681.8ccf3896.js"
                ],
                "css": [
                    "dist/css/app.css"
                ],
            }
        ],
    

这样就可以了。

插件中向其他服务器发送请求

在插件中可以使用axios发送请求,但是如果目标服务器的地址不是当前浏览器页面的地址的时候需要使用 chrome.runtime.sendMessage将请求转发到background.js,在该文件中使用chrome.runtime.onMessage.addListener监听并转发请求。

插件逻辑中发送请求:

chrome.runtime.sendMessage(
        {
          type: "postData",
          url: `目标地址`,
          data: params,
        },
        (res: any) => {
          if (!res) {
            message.error("Please check if you are logged into the system.");
          }
         }
  )

backgrounds.js中接受请求

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.type === "postData") {
    const url = `${request.url}`;
    fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(request.data),
    })
      .then((response) => response.json())
      .then((json) => sendResponse(json))
      .catch((err) => sendResponse(err));
  } else if (request.type === "getData") {
    const url = `${request.url}`;
    fetch(url, {
      method: "GET",
      headers: {
        "Content-Type": "application/json",
      },
    })
      .then((response) => response.json())
      .then((json) => sendResponse(json))
      .catch((err) => sendResponse(err));
  }
  return true;
});

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

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

相关文章

Linux-笔记 OverlayFS文件系统入门

目录 前言 主要概念 工作原理 特点特性 1、上下合并 2、同名文件覆盖 3、同名目录合并 4、写时拷贝 实操入门 内核配置 挂载文件系统 验证 1、同名文件覆盖 2、同名目录合并 3、写时拷贝 1)验证新增文件或目录 2)验证修改文件 3&…

2024最新谷歌镜像网站入口分享

google谷歌搜索引擎最新可用镜像站列表:(注意不要登录账号,镜像站并非谷歌官方网站) 谷歌镜像网站1:https://google.cloudnative.love/ 谷歌镜像网站2:https://gsearch.g.shellten.top/ 谷歌镜像网站3&…

【论文阅读】--Popup-Plots: Warping Temporal Data Visualization

弹出图:扭曲时态数据可视化 摘要1 引言2 相关工作3 弹出图3.1 椭球模型3.1.1 水平轨迹3.1.2 垂直轨迹3.1.3 组合轨迹 3.2 视觉映射与交互 4 实施5 结果6 评估7 讨论8 结论和未来工作致谢参考文献 期刊: IEEE Trans. Vis. Comput. Graph.(发表日期: 2019&…

螺丝扭断力试验机SJ-12

一、设备简介: 螺丝扭断力试验机用于测试螺丝的耐扭断力。本机将螺丝产品所受到轴向扭转力与反作用力,常用扭力扳手来计量。本机可对产品进行转力测、锁动测试、锁动扭力测试等多种测试方式。 二、设备使用: 1、将螺丝强度扭力试验机底座锁于…

天润融通:AI赋能客户体验,推动企业收入和业绩增长

“客户体验已经成为全球企业差异化的关键。人工智能与数据分析等创新技术正在加速推动企业在客户体验计划中取得成功,以保持领先地位”。Customer Insights & Analysis 研究经理Craig Simpson说道。 客户体验 (CX,Customer Experience) 是客户在与企…

STM32CubeMX与RT-Thread Studio协助使用(实现点亮LED)

1创建自己的项目 1-1选择板子 1-2生成的项目 运行一下看是否创建成功 零警告零错误 2配置STM32Cude 2-1找打如图图标点击(CubeMX的图标) 2-2输入自己安装的路径选中exe文件 点击Browse 找到如图选中,在打开(STM32CubeMX的安装路…

变长的时间戳设计,第2版

以前的时间戳有32位,以秒为单位,231秒≈68年,从1970年开始,到2038年会出问题。 现在的时间戳有64位,表达范围仍然受限。 设计变长的时间戳,以32位为单元,最短有32位,最长有328256位…

如何使用代理 IP 防止多个 Facebook 帐户关联 - 最佳实践

在社交媒体被广泛应用的今天,Facebook作为全球最大的社交网络平台之一,面临着很多挑战,其中之一就是用户行为的管理和安全。 为了防止多个账户之间的关联和滥用,Facebook需要采取一系列措施,其中包括使用静态住宅代理…

【Redis】数据持久化

https://www.bilibili.com/video/BV1cr4y1671t?p96 https://blog.csdn.net/weixin_54232666/article/details/128821360 单点redis问题: 数据丢失问题:实现Redis数据持久化并发能力问题:搭建主从集群,实现读写分离故障恢复问题&…

探索顺序结构:栈的实现方式

🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ​​ 一、栈的定义 栈(Stack&#xf…

鸿蒙开发系统基础能力:【@ohos.screenLock (锁屏管理)】

锁屏管理 锁屏管理服务是OpenHarmony中系统服务,为锁屏应用提供注册亮屏、灭屏、开启屏幕、结束休眠、退出动画、请求解锁结果监听,并提供回调结果给锁屏应用。锁屏管理服务向三方应用提供请求解锁、查询锁屏状态、查询是否设置锁屏密码的能力。 说明&a…

thinksboard新建菜单

1.打开目录\thingsboard\ui-ngx\src\app\modules\home\pages新增npages文件夹 2.新增npages.module.ts以及npages-routing.module.ts控制文件,以及页面展示文件npages.component.html,npages.component.scss,npages.component.ts 3.打开npages.component.ts文件&…

RT-Thread 实时系统介绍

介绍 RT-Thread 是一款开源的实时操作系统,主要面向物联网设备。它支持多种芯片架构,具有安全、低功耗、智能、可伸缩的特性。RT-Thread 拥有超过16年的技术积累,广泛应用于各行业,装机量达数十亿台。它提供了包括设备虚拟文件系…

VMware Windows sever 虚拟机互联网连接配置

一、VMware配置 1、虚拟网络编辑 从左上角 编辑→虚拟网络编辑器 进入 2、配置NAT模式 配置的子网IP,在虚拟机中获取到的ip跟子网IP的前三个是一样的 1.配置网关 2.配置DHCP设置 这个主要是分配ip最后一位获取的区间 3、虚拟机配置 二、Windows Server 虚拟机配置…

多接口分线盒在工业自动化中的重要性与应用

简介 多接口分线盒是现代工业自动化中不可或缺的一个组成部分,它主要用于简化复杂的接线系统,提高效率和可靠性。本文将详细探讨多接口分线盒的定义、功能、以及在工业自动化中的应用情况。 无源多接口分线盒 多接口分线盒的定义与功能 多接口分线盒是…

基于Pytorch框架构建VGG-19模型

Pytorch 一、训练模型1.导入资源包2.定义数据预处理3.读取数据 二、定义VGG19模型1.定义自定义的 VGG19 模型运行结果: 四、验证模型1. 定义验证过程2.用于训练模型并应用学习率调整策略的循环运行结果:3.保存模型的状态字典 三、训练模型1. 定义训练函数…

MySQL—存储过程(详细介绍与基本语法)

目录 一、存储过程——介绍 (1)基本介绍 (2)基本特点 二、存储过程——语法 (1)基本语法 创建 调用 (2)实操(创建和调用) 1、创建一个叫 "p1&qu…

2024年6月26日 (周三) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 土豆录屏: 免费、无录制时长限制、无水印的录屏软件 《Granblue Fantasy Versus: Risi…

K210视觉识别模块学习笔记6: 识别苹果_图形化操作函数_

今日开始学习K210视觉识别模块: 图形化操作函数 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 训练网站: 嘉楠开发者社区 今日学习如何在识别到目标的时候添加图形化操作:(获取坐标、框出目标等) 在识别苹果的基础上 学习与添加 这些操…

在前端开发过程中如果函数参数很多,该如何精简

1. 在前端开发过程中如果函数参数很多,该如何精简 1.1. 对象参数(对象字面量):1.2. 默认参数和解构赋值:1.3. 使用类或构造函数:1.4. 利用闭包或者高阶函数:1.5. 利用ES6的扩展运算符&#xff1…