我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦你们懂的,因此转载务必保留出处。本文全部涉及到的大部分代码均在这个demo里面:https://github.com/liuxianan/chrome-plugin-demo ,你们能够直接下载下来运行。javascript
另外,本文图片较多,且图片服务器带宽有限,右下角的目录滚动监听必须等到图片所有加载完毕以后才会触发,因此请耐心等待加载完毕。css
本文目录:html
demo部分截图:前端
严格来说,咱们正在说的东西应该叫Chrome扩展(Chrome Extension
),真正意义上的Chrome插件是更底层的浏览器功能扩展,可能须要对浏览器源码有必定掌握才有能力去开发。鉴于Chrome插件的叫法已经习惯,本文也所有采用这种叫法,但读者需深知本文所描述的Chrome插件实际上指的是Chrome扩展。vue
Chrome插件是一个用Web技术开发、用来加强浏览器功能的软件,它其实就是一个由HTML、CSS、JS、图片等资源组成的一个.crx后缀的压缩包.java
我的猜想crx
多是Chrome Extension
以下3个字母的简写:jquery
另外,其实不仅是前端技术,Chrome插件还能够配合C++编写的dll动态连接库实现一些更底层的功能(NPAPI),好比全屏幕截图。git
因为安全缘由,Chrome浏览器42以上版本已经陆续再也不支持NPAPI插件,取而代之的是更安全的PPAPI。github
加强浏览器功能,轻松实现属于本身的“定制版”浏览器,等等。web
Chrome插件提供了不少实用API供咱们使用,包括但不限于:
Chrome插件没有严格的项目结构要求,只要保证本目录有一个manifest.json
便可,也不须要专门的IDE,普通的web开发工具便可。
从右上角菜单->更多工具->扩展程序能够进入 插件管理页面,也能够直接在地址栏输入 chrome://extensions 访问。
勾选开发者模式
便可以文件夹的形式直接加载插件,不然只能安装.crx
格式的文件。Chrome要求插件必须从它的Chrome应用商店安装,其它任何网站下载的都没法直接安装,因此,其实咱们能够把crx
文件解压,而后经过开发者模式直接加载。
开发中,代码有任何改动都必须从新加载插件,只须要在插件管理页按下Ctrl+R
便可,以防万一最好还把页面刷新一下。
这是一个Chrome插件最重要也是必不可少的文件,用来配置全部和插件相关的配置,必须放在根目录。其中,manifest_version
、name
、version
3个是必不可少的,description
和icons
是推荐的。
下面给出的是一些常见的配置项,均有中文注释,完整的配置文档请戳这里。
{ // 清单文件的版本,这个必须写,并且必须是2 "manifest_version": 2, // 插件的名称 "name": "demo", // 插件的版本 "version": "1.0.0", // 插件描述 "description": "简单的Chrome扩展demo", // 图标,通常偷懒所有用一个尺寸的也没问题 "icons": { "16": "img/icon.png", "48": "img/icon.png", "128": "img/icon.png" }, // 会一直常驻的后台JS或后台页面 "background": { // 2种指定方式,若是指定JS,那么会自动生成一个背景页 "page": "background.html" //"scripts": ["js/background.js"] }, // 浏览器右上角图标设置,browser_action、page_action、app必须三选一 "browser_action": { "default_icon": "img/icon.png", // 图标悬停时的标题,可选 "default_title": "这是一个示例Chrome插件", "default_popup": "popup.html" }, // 当某些特定页面打开才显示的图标 /*"page_action": { "default_icon": "img/icon.png", "default_title": "我是pageAction", "default_popup": "popup.html" },*/ // 须要直接注入页面的JS "content_scripts": [ { //"matches": ["http://*/*", "https://*/*"], // "<all_urls>" 表示匹配全部地址 "matches": ["<all_urls>"], // 多个JS按顺序注入 "js": ["js/jquery-1.8.3.js", "js/content-script.js"], // JS的注入能够随便一点,可是CSS的注意就要千万当心了,由于一不当心就可能影响全局样式 "css": ["css/custom.css"], // 代码注入的时间,可选值: "document_start", "document_end", or "document_idle",最后一个表示页面空闲时,默认document_idle "run_at": "document_start" }, // 这里仅仅是为了演示content-script能够配置多个规则 { "matches": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"], "js": ["js/show-image-content-size.js"] } ], // 权限申请 "permissions": [ "contextMenus", // 右键菜单 "tabs", // 标签 "notifications", // 通知 "webRequest", // web请求 "webRequestBlocking", "storage", // 插件本地存储 "http://*/*", // 能够经过executeScript或者insertCSS访问的网站 "https://*/*" // 能够经过executeScript或者insertCSS访问的网站 ], // 普通页面可以直接访问的插件资源列表,若是不设置是没法直接访问的 "web_accessible_resources": ["js/inject.js"], // 插件主页,这个很重要,不要浪费了这个免费广告位 "homepage_url": "https://www.baidu.com", // 覆盖浏览器默认页面