谷歌浏览器插件是一种小型的用于定制浏览器体验的程序。通过插件,可以自定义浏览器的一些行为来适应个人的需要,只要你会HTML,JavaScript,CSS就可以动手开发浏览器插件了。

开发谷歌浏览器插件,就相当于在谷歌浏览器的基础之上进行活动,站在巨人的肩膀上,操作很多东西都方便了一些。有了插件,我们可以定制js爬虫、屏蔽网页广告,网页实时查词,修改http请求头,等等,能做的东西很多。

Chrome插件结构

需要声明的是,这个结构图是我自己画的,代表我对Chrome插件的理解,可能并不全面,甚至还不是十分准确,但找来找去找不到现成的,只好自己动手,如有谬误,请不吝指出。

如图,manifest.json作为插件的配置文件,同时可以看作程序的“入口”,因为它指定了显示什么图标,background script有哪些文件,content script又有哪些文件,pop up的页面是什么,等等。

什么是popup,什么是background script,相信大家都清楚了,那什么是content script呢?content script就是我们要注入到页面中的脚本,插件允许我们往网页中注入脚本,这是一个多么让人有想象力的功能,其功能之强大无需多解释,总的来说,就是让我们全面干预页面的内容!也许你马上会想到,这可能带来很大的安全隐患,没错,有些恶意插件会窃取你的页面信息,而有些有漏洞的插件则可能让你遭受跨站脚本注入(XSS)的攻击;另一个可能你会想到的问题是:往页面中注入自己的脚本,难道不会跟页面原本的脚本发生冲突吗?能想到这点说明你真的很厉害,如果我们的注入脚本和页面原本的脚本处于同一个运行环境中,确实会发生冲突,所以,Chrome是另外开辟了一个独立的运行空间,供我们的Content Script使用的,Content Script能访问DOM的内容,但却不能访问页面原本的脚本(我是说直接访问不行),反之,页面原本的脚本也不能直接访问Content Script。在图中,浅红色的背景块代表Content Script的运行环境,而浅蓝色的背景块代表页面运行环境,另外插件的运行环境我用浅绿色表示,注意,这是三个不同的运行环境,调试的时候你会充分体会到它们的不同。

那么,Content Script会在什么时候运行呢?默认情况下,是在网页加载完了和页面脚本执行完了,页面转入空闲的情况下(Document Idle),但这个是可以改变的,详情可参考https://developer.chrome.com/extensions/content_scripts.html,查看其中的“run_at”。

由于处于不同的运行环境中,Content Script和Background Script不能直接互相访问,那它们之间如何通信?通过Message!这个之后的代码中会有。

基础概念与入门案例

废话少说,先看一下插件版的hello world,了解插件的大体结构,麻雀虽小,五脏俱全。

  1. 创建manifest.json。任何插件都必须要有这个文件,用来描述插件的元数据,插件的配置信息。
 {"name": "Hello Extensions","description" : "Hello world Extension","version": "1.0","manifest_version": 2,}

定义当前插件的名字,描述版本号等信息。
注意: version在打包完插件的时候,根据version判断插件是否需要更新。

  1. 给插件加一个浏览器右上角的图标。

    浏览器插件图标

 {"name": "Hello Extensions","description" : "Hello world Extension","version": "1.0","manifest_version": 2,
#新增内容如下"browser_action": {"default_popup": "hello.html","default_icon": "hello_extensions.png"}}

hello.html

<html><body><h1>Hello Extensions</h1></body>
</html>

hello_extension.png图标

hello_extension图标

  1. 新增快捷键,通过键盘快速打开,修改manifest.json
 {"name": "Hello Extensions","description" : "Hello world Extension","version": "1.0","manifest_version": 2,"browser_action": {"default_popup": "hello.html","default_icon": "hello_extensions.png"},#新增内容如下"commands": {"_execute_browser_action": {"suggested_key": {"default": "Ctrl+Shift+F","mac": "MacCtrl+Shift+F"},"description": "Opens hello.html"}}}
  1. 安装浏览器扩展
    4.1 进入扩展程序

    image.png

4.2 加载含有manifest.json的文件夹,开发模式下使用。

加载插件

4.3 当你觉得开发完成的时候可以打包扩展程序,上面图片有。

注意:第一次打包的时候,会生成一个pem个人密钥文件,以后再次打包的时候就需要密钥文件了。

打包截图

  1. 看一下效果

    hello world插件效果

插件进阶

上面只是简单的介绍了开发插件的hello world,实际中,我们需要的功能远不止这么简单。需要更强大的功能,更多的库支持才能够胜任。下面介绍如何做出功能更完善的插件。我们从一个开源的插件脚手架做案例。

  1. 脚手架的地址

A template for building cross browser extensions for Chrome, Opera & Firefox.
https://github.com/EmailThis/extension-boilerplate

  1. 克隆到本地搭建开发环境
git clone git@github.com:EmailThis/extension-boilerplate.git
cd extension-boilerplate
npm install
  1. 开发与打包
    开发的话:
npm run chrome-watch
npm run opera-watch
npm run firefox-watch

打包:

npm run build
  1. 搭建好基本的开发环境,先研究此项目中所包含的内容,根据自己的需要往脚手架中填充东西。我先介绍几个常用的manifest.json配置。
    4.1 icons 定义浏览器扩展页面的图标。

    icon 对应图标位置

  "icons": {"16": "icons/icon-16.png","128": "icons/icon-128.png"},

4.2 permissions 此插件用到的浏览器的权限。常用的权限如下。在Chrome 插件API概览页面点进去,会看到此api需要的权限。

存储权限

"permissions": ["tabs","storage","http://*/*","https://*/*"],

4.3 contentScripts,运行在浏览器网页的上下文页面,使用标准的DOM模型,contentScripts标签在控制台可以看到。

content Scripts位置

 "content_scripts": [{"matches": ["http://*/*","https://*/*"],"js": ["scripts/contentscript.js"],"run_at": "document_end","all_frames": false}],

4.4 background后台页面,在浏览器前台看不到的页面,可以以后台进程的方式进行运行,也可以以事件的方式运行。需要打开扩展程序的开发者模式才能看到。

background 页面

"background": {"scripts": ["scripts/background.js"]},

更详细的manifest.json文件配置信息请参考官方manifest.json文件格式

  1. 常用到的开发方式说明

    插件架构

5.1 一般我们会在浏览器的前台页面,也就是直接打开控制台就可以看到的扩展程序,通过contentScript指定加载的程序。在这里监听当前浏览器当前打开的页面,然后做一些与用户交互的东西。

5.2 在前台的交互,以消息的形式传递到background指定的脚本。

contentScript执行的程序一般可以跨域,浏览器的安全限制,而background指定的脚本可以跨域运行,获取所有浏览器cookie信息等等。

交互案例,详细的操作看一下项目的脚手架中。

chrome.runtime.sendMessage(string extensionId, any message, object options, function responseCallback)
chrome.runtime.onMessage.addListener(function callback)

一篇有关前后台通信的文章

  1. 在前后台可以通信之后,很多功能可以依赖第三方的库,当前我们参考的脚手架,可以直接使用npm安装第三方库。可以多花点心思研究插件的具体结构。

总结

浏览器插件开发,不管是在实用性上,还是趣味性上都是值得学习与了解的。本文试图阐述chrome插件开发的过程与原理,但篇幅有限,不可能面面俱到,不足之处,敬请谅解。
欢迎一起讨论与留言。

参考

  • manifest.json
  • Chrome 扩展开发——编写一个自己的浏览器插件
  • chrome javascript API
  • Chrome 扩展开发——编写一个自己的浏览器插件
  • 浏览器插件开发-常用API
  • 插件门户
  • 开发入门
  • Chrome插件(Extensions)开发攻略
  • 很多示例

这里千万千万注意了,我当初没仔细看popup.html里有一小段注释,这一小段注释说:出于安全考虑,javascript必须与html分开存放。而我想嘛,一个小测试程序,没必要分开吧,直接写一起不就行了吗?结果javascript死活执行不了,我翻来覆去找不到原因,还以为弹出的小窗口不支持javascript,在网上搜索了半天又没有结果,最后才发现是这个原因,浪费了许多时间,这个事情也一定程度上说明了:细节决定成败。

作者:Real_man
链接:https://www.jianshu.com/p/51c650f98d9c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

谷歌(Chrome)浏览器插件开发教程相关推荐

  1. 谷歌浏览器书签栏怎么隐藏 谷歌Chrome浏览器书签栏隐藏教程

    打开谷歌Chrome浏览器,进入设置页面; 谷歌浏览器书签栏怎么隐藏?谷歌Chrome浏览器书签栏隐藏教程 谷歌浏览器书签栏怎么隐藏?谷歌Chrome浏览器书签栏隐藏教程 待设置页面弹出后,滑动找寻& ...

  2. 谷歌Chrome浏览器开发者工具教程—JS调试篇

    上一篇我们学习了谷歌Chrome浏览器开发者工具的基础功能,下面介绍的是Chrome开发工具中最有用的面板Sources. Sources面板几乎是最常用到的Chrome功能面板,也是解决一般问题的主 ...

  3. 浏览器开发者工具修改html后执行,谷歌Chrome浏览器开发者工具教程—JS调试篇

    上一篇咱们学习了谷歌Chrome浏览器开发者工具的基础功能,下面介绍的是Chrome开发工具中最有用的面板Sources. Sources面板几乎是最经常使用到的Chrome功能面板,也是解决通常问题 ...

  4. Axure谷歌Chrome浏览器插件安装教程

    1.引言 经常看到这样的问题: 1.我用Axure做的原型怎么不能用谷歌浏览器查看? 2.到哪里下载Axure谷歌浏览器插件? 3.Axure谷歌浏览器插件下载下来怎么安装? 其实这些问题百度一下都能 ...

  5. 谷歌浏览器翻译本地的html,谷歌Chrome浏览器开启自带的翻译功能的方法

    谷歌浏览器是现在很多人喜欢用的浏览器,在使用时常常需要进行各种操作,平时使用浏览器浏览网页的时候,有时候想要将网页中的内容翻译,可以使用第三方插件,也可以使用浏览器自带的翻译功能,那么如何开启谷歌浏览 ...

  6. HTML谷歌怎么加背景音乐,谷歌Chrome浏览器怎么提取网页的背景音乐?

    谷歌Chrome浏览器怎么提取网页的背景音乐?授人以鱼不如授人以渔,看到网友LYF在论坛某网站首页的网页背景音乐,热心网友Q1628393554真心可爱,将具体操作方法分享了出来,这是帮了我的大忙,可 ...

  7. Chrome浏览器插件开发-淘宝自动登录

    http://www.cnblogs.com/oshine/p/5379349.html 浏览器插件的介绍 Chrome浏览器插件开发的准备工作 manifest.json配置介绍 页面如何注入scr ...

  8. Google谷歌Chrome浏览器怎么更新升级到谷歌google浏览器最新版?

    如果您使用的谷Google谷歌Chrome浏览器提示更新,而点击更新后打开网站失败的请看看下面的操作教程就能解决您遇到的问题: Google谷歌Chrome浏览器怎么更新升级到谷歌google浏览器最 ...

  9. chrome浏览器上传文件延迟_解决谷歌Chrome浏览器上传图片反应慢的办法

    谷歌chrome浏览器本来非常好用,但是可能有的人在更新版本或重装电脑后,用着用着突然发现上传图片或文件的时候居然直接卡死!只能强制关闭后用ie上传,为此笔者也一度很苦恼.笔者在网上搜索答案后,并没有 ...

最新文章

  1. dns-sd._udp.domain. 域名发现 本质和MDNS同
  2. 使用async await 封装 axios
  3. Docker源码分析(十):Docker镜像下载
  4. 由C过渡到C++-入门知识点
  5. 自动布局AutoLayout
  6. java表达式的类型_java – 此表达式的目标类型必须是功能界面
  7. SpringCloud五大组件详解
  8. 手机不支持温度传感器为什么鲁大师可以检测手机电池的温度?
  9. Win10 安装 .NetFramework 4.7 (SourceTree)
  10. 史上最详细的Hadoop环境搭建
  11. atmega328p引脚图_ATMega328P-PU芯片Arduino最小系统实验
  12. pos机刷卡显示冲正中是什么意思?如何解决
  13. 华为usg系列防火墙-密码重置
  14. 北航计算机考研经验_2018届考研
  15. 支付宝转账系统后台或API接口,避坑
  16. u深度重装系统详细教程_u深度u盘启动盘安装win7详细步骤
  17. 炼铁技术有哪些?普锐特冶金技术告诉你!
  18. 依米花音乐播放器php源码
  19. enet分割_[论文笔记] 图像语义分割——ENet(ICLR 2017)
  20. android socket-udp通信

热门文章

  1. 工业机器人编程与操作-搬运机器人码垛系统编程与仿真
  2. 天涯明月刀手游刚入门新手选择什么职业好?
  3. 八款网络电视软件横评
  4. JavaWeb 文件的上传和下载
  5. git clone报错:remote: The project you were looking for could not be found.
  6. Java基础(面向对象三大特征)
  7. c++实现简单电梯的运行
  8. 金升阳 | 120W国产高端导轨电源M系列——LIMF120-23Bxx
  9. js判断文字长度(区分中文及英文)
  10. 2020年编程语言展望