说一下场景,医院的内部网络是连入卫生专网的,有一个业务系统,并不是部署在本地,也无法和业务厂商进行数据对接,这个时候,需要去采集这个系统内的业务数据,一直没有想到很好的解决方案。
由于这个业务系统使用的B/S架构,使用的是火狐的浏览器,突然有一天就想到,是不是可以使用火狐的插件来实现,于是动手去研究起来了。
火狐的插件,起源的时间应该是很早之前,网上也没有找到很好的教程,所以只好翻找官方文档,今天也是把业务需求搞定了。所以想到了写这篇文章,梳理一下,一方面是Extension的大致脉络,还有一些是具体的细节问题,是怎么解决。
https://extensionworkshop.com/ 这个官方网站是入门的网站。
这张图对于理解Extension是非常关键了,描述了框架体系是怎样的。简单的说,manfest.json
是入口文件,里面描述了插件的所有概要信息,包括插件的基本信息,图标,权限,关键页面的载入文件,如何更新插件等。
background
可以理解后台常驻的脚本,一旦插件安装之后常驻在浏览器运行的,也是API功能最为强大的。
content_scripts
是与打开的页面相互关联的,虽然没有background
的API来的强大,但是因为能够注入到页面当中,所以能够获取和修改页面数据,也能够根据用户在页面的行为,产生互动。
browser_action
是右上角图标用户点击后打开的页面,定义了单独的网页,在这个网页中可以进行用户的交互。
不同的Tab之间如何进行数据的交互
content_scripts
可以通过消息机制,与background
进行数据的互动。但是这种消息机制,只限于用户当前打开的页面。如果需要与不活动的Tab进行数据的交互,就需要使用browser.tabs.sendMessage
来进行数据的交互,当然先要通过browser.tabs.query
来找到你想要交互Tab的id。
jQuery在content_scripts
的加载
manifest.json
中是可以定义多个js文件的,但是在content_scripts
是有加载顺序的,所以必须要把jQuery的js文件,放在前面,才可以保证顺利加载。
纯内网环境如何更新
企业内部部署的Extension,可以定义自动更新脚本的文件。但是这个文件必须要托管在https的网站上面,否则提交的Extension是无法通过签名的。由于纯内网环境,也没有配置DNS,也不想给每台电脑安装自签名的https证书,所以用另一个方法解决。
当打开业务系统页面的时候,获取当前Extension版本,然后请求内网服务器,与最新的API版本进行比较,如果有版本更新,则在业务系统显著位置显示横幅,引导用户点击下载最新的插件进行更新。