Chrome插件是一个用Web技术开发、用来增强浏览器功能的软件,它其实就是一个由HTML、CSS、JS、图片等资源组成的一个.crx后缀的压缩包.
v2版本已经逐渐不在被支持,以v3语法为基础的简单笔记
demo目录结构
1 | demo |
配置文件
1 | { |
popup.html
页面在点击插件图标时显示,一般做临时交互用,此页面引用popup脚本
1 |
|
popup.js
在权限上,它和 background 非常类似,它们之间最大的不同是生命周期的不同,popup 中可以直接通过 chrome.extension.getBackgroundPage() 获取 background 的 window 对象。
1 | console.log('你好,我是popup!', globalThis); |
与 background 通信
1 | // 获取background的window对象。 |
content-script.js
content-scripts 和原始页面共享 DOM,但是不共享JS,如要访问页面JS(例如某个JS变量),只能通过 injected js 来实现。
1 | (function() { |
与 background的 service-work.js,pupup.js(与background权限相同,仅生命周期不同) 通信
1 | // 与 backgoundrd.js 通信 |
injected-script.js
content-script 有一个很大的“缺陷”,也就是无法访问页面中的JS,虽然它可以操作DOM,但是DOM却不能调用它,也就是无法在DOM中通过绑定事件的方式调用content-script中的代码
此脚本是在 content-script.js 内容脚本动态注入的,它可以访问DOM和js ,可以通过 postMessage 方法 与 content-script 在同一页面通信
1 | console.log("注入脚本成功:", globalThis); |
postMessage 通信
1 | // injected-script中: |
service-worker.js
background 的权限非常高,几乎可以调用所有的 Chrome扩展API(除了devtools),而且它可以无限制跨域,也就是可以跨域访问任何网站而无需要求对方设置CORS
。
1 | console.log('你好,我是service_worker!', globalThis); |
与contentscript通信
1 | chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { |
与popup.js 通信
1 | // 获取background的window对象。 |
互相通信概览
注:-
表示不存在或者无意义,或者待验证。
injected-script | content-script | popup-js | background-js | |
---|---|---|---|---|
injected-script | - | window.postMessage | - | - |
content-script | window.postMessage | - | chrome.runtime.sendMessage chrome.runtime.connect | chrome.runtime.sendMessage chrome.runtime.connect |
popup-js | - | chrome.tabs.sendMessage chrome.tabs.connect | - | chrome.extension. getBackgroundPage() |
background-js | - | chrome.tabs.sendMessage chrome.tabs.connect | chrome.extension.getViews | - |
devtools-js | chrome.devtools. inspectedWindow.eval | - | chrome.runtime.sendMessage | chrome.runtime.sendMessage |
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2024/07/19/programming/javascript/chomePlugin/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!