一文学会浏览器插件(加入光荣的进化吧)(一文晋级璀璨钻石)(本文不含知识诅咒)

都2023年了,你还不会开发浏览器插件?

注意:此教程针对chrome和chromium内核的浏览器制定的,且仅适用于前端开发者

在chrome地址栏输入chrome://extensions/,就进入了谷歌浏览器扩展程序控制面板,在这里可以装载一些插件,来扩展浏览器的功能,或者做一些自动化处理,由于众所周知的原因,国内是无法直接访问 谷歌应用商店 的,所以当你想用一个插件时,不得已要去国内的某些第三方网站查找,但是这些网站的插件要么不全,要么严重过时了,他们甚至还恬不知耻的让你关注公众号才能下载。

*[En]*

**

打开edge浏览器,输入edge://extensions/,进入edge应用商店!

新版edge用的内核叫做chromium,它就是chrome的开源版,chromium的功能往往比chrome更加先进,且99%的兼容了chrome,也就是说,你可以把edge当成次世代的chrome浏览器!edge还支持微软账户登录、使用同步功能、网页一键翻译(必应翻译)!

特大好消息:使用edge可以获取微软积分!积分可以换英雄联盟点券、京东购物券、星巴克和沃尔玛的消费券!

你问我什么时候讲怎么开发插件?*[En]*

**

我为什么要开发浏览器插件?*[En]*

**

如果你女朋友(一脸严肃的)不小心打开了你的神秘网站,却发现这只是一个 普通的学习网站 ,除了你不用写一千字的检讨外,你女朋友说不定还会因为怀疑你是个 LSP(全称分层服务提供程序) 而内疚。

快速完活!~

接下来的内容是描述内容,如果你想快速开始,请直接跳到下一小节,再回头来看。

浏览器插件大部分且主流的开发方式,就是 html、css、 js。不用怀疑,凭你的大专学历以及两年半(ji)的工作经验可以轻松开发一个功能完善的插件!

浏览器插件包括四个主要文件

与正常页面交互的js插件后台运行的js图标.pngmanifest.json

一个次要文件:

弹出窗口.html (这个文件可以引入更多 js)

上述文件中,每个文件都不是必须的,必须的文件只有一个,就是 manifest.json

manifest.json

这个文件简单来说,就像 npm 标准项目中的 package.json

它描述了:

应用名开发者名(还可以包含联系方式)图标位置(图标是png格式而非ico格式)交互.js路径后台.js路径所需权限(比如获取cookies就需要在文件中声明)生效范围(可以让插件在特定网页生效)manifest_version 这是一个必填项,目前主流为版本为2,但是在2023年将被废弃,推荐使用 3(直接写数字即可)

关于此文件详解 参见 chrome扩展:manifest.json文件详解

与正常页面交互的 js和插件后台运行的 js

这两个文件的运行环境是不互通的,交互js无法使用很多浏览器接口,后台却可以,如果想前后之间传递数据,要用 消息发送机制

下面是一个简单的实例:

//myscript.js (这是前面提到的交互js,可以和正常页面进行交互) chrome.runtime.sendMessage({ url: url }, async (response) => { console.log(“cookie=”, response); });//background.js (这是后台js,也就是插件的独立环境运行的js)chrome.runtime.onMessage.addListener( (request, sender, sendResponse) => { //console.log(request);//这个输出是看不到的,没有用! let cookie chrome.cookies.getAll({ url: request.url }, (cks) => { sendResponse(cks); }); return true; });

相信上面的代码很好懂,我们在background调用了chrome.runtime.onMessage.addListener,添加了一个消息监听器,当myscript的消息发送(chrome.runtime.sendMessage)时,就触发了background的监听器,并执行其中的代码,当执行完成后,background.js可以通过sendResponse(即myscript中标有async的函数,它充当一个回调)把消息返回回去。

此时myscript将会打印出当前页的所有cookies,它可能是一个数组。

快快快快速完活!~

如果你不想看上面的长篇大论,还可以直接跟着本小节直接开始写代码!

快速搭建一个插件

必须要一个文件:

manifest.json

可选文件:

myscript.js (前台交互脚本,这个文件的输出可以打印到控制台)background.js (后台服务脚本,这个文件的运行是被隔离的,可以理解为静默运行)logo.png (图标)popup.html (点击插件图标时的弹窗)

下面是一个简单的manifest.json文件实例:

{ “manifest_version”: 2, //推荐使用 3 ,因为 2 即将在 2023年停止支持 “name”: “cookie获取工具”, “version”: “1.0.1”, “description”: “这是一个cookie获取工具”, “author”: “Larry Zhu “, //日后惹出祸来,别把师傅说出来就行了 “icons”: { “16”: “logo1.png”, “128”: “logo1.png” }, “background”: { “persistent”: true, //是否常驻后台 “scripts”: [ “background.js” ] }, “content_scripts”: [ //这是前台js配置 { “matches”: [ “https://mp.weixin.qq.com/cgi-bin/home?*” //生效范围,这个地址是微信公众平台 ], “js”: [ “myscript.js” ], “run_at”: “document_end” //当dom加载完时,或者使用_start什么的,自己搜吧我忘了 } ], “permissions”: [ //权限列表,如果你使用过wxjssdk,你就很熟悉了,跟那个一个意思 “cookies”, //获取cookie “webRequest”,//请求相关的权限 “”, //生效范围,这个意思是全部 “tabs”, // tab页相关的权限 ]}

稍微的解释:

该文件提到的文件都是相对路径 如 logo1.png 等同于 ./logo1.png、background.js等同于./background.js参见chrome扩展:manifest.json文件详解如果你没有logo.png也可以不加除了manifest_version、name、version外,你可以省略其他任何参数,也就是说,你可以创建一个完全没有任何功能的空插件,甚至这仨也能省略,我没试过,你可以试一下

下面是一个 前台js的简单实例:

//myscript.jswindow.addEventListener(“load”, myMain, false);function getCookies(url) { chrome.runtime.sendMessage({ url: url }, async (response) => { console.log(“cookie=”, response); });}function myMain(evt) { console.log(“AutoLarry is Loaded”); getCookies(document.URL)}

简单解释:chrome.xxx是调用浏览器提供的接口,包含默认的、已经刚刚在manifest中声明过的方法,注意:一些方法在前台js是没有的,比如 chrome.cookies.getAll

在这里,使用了chrome.runtime.sendMessage 向 后台js 发送了一条消息

下面是后台js的一个简单实例:

//background.jschrome.runtime.onMessage.addListener( (request, sender, sendResponse) => { console.log(request); let cookie chrome.cookies.getAll({ url: request.url }, (cks) => { sendResponse(cks); }); return true; });

可以看到,后台js添加了一个消息监听器(有点类似与mqtt的消息机制),当前台调用chrome.runtime.sendMessage时,

chrome.runtime.onMessage.addListener中的函数就会触发,当函数中的代码执行完成后,还可以通过前台传来的回调函数(myscript.js中async(异步)前缀的那个就是传入的回调)把数据什么的返回给前台 sendResponse(cks)

此时 myscript.js中的 console.log(“cookie=”, response) 就会输出对应的值,对于我们这个程序来说,将会输出一个数组,数组内容是当前页的cookies。

导入

要导入自己开发的插件,在地址栏输入edge://extensions/(edge浏览器),打开开发人员模式,加载解压缩的扩展,选择你的插件目录,点击选择文件夹,导入成功。

*[En]*

**

参考教程:

Chrome插件开发简要指南_w3cschool从零深入Chrome插件开发 – 掘金Chrome 扩展(插件)开发官方入门教程 – 知乎

Original: https://www.cnblogs.com/Kay-Larry/p/17008078.htmlAuthor: Kay-LarryTitle: 一文学会浏览器插件(加入光荣的进化吧)(一文晋级璀璨钻石)(本文不含知识诅咒)

相关阅读Title: Redis架构之哨兵机制与集群Redis架构之哨兵机制与集群哨兵机制1、介绍:

Sentinel(哨兵)是redis高可用性解决方案:由一个或多个由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。简单的说哨兵就是带有 自动故障转移功能的主从架构。(简单来说就是哨兵机制会监视所有的服务器,当主服务器宕机时,会自动将主服务器下的某个从服务器变成新的主服务器,当原来的主服务器恢复后会变成从服务器。就像你部门的主管跑了,然后临时提拔你当主管,而且你干的不错,成为了新主管,原来的主管回来了,当了你的下属。)

2、哨兵架构原理

即使当主服务器宕机的时候会有从服务器来代替主服务器工作,但是还是不能解决 单节点并发压力问题以及 单节点内存和磁盘物理上限。因为工作的只有一台主服务器,如果数据量大的时候,比如一亿条,那么主服务器的压力就很大。那么我们就会想,既然一台不够,那就多搞几台,这样就会涉及到多台主服务器下数据来了传给谁的问题。由此引出 集群架构,设置多台主服务器。

[En]

Even if there is a slave server to replace the master server when the master server goes down, it still cannot solve the problem of * concurrent pressure of single node * and * physical upper limit of memory and disk of single node * . Because there is only one master server working, if there is a large amount of data, such as 100 million, then the pressure on the master server is very great. Then we will think, since one is not enough, we should build a few more, which will involve the question of who the data is transmitted to under multiple main servers. This leads to * cluster architecture * , which sets up multiple master servers.

Redis集群1、集群

Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群 支持节点的自动发现,支持slave-master选举和容错,支持在线分片(sharding shard )等特性。

PING PONG协议(心跳机制):节点与节点之间通过心跳机制来维护和连接。也叫ping pong机制,就是我发给你一个ping,你需要给我一个pong来说明我们是连接的,如果没有回复我不能一直等吧,所以会设置一个超时过期时间,假设某个主服务器在这段时间内一直没有回应,视为出现了问题,将由哨兵机制来升级一个从服务器为主服务器。我们之前的ping www.baidu.com也是这种机制,不过内部更为复杂。

2、集群架构图- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.- 节点的fail是通过集群中超过半数的节点检测失效时才生效.(半数机制,后面hadoop也会说到 )- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可- redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护nodeslotvalue

在前面我们说道,面对传输过来的数据该由哪个节点接收呢。在redis中提供了一个叫槽(Slot)的东西,这个槽覆盖了所有的master节点,每个redis集群中最多有16384个槽,并且将这些槽大致均分给每个主节点。当我们用户端发送一个请求set name bfy 是交给哪一个服务器呢。这时候就会用到CRC16算法,会对key做这个算法,并且返回一个值,这个值的范围就是槽的范围,这个值在哪个节点中就由哪个节点接收。

3、集群搭建

判断一个是集群中的节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建redis集群时建议节点数最好为奇数, 搭建集群至少需要三个主节点,三个从节点,至少需要6个节点。

步骤准备环境安装ruby以及redis集群依赖yum install -y ruby rubygems# https://rubygems.org/gems/redis/versions- gem install redis-xxx.gem

3. 每个目录复制一份配置文件[root@master redis-cluster]# cp /usr/local/soft/redis-install/redis-7.0.0/redis.conf ./7000/[root@master redis-cluster]# cp /usr/local/soft/redis-install/redis-7.0.0/redis.conf ./7001/[root@master redis-cluster]# cp /usr/local/soft/redis-install/redis-7.0.0/redis.conf ./7002/[root@master redis-cluster]# cp /usr/local/soft/redis-install/redis-7.0.0/redis.conf ./7003/[root@master redis-cluster]# cp /usr/local/soft/redis-install/redis-7.0.0/redis.conf ./7004/[root@master redis-cluster]# cp /usr/local/soft/redis-install/redis-7.0.0/redis.conf ./7005/[root@master redis-cluster]# cp /usr/local/soft/redis-install/redis-7.0.0/redis.conf ./7006/修改不同目录配置文件- port 7000 ….. //修改端口- # bind 127.0.0.1 -::1 //开启远程连接- protected-mode no- daemonize yes //开启守护进程- dbfilename dump-7000.rdb //每台机器的文件不能一样- cluster-enabled  yes //开启集群模式- cluster-config-file  nodes-7000.conf //集群节点配置文件- cluster-node-timeout  5000 //集群节点超时时间- appendonly  yes //开启AOF持久化- appendfilename “appendonly-7000.aof” //修改aof文件名- appenddirname “appendonlydir-7000″指定不同目录配置文件启动七个节点[root@master redis-cluster]# redis-server 7000/redis.conf[root@master redis-cluster]# redis-server 7001/redis.conf[root@master redis-cluster]# redis-server 7002/redis.conf[root@master redis-cluster]# redis-server 7003/redis.conf[root@master redis-cluster]# redis-server 7004/redis.conf[root@master redis-cluster]# redis-server 7005/redis.conf[root@master redis-cluster]# redis-server 7006/redis.conf查看进程ps aux|grep redis

7. 创建集群redis7.0.0之后的命令:redis-cli –cluster create 192.168.137.150:7000 192.168.137.150:7001 192.168.137.150:7002 192.168.137.150:7003 192.168.137.150:7004 192.168.137.150:7005 –cluster-replicas 1

8. 查看集群状态# 1.查看集群状态 check [原始集群中任意节点] [无]redis-cli –cluster check 192.168.40.110:7000# 2.集群节点状态说明- 主节点 主节点存在hash slots,且主节点的hash slots 没有交叉 主节点不能删除 一个主节点可以有多个从节点 主节点宕机时多个副本之间自动选举主节点- 从节点 从节点没有hash slots 从节点可以删除 从节点不负责数据的写,只负责数据的同步

9. 添加一个新节点redis-cli –cluster add-node 192.168.137.150:7006 192.168.137.150:7001 –cluster-slave

Original: https://www.cnblogs.com/bfy0221/p/16593172.htmlAuthor: 伍点Title: Redis架构之哨兵机制与集群

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/289099/

转载文章受原作者版权保护。转载请注明原作者出处!


比丘资源网 » 一文学会浏览器插件(加入光荣的进化吧)(一文晋级璀璨钻石)(本文不含知识诅咒)

发表回复

提供最优质的资源集合

立即查看 了解详情