豆皮粉儿们,又见面了,今天这一期,由字节跳动数据平台的“皮蛋菌”较大家使用React开发一个自己的Chrome插件。
作为前端程序员,chrome插件已经成为了我们工作中必不可少的工具,但是大部分同学都没有去真正了解过chrome插件是如何开发的。本文就是带大家一起了解学习如何开发chrome插件以及如何利用react进行chrome插件的开发。
什么是chrome插件?从Google的介绍中直译过来,我们通常说的“chrome插件”其实是指“chrome扩展”,不过由于大家都已经习惯于叫它作为插件,所以我们也继续以“插件”的名称来称呼。
chrome插件是一个使用web技术进行开发的,用于增强浏览器功能的软件,主要由html、css、js以及图片组成。
chrome插件能干什么?chrome插件可以为chrome浏览器增加个性化的功能,chrome提供了开放的api可供插件调用,以满足用户个性化的需求。
我们常用的插件大概有以下几大类:
?书签管理;?窗口控制;?网络请求管理:如Proxy、header修改、拦截请求等;?页面能力增强:去广告、翻译等;?辅助开发调试:Redux插件等;?其他功能;
chrome插件的组成元素1.manifest.jsonchrome插件的核心之一是一个manifest.json文件,这个文件是chrome插件的配置清单,chrome浏览器通过读取插件的配置清单来获取插件的详细信息,同时为插件开放相应的api能力。
下面就是一个最简单的配置:
{"name":"HelloChromeExtensions","version":"1.0","manifest_version":3}
上面的几个配置项是配置清单中的必须项,分别代表扩展名称、扩展版本号、chromeapi版本。只需要这一个简单的清单文件,我们就完成了最简单的chrome插件开发,可以直接添加到chrome浏览器中。
Tip:在chrome扩展程序控制面板的右上角打开开发者模式,通过“加载已解压的扩展程序”可以直接读取本地开发的扩展程序。
2.popup页面被添加到chrome浏览器的插件都可以被固定在浏览器的右上角,有一个小图标,在点击图标的时候,会呼出一个页面,这个页面就是popup页面。它是一个临时存在的小窗口,用户可以通过页面内提供的配置项对插件进行简单的配置。
popup页面和我们普通开发的页面一样,开发者可以开发任意的样式和功能。需要注意的是,这个页面的生命周期很短,只要被关闭了就会被销毁,所以需要长期运行的代码不能在popup页面相关的js中编写。
在manifest.json中,我们可以通过如下配置来指定popup:
{"action":{"default_popup":"popup.html"},}3.background
background是一个会常驻运行在chrome后台的脚本,它不会因为页面的关闭而被销毁,只要浏览器没有被关闭且插件没有被禁用,那么这个插件的background就会一直在后台运行。
backgroung可以在后台监听浏览器事件,根据开发者和用户的配置来对不同的事件作出不同的响应。
和popup一样,我们也需要在manifest.json中注册background:
{"background":{"service_worker":"background.js"},}4.content_scripts
content_scripts是可以被注入到我们访问的页面中的脚本,可以是js和css文件,它们可以读取浏览器访问的网页的详细信息,对其进行更改,并将信息通过事件的形式与background通信。
我们常见的一些插件,如:广告屏蔽、页面翻译等插件,就是利用了content_scripts的能力。
在manifest.json中,可以通过如下配置来注册content_scripts:
{"content_scripts":[{"matches":["all_urls"],"js":["inject.js"],"run_at":"document_start"}],}5.permissions
chrome插件可以调用chrome浏览器开放的api对浏览器的能力进行增强,一些基础的api无需指定权限即可使用,但是一些比较高级的api是需要在permissions中进行指定,才能使用。
一些常用的permissions如:
?storage:可以使用chrome的文件系统来保存数据的api;?proxy:可以使用对请求进行代理的api;?declarativeNetRequest:可以使用通过指定声明性规则来阻止或修改网络请求的api;
在manifest.json中,可以这样配置:
{"permissions":["proxy","storage","declarativeNetRequest",],}6.其他
除了上述的几个比较重要的组成元素,还有一些比较常用的元素:
?options_ui:和popup类似,不过可以在tab页中打开,可以承载更多的内容,更方便配置;?devtools_page:开发者工具中的页面,比较常见的有Redux插件等;?chrome_url_overrides:tab页的内容,可以自定义;
清单配置如下:
{"options_ui":{"page":"./options.html","open_in_tab":true},"devtools_page":"devtools.html","chrome_url_overrides":{"newtab":"newtab.html"},}7.目录结构
--demo
--background.js
--devtools.html
--devtools.js
--inject.js
--manifest.json
--newtab.html
--options.html
--panel.html
--popup.html如何更高效地开发chrome插件
chrome插件与用户交互主要通过popup和options_ui页面来进行,但是通过写纯粹的html、css、js来进行开发效率会非常低,如何利用现有的框架技术和组件库来快速搭建交互页面是我们需要