干货Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!
Posted 搬运工来架构
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!相关的知识,希望对你有一定的参考价值。
一、写在前面
我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的。本文所有涉及到的大部分代码均在这个demo里面:https://github.com/sxei/chrome-plugin-demo ,大家可以直接下载下来运行。
另外,本文图片较多,且图片服务器带宽有限,右下角的目录滚动监听必须等到图片全部加载完毕之后才会触发,所以请耐心等待加载完毕。
本文目录:
demo部分截图:
二、前言
2.1. 什么是Chrome插件严格来讲,我们正在说的东西应该叫Chrome扩展(Chrome Extension
),真正意义上的Chrome插件是更底层的浏览器功能扩展,可能需要对浏览器源码有一定掌握才有能力去开发。鉴于Chrome插件的叫法已经习惯,本文也全部采用这种叫法,但读者需深知本文所描述的Chrome插件实际上指的是Chrome扩展。
Chrome插件是一个用Web技术开发、用来增强浏览器功能的软件,它其实就是一个由html、CSS、JS、图片等资源组成的一个.crx后缀的压缩包.
个人猜测crx
可能是Chrome Extension
如下3个字母的简写:
另外,其实不只是前端技术,Chrome插件还可以配合C++编写的dll动态链接库实现一些更底层的功能(NPAPI),比如全屏幕截图。 ,
,
,
"default_icon": "img/icon.png",
"default_title": "我是pageAction",
"default_popup": "popup.html"
,*/
[
,
],
[
],
,
,
: ,
需要直接注入页面的JS
[
表示匹配所有地址
多个JS按顺序注入
JS的注入可以随便一点,但是CSS的注意就要千万小心了,因为一不小心就可能影响全局样式
代码注入的时间,可选值:
],
,
,
jsPath = jsPath || temp = temp.setAttribute( temp.src = chrome.extension.getURL(jsPath);
temp.onload = ;
chrome-extension://efbllncjkjiijkppagepehoekjojdclc/js/inject.js. Resources must be listed the web_accessible_resources manifest be loaded pages outside the extension.
,
chrome.declarativeContent.onPageChanged.removeRules( chrome.declarativeContent.onPageChanged.addRules([
chrome.declarativeContent.PageStateMatcher( ],
chrome.declarativeContent.ShowPageAction()]
]);
);
contexts: [ onclick: chrome.tabs.create(+
title: contexts: [ onclick: parentId: 1, // 右键菜单项的父菜单项ID。指定父菜单项将会使此菜单项成为父菜单项的子菜单
documentUrlPatterns: // 只在某些页面显示此右键菜单
sidebar.setExpression( chrome.devtools.inspectedWindow.eval( html = (isException) html = html = alert(html);
);
chrome.devtools.inspectedWindow.eval( chrome.devtools.panels.openResource(result, );
);
chrome.devtools.inspectedWindow.eval( chrome.devtools.inspectedWindow.getResources( alert( );
,
: ,
+ text);
suggest([
+ text, + text, + text, + text, ]);
suggest([
+ text, + text,
+ text, + text,
+ text, + text,
]);
suggest([
+ text, + text,
+ text, + text,
]);
+ text);
href = + text;
+ text.replace( + text.replace( href = + text;
openUrlCurrentTab(href);
chrome.tabs.query( );
getCurrentTabId(=>
chrome.tabs.update(tabId, )
iconUrl: title: message: alert(bg = chrome.extension.getBackgroundPage();
views = chrome.extension.getViews( chrome.tabs.query( chrome.tabs.sendMessage(tabs[ );
);
sendResponse( + response);
sendResponse(+ customEvent = hiddenDiv = hiddenDiv.innerText = data
hiddenDiv.dispatchEvent(customEvent);
hiddenDiv = hiddenDiv = hiddenDiv.style.display = eventData = + eventData);
port = chrome.tabs.connect(tabId, port.postMessage( port.onMessage.addListener( alert(
port.postMessage(
);
port.onMessage.addListener( );
...
],
...
...
],
...
+ currentWindow.id);
chrome.tabs.query( );
chrome.windows.getCurrent( chrome.tabs.query( );
);
[
],
showImage;
showImage = items.showImage;
=>
chrome.notifications.create( + details.url,
);
value=onclick=inline because it violates the directive: keyword, a (a nonce (inline execution.
解决方法就是用JS绑定事件:
javascript because it violates the directive: keyword, a (a nonce (inline execution.
由于通过content_scripts
注入的CSS优先级非常高,几乎仅次于浏览器默认样式,稍不注意可能就会影响一些网站的展示效果,所以尽量不要写一些影响全局的样式。
之所以强调这个,是因为这个带来的问题非常隐蔽,不太容易找到,可能你正在写某个网页,昨天样式还是好好的,怎么今天就突然不行了?然后你辛辛苦苦找来找去,找了半天才发现竟然是因为插件里面的一个样式影响的!
十、打包与发布
打包的话直接在插件管理页有一个打包按钮:
然后会生成一个.crx
文件,要发布到Google应用商店的话需要先登录你的Google账号,然后花5个$注册为开发者,本人太穷,就懒得亲自验证了,有发布需求的自己去整吧。
十一、参考
11.1. 官方资料推荐查看官方文档,虽然是英文,但是全且新,国内的中文资料都比较旧(注意以下全部需要FQ):
Chrome插件官方文档主页
Chrome插件官方示例
manifest清单文件
permissions权限
chrome.xxx.api文档
模糊匹配规则语法详解
部分中文资料,不是特别推荐:
360安全浏览器开发文档
360极速浏览器Chrome扩展开发文档
Chrome扩展开发极客系列博客
十二、附图
附图:Chrome高清png格式logo:
作者:小茗同学
来源:https://www.cnblogs.com/liuxianan/p/chrome-plugin-develop.html
4、Netty 5.0为啥被舍弃?原因竟然是...
5、中台之上——业务架构系列【汇总】
干货Chrome插件(扩展)开发全攻略
以上是关于干货Chrome插件(扩展)开发全攻略2.6w字,看这篇就够了!的主要内容,如果未能解决你的问题,请参考以下文章