chrome浏览器插件开发二

还有一种插件,属于工具类插件,针对需要对浏览器做测试开发的人员,作为一个web前端人员,在调试的时候,除了需要利用浏览器本身的开发工具对网页做一些调试测试外,也需要针对默写特殊情况或者特殊网页做调试处理,比如VUE开发的调试工具:vue devtools。因为vue是进行数据驱动的,单从chrome里面进行element查看,查不到什么东西,必须要进行对数据动向进行关查。

接下来介绍关于开发者工具插件开发的流程:

配置

上篇讲的关于mainfest.json的配置中有一项是”devtools_page”: “devtools.html”,这个就是插件入口了,下面是我的插件的配置:

{
"manifest_version":2,
"name":"liao",
"version":"1.0.0",
"description":"This is my first extension,just for testing!",
"icons": {
    "16": "images/16.png",
    "48": "images/48.png",
    "128": "images/128.png"
  },
"browser_action":{
	"default_icon":{
    "16": "images/16.png",
    "48": "images/48.png",
    "128": "images/128.png"
  },
	"default_title":"Hello",
	"default_popup":"popup.html"
},
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
 "web_accessible_resources": ["mypanel.html", "devtools.html"],
 "devtools_page": "devtools.html",
"background": {
    "scripts": [ "background.js" ],
   "persistent": true//默认打开,这样控制台上才会出现插件
  },
"permissions":["<all_urls>", "webNavigation"],
"content_scripts":[
{
	"js":["hook.js"],
    "run_at": "document_start",
	"matches":["<all_urls>"]
}
],
// 插件主页,这个很重要,不要浪费了这个免费广告位
    "homepage_url": "https://luciferlia.github.io./"
}

插件入口是”devtools_page”: “devtools.html”

<meta charset="utf-8">
<script src="devtools.js"></script>

其实真正代码是devtools.js,html文件是“多余”的,不过它这样规定,那我们就按照他的规则来。

devtools.js

chrome.devtools.panels.create("My Panel",
    "images/128.png",
    "mypanel.html",
    function(panel) {
      // code invoked on panel creation
    }
);

几个参数依次为:panel标题、图标(其实设置了也没地方显示)、要加载的页面、加载成功后的回调。 其中,mypanel.html是插件控制台的展示页面,相当于一个网站或引用的入口index,你可以在这个页面写上你想要的功能设计。

脚本和插件的通讯

进行到这里,开发者工具的大致框架差不多完成了,但是去看控制台,还是没有看到My Panel的工具,这是因为还没有进行通讯,详情可以看看chrome浏览器开发手册,有点麻烦,我查找了很多插件的源码以及和VUE devtools做对比后,写了一个简洁版的通讯脚本,记住在content_scripts里面的script里面调用,hook.js的代码:

function installHook (window) {
  var listeners = {}

  var hook = {
    Vue: null,

    on: function on (event, fn) {
      event = '$' + event
      ;(listeners[event] || (listeners[event] = [])).push(fn)
    },

    once: function once (event, fn) {
      event = '$' + event
      function on () {
        this.off(event, on)
        fn.apply(this, arguments)
      }
      ;(listeners[event] || (listeners[event] = [])).push(on)
    },

    off: function off (event, fn) {
      event = '$' + event
      if (!arguments.length) {
        listeners = {}
      } else {
        var cbs = listeners[event]
        if (cbs) {
          if (!fn) {
            listeners[event] = null
          } else {
            for (var i = 0, l = cbs.length; i < l; i++) {
              var cb = cbs[i]
              if (cb === fn || cb.fn === fn) {
                cbs.splice(i, 1)
                break
              }
            }
          }
        }
      }
    },

    emit: function emit (event) {
      var this$1 = this;

      event = '$' + event
      var cbs = listeners[event]
      if (cbs) {
        var args = [].slice.call(arguments, 1)
        cbs = cbs.slice()
        for (var i = 0, l = cbs.length; i < l; i++) {
          cbs[i].apply(this$1, args)
        }
      }
    }
  }

}

打包发布

现在为止,一个基本的开发者工具插件已经完成了,详细的功能可以自己设计实现加进去,chrome浏览器安装后,按F12,就可以在控制台上看到一个My Panel 插件了,然后是打包发布。

一般来说,你可以直接将插件文件夹拖到浏览器插件设置那,就可以安装成功,但如果想要别人使用,有不让别人看到源码,就需要打包成.ctx文件发布了,具体的操作如下:

插件管理页有个打包扩展程序的按钮,点击后,选择扩展程序根目录,私钥选填,点击确定后就可以获得一个.ctx的文件了,当然你也可以发布到google应用商店去。