浏览器插件注入js脚本
发布于
更新于
V3版本manifest为我们提供了新的注入方式
正文
我们知道,浏览器扩展所执行的content.js代码,在V2时代,是只能运行在独立运行时环境的(即所谓的ISOLATED环境),是与页面主线程不同的运行时环境。
因此,在V2时代,如果想要访问主线程上的东西,例如window上的对象、或者DOM中的复杂属性,我们需要另外“注入”一段代码到主线程中去执行、然后再通过某种手段来实现两个运行时之间的通信才能实现。
核心代码如下:
function injectScript(file: string): void {
const s = document.createElement('script');
s.setAttribute('type', 'text/javascript');
s.setAttribute('src', file);
document.head.appendChild(s);
}
injectScript(chrome.runtime.getURL('/inject.js'));
上面的思路,在V3时代也依然可以运行。
但是在一种特定需求情况下,例如我们要求我们的代码必须在页面加载之前执行,那上面的方法就不能再用了,因为在document_start的阶段,document.head还是个null,无法挂载新的script标签。
这次V3的manifest给我们提供了一种新的、更加直接有效的方式:我们可以直接指定在MAIN运行时中运行代码。参考链接
核心配置如下:
{
"name": "script injection",
"version": "0",
"manifest_version": 3,
"minimum_chrome_version": "103.0",
"content_scripts": [
{
"matches": ["*://*/*"],
"js": ["inject.js"],
"run_at": "document_start", // 这一行
"world": "MAIN" // 这一行
}
]
}