浏览器插件开发实战

浏览器插件开发实战

  • [1] 入门DEMO
    • 一、创建项目
    • 二、创建manifest.json
    • 三、加载插件
    • 四、配置 service-worker.js
    • 五、以书签管理器插件为例
      • manifest.json
      • popup.html
      • popup.js
      • 查看效果
  • [2] Vue项目改造成插件
    • 一、复习Vue项目的结构
    • 二、删除、添加个别文件
    • 三、重写build
  • [3] 高级开发
    • 一、脚本通信

Google官方浏览器插件中文文档:https://developer.chrome.com/docs/extensions/reference?hl=zh-cn

Google官方浏览器插件示例代码仓:https://github.com/GoogleChrome/chrome-extensions-samples/tree/main

[1] 入门DEMO

一个最简单的Hello World级别的插件项目,最好要有三个文件:

1. manifest.json
2. service-worker.js

其中,manifest.json文件是插件程序说明文档,也是描述入口设置文档;service-worker.js是全局的js文件。接下来我们说明一下开发过程

一、创建项目

创建目录后,进入该目录路径

mkdir plugin_demo
cd plugin_demo

创建一个资源目录

mkdir icons

拖入你的插件图标,官方通常推荐是16x16, 32x32, 48x48, 128x128四个格式,我放了一个48*48的就够用了。

二、创建manifest.json

根目录下创建一个manifest.json主入口文件

touch manifest.json

然后编辑插件基本信息信息

{"manifest_version": 3,  # 主程序api版本,这个只设置为3 2已经废弃"name": "名字", # 插件名"description": "description", # 插件描述"version": "1.0", # 插件版本"icons": { # 声明图标"16": "icons/16.png","48": "icons/48.png","128": "icons/128.png"}
}

基本信息配好后,即使是这一个文件,其实也已经可以加载插件到chrome里了。

三、加载插件

1. **chrome浏览器输入: **chrome://extensions/
2. 选中加载已解压的扩展程序
3. 选择你的项目目录
4. 查看你的插件如下:

5. 修改刷新 如果你文件有改动,通过4底部的刷新按钮,刷新加载文件观看变化。

至此,已经完成插件的初步加载过程。

四、配置 service-worker.js

如果说manifest.json是主入口文件,那么service-worker.js就像是前端项目里app.js级别的全局文件。

先在 manifest.json 配置:

{..."background": {"service_worker": "service-worker.js"}
}

然后创建与manifest.json同级的文件service-worker.js,内容为:

chrome.runtime.onInstalled.addListener(function () {console.log("插件已被安装");
})

以上就是一个demo级别的浏览器插件所需的文件。manifest.json文件里面具有丰富的配置,常用的如点击、内嵌面板、权限配置需要自行去查看官方文档。

五、以书签管理器插件为例

以一个简单的书签管理器插件为例,展示一个demo级别的插件。插件项目共有三个文件:

manifest.json

首先创建一个manifest.json文件。

{"manifest_version": 3,"name": "Bookmark Viewer","version": "1.0","description": "Uses the chrome.bookmarks API to search through, add, and delete bookmarks from the user's bookmark tree.","action": {"default_popup": "popup.html"},"permissions": ["bookmarks"]
}

action表示点击事件,即在浏览器里面点击了插件图标会如何。这里设置的default_popup表示点击之后弹出popup.html页面。

permissions是向浏览器声明要使用到的权限,这里会用到书签相关的操作,所以声明bookmarks。

popup.html

然后创建弹出给用户看的前端页面popup.html。

<!doctype html>
<html><meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><head><title>Bookmark Viewer</title><script src="popup.js" type="module"></script></head><body><button id="addButton">添加书签</button><button id="removeButton">移除书签</button><ul id="bookmarkList"></ul></body>
</html>

popup.js

最后编写前端页面绑定的js,注意popup.js与全局service-worker.js是不一样的。

chrome.bookmarks.getTree((tree) => {const bookmarkList = document.getElementById('bookmarkList');displayBookmarks(tree[0].children, bookmarkList);
});// Recursively display the bookmarks
function displayBookmarks(nodes, parentNode) {for (const node of nodes) {// If the node is a bookmark, create a list item and append it to the parent nodeif (node.url) {const listItem = document.createElement('li');listItem.textContent = node.title;parentNode.appendChild(listItem);}// If the node has children, recursively display themif (node.children) {const sublist = document.createElement('ul');parentNode.appendChild(sublist);displayBookmarks(node.children, sublist);}}
}// Add a bookmark for www.google.com
function addBookmark() {chrome.bookmarks.create({parentId: '1',title: 'Google',url: 'https://www.google.com'},() => {console.log('Bookmark added');location.reload(); // Refresh the popup});
}// Remove the bookmark for www.google.com
function removeBookmark() {chrome.bookmarks.search({ url: 'https://www.google.com/' }, (results) => {for (const result of results) {if (result.url === 'https://www.google.com/') {chrome.bookmarks.remove(result.id, () => {});}}location.reload();});
}// Add click event listeners to the buttons
document.getElementById('addButton').addEventListener('click', addBookmark);
document.getElementById('removeButton').addEventListener('click', removeBookmark);

查看效果

1. **chrome浏览器输入: **chrome://extensions/
2. 选中加载已解压的扩展程序
3. 选择本项目目录
4. 查看插件如下:

5. 点击浏览器右上方的插件按钮,即可看到本机的书签

[2] Vue项目改造成插件

为什么要用Vue开发Chrome插件?个人主要是回到自己熟悉的模式,提高效率。我们总不能用原生JS手撸插件吧。

Vue项目改造成插件的主要原理: 改造配置文件,这样npm run build的时候,生成的内容是chrome插件结构。同时根据dist结构,配置maifest.json。

一、复习Vue项目的结构

对于一个常规的Vue2、Vue3的项目,它的结构一般是:

./project
├── public
│   ├── favicon.ico
│   └── index.html
├── src
├── package.json
├── package-lock.json
├── jsconfig.json
├── babel.config.js
├── vue.config.js
└── README.md

打包(npm run build)之后的dist文件夹结构为:

./dist
├── css
├── js
├── public
├── favicon.ico
└── index.html

可以看到public目录下的内容,被原封不动的搬到dist目录下。

而src下的vue组件和main.js, 则被编译成js和css文件,分别存储到js和css下。

由于我们开发的是chrome插件,可以把不渲染的文件放到public目录下,把渲染源文件放到src下。

另外在public下,创建一个manifest.json文件即可。

把不编译的js,放到public的好处是: 对于chrome api,我们可以直接跳过编译。直接使用chrome.xxx的形式。

二、删除、添加个别文件

把Vue项目改造成插件只需要改动一点点。

第一步,把Vue项目的public文件夹里面的内容全部删除。

第二步,在Vue项目的public文件夹里添加插件必备的文件,结构如下:

./public
├── service-worker    
│   └── service-worker.js   # 插件后台运行js
├── manifest.json       		# 插件主描述文件
├── css
│   └── your.css       			# 自定义css 后面会和Vue项目打包的css合并到css文件夹下
├── js
│   └── your.js       			# 自定义js 后面会和Vue项目打包的js合并到js文件夹下
└── icons              			# 插件icon图片├── 48.png├── 16.png└── 128.png

第三步,在src文件夹下添加一个popup.html。这个popup就是最终打包时会使用的html,你的manifest.json得有行为(比如action)来绑定这个文件。

./src
├── ...					# 业务代码
└── popup.html  # 额外添加的插件关联html

html这样写

<!DOCTYPE html>
<html lang="">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>html,body,#app {height: 100%;margin: 0px;padding: 0px;}
</style>
<body>
<div id="app"></div>
<script src="js/xxx.js"></script> # 你的自定义js
</body>
</html>

三、重写build

在vue.config.js中,配置build过程,主要说明要加载的页面是popup/popup.html。

配置vue.config.js

const { defineConfig } = require('@vue/cli-service')
const pages = {}; #声明一个page集合,如果有
const chromepages=["popup"];        # 这里主要有一个popup页面
chromepages.forEach(name=>{
pages[name]={
entry:`src/main.js`,        				# 页面入口是popup下的main.js
template:`src/popup.html`,  				# popup.html
filename:`${name}.html`             # 最终渲染的页面是popup.html      
};
});
module.exports = {pages,productionSourceMap: false,
}

然后执行build

npm run build

生成的目录结构如下

./dist
├── service-worker
│   └── service-worker.js
├── popup.html     #渲染的弹出页面
├── manifest.json  主程序入口
├── js
│   ├── popup.ff36d80a.js
│   └── chunk-vendors.1c3d3fe0.js
├── css
│   ├── popup.0b9776ec.css
│   └── your.css
└── icons├── 48.png├── 16.png└── .png

最后,直接在Googls插件页面选择加载dist文件夹即可。

[3] 高级开发

一、脚本通信

浏览器插件所涉及到的三类JS文件有:

1. service-worker.js。属于插件的全局js,背景脚本在扩展安装后就会持续运行,不会因为浏览器的标签页切换或关闭而停止。会在浏览器下一次打开后自动恢复,拥有更广的权限。
2. content.js。指的是向用户浏览的页面注入的JS文件,我们一版统称content脚本。注入content文件有很多写法,比如直接在manifest.json文件里面声明,或者在service-worker.js里面显式地写。content脚本的作用域在用户访问的页面那里,如果想和插件传递数据需要用google提供的message方法。
3. popup.js。指的是插件的html页面使用script标签引入的JS文件,它的地位是属于插件所有,作用域在插件这边,但是权限没有service-worker.js大。

因此,说脚本通信,指的是插件脚本(service-worker.js、popup.js)和content.js脚本之间的通信。

它们之间需要用message通信:

// popup.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {console.log("收到消息:", request.data);
});// content.js
chrome.runtime.sendMessage({data: 'value'}, function(response) {console.log("收到来自popup.js的回复:", response);
});

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

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

相关文章

SpringBoot集成JWT和Redis实现鉴权登录功能

目前市面上有许多鉴权框架&#xff0c;鉴权原理大同小异&#xff0c;本文简单介绍下利用JWT和Redis实现鉴权功能&#xff0c;算是抛砖引玉吧。 主要原理就是“令牌主动失效机制”&#xff0c;主要包括以下4个步骤&#xff1a; (1)利用拦截器LoginInterceptor实现所有接口登录拦…

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的&#xff0c;所以在IDE中使用Git也是非常常用的&#xff0c;接下来以IDEA为例&#xff0c;其他的VS code &#xff0c;Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…

Python鼠标轨迹算法(游戏防检测)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

【2025最新版】Stable diffusion汉化版安装教程(附SD安装包),一键激活,永久免费!

如何安装并学习使用Stable Diffusion呢&#xff1f; 其实&#xff0c;安装SD的过程并不复杂&#xff0c;只需按照简单的步骤操作&#xff0c;几分钟内就能完成安装&#xff0c;不论是Windows系统还是Mac系统&#xff0c;都能轻松应对。

Python学习(二)—— 基础语法(上)

目录 一&#xff0c;表达式和常量和变量 1.1 表达式 1.2 变量 1.3 动态类型特性 1.4 输入 二&#xff0c;运算符 2.1 算术运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 赋值运算符 2.5 练习 三&#xff0c;语句 3.1 条件语句 3.2 while循环 3.3 for循环 四&#…

如何用状态图进行设计06

独立的控制线程 扩展状态图也提供了获取无序的输入事件的方法。这意味着一个状态开始时&#xff0c;它可能位于一个或多个控制线程的交叉点。控制行为的每个独立线程都类似一个状态机&#xff0c;独自运行&#xff0c;互不干扰。因此&#xff0c;这些控制线程可能会同时发生状…

嵌入式学习(18)-stm32F407串口接收空闲中断+DMA

一、概述 在一些一次性接收大批量数据的引用场合&#xff0c;如果使用接收中断会频繁的进入接收中断影响代码的运行效率。为了解决这个问题可以使用串口的空闲中断DMA实现。 二、应用 在网上招了一些例程在STM32F407的平台上都没有跑通会出现各种异常&#xff0c;主要原因还…

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…

UOB大华银行|校招网申综合能力SHL测评题库英语版本真题分析

大华银行有限公司&#xff08;大华银行&#xff09;是亚洲银行业的翘楚&#xff0c;大华银行总部位于新加坡&#xff0c;并在中国、印度尼西亚、马来西亚、泰国及越南设立了全资法人银行&#xff0c;在全球拥有约500 间分行及办事处&#xff0c;分布在亚太、欧洲与北美的19 个国…

WebSpoon9.0(KETTLE的WEB版本)编译 + tomcatdocker部署 + 远程调试教程

前言 Kettle简介 Kettle是一款国外开源的ETL工具&#xff0c;纯Java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定 WebSpoon是Kettle的Web版本&#xff0c;由Kettle社区维护&#xff0c;不受Pentaho支持&#xff0c;…

用人话讲计算机:Python篇!(十二)正则运算+re模块

目录 一、正则表达式 &#xff08;1&#xff09;什么是正则表达式 &#xff08;2&#xff09;它的结构及使用 示例&#xff1a; 1.字符 . &#xff08;←这里有个小点哦&#xff09; 2.字符 | 3.字符 [ ] 4.字符^ 5.字符\d &#xff08;3&#xff09;补充&#xff…

Service Discovery in Microservices 客户端/服务端服务发现

原文链接 Client Side Service Discovery in Microservices - GeeksforGeeks 原文链接 Server Side Service Discovery in Microservices - GeeksforGeeks 目录 服务发现介绍 Server-Side 服务发现 实例&#xff1a; Client-Side 服务发现 实例&#xff1a; 服务发现介绍…

基于Python深度学习的【猫狗宠物识别】系统设计实现

一、简介 宠物识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;基于TensorFlow搭建卷积神经网络算法&#xff0c;并收集了37种常见的猫狗宠物种类数据集【‘阿比西尼亚猫&#xff08;Abyssinian&#xff09;’, ‘孟加拉猫&#xff08;Bengal&#xff09;’…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

10篇--图像噪点消除

概念 何为噪点&#xff1f; 噪点&#xff1a;指图像收到的一些干扰因素&#xff0c;通常是由图像采集设备、传输信道等因素造成的&#xff0c;表现为图像中随机的亮度&#xff0c;也可以理解为有那么一些点的像素值与周围的像素值格格不入。 常见的噪声类型 高斯噪声&#…

科研绘图系列:R语言绘制网络图和密度分布图(network density plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…

数据结构——ST表

ST表的定义 ST表&#xff0c;又名稀疏表&#xff0c;是一种基于倍增思想&#xff0c;用于解决可重复贡献问题的数据结构 倍增思想 这里列举一个去寻找一个区间内的最大值的例子 因为每次会将将区间增大一倍&#xff0c;所以才被称之为倍增思想 &#xff0c;这种思想十分好用…

创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】

&#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持续下去的动力&#xff01; 目录 一. 简单汇总一下创建…

【PlantUML系列】部署图(七)

一、部署图的组成部分 节点&#xff08;Node&#xff09;&#xff1a;使用node关键字定义一个节点&#xff0c;节点可以是服务器、数据库或其他硬件设备。组件&#xff08;Component&#xff09;&#xff1a;使用component关键字定义一个组件&#xff0c;组件可以是软件模块或服…

【JAVA】旅游行业中大数据的使用

一、应用场景 数据采集与整合&#xff1a;全面收集旅游数据&#xff0c;如客流量、游客满意度等&#xff0c;整合形成统一数据集&#xff0c;为后续分析提供便利。 舆情监测与分析&#xff1a;实时监测旅游目的地的舆情信息&#xff0c;运用NLP算法进行智能处理&#xff0c;及…