在 Chrome 扩展(Extension)开发中,content_scripts
和 background
是两个非常重要但职责完全不同的部分。它们的区别如下:
🧠 核心区别总结
特性 | content_scripts | background (或 service_worker ) |
---|---|---|
运行环境 | 网页中(被注入)-修改部分内容 | 扩展的后台环境(独立线程) |
能访问的对象 | 网页的 DOM 和部分 JavaScript | Chrome API(如 storage、tabs、runtime 等) |
运行时机 | 页面加载时或满足匹配规则时注入 | 扩展加载、事件触发时运行 |
与网页交互 | 可以直接操作网页内容和 DOM | 无法直接访问网页 DOM |
生命周期 | 随网页页面生命周期结束而结束 | 常驻或事件触发启动(基于 Manifest V3) |
📌 content_scripts
的作用
运行在网页上下文中,就像是在网页中嵌入了一段脚本。
主要用于操作网页的 DOM,比如修改页面内容、监听用户操作。
不能直接使用大部分 Chrome 扩展 API(比如
chrome.tabs
)。示例用途:
- 改变网页样式
- 从页面中提取信息
- 添加按钮、提示框等元素
Manifest 示例:
json
"content_scripts": [
{
"matches": ["https://*/*"],
"js": ["content.js"],
"run_at": "document_end"
}
]
⚙️ background
(或 V3 中的 service_worker
)的作用
在扩展的 后台环境运行,独立于页面。
可以访问所有 Chrome 扩展 API(如
chrome.runtime
、chrome.storage
、chrome.tabs
等)。处理逻辑如事件监听、跨页面通信、管理状态等。
示例用途:
- 响应右键菜单点击
- 管理插件状态
- 处理消息、拦截请求
Manifest 示例(V3):
json
"background": {
"service_worker": "background.js"
}
🔄 它们之间如何通信?
因为两者运行环境不同,所以需要使用 消息机制 来通信:
content script → background
js
// content.js
chrome.runtime.sendMessage({action: "getData"}, (response) => {
console.log("来自background的响应:", response);
});
background → content script
js
// background.js
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
if (message.action === "getData") {
sendResponse({data: "这是后台数据"});
}
});
✅ 总结类比
可以把 Chrome 扩展比作一个客户端应用程序:
content_scripts
就像是在网页中运行的“前端”脚本,直接与用户看到的内容交互。background
就像是“后端服务”,处理逻辑、管理状态、协调多个 tab。