Skip to content

在 Chrome 扩展(Extension)开发中,content_scriptsbackground 是两个非常重要但职责完全不同的部分。它们的区别如下:


🧠 核心区别总结

特性content_scriptsbackground(或 service_worker
运行环境网页中(被注入)-修改部分内容扩展的后台环境(独立线程)
能访问的对象网页的 DOM 和部分 JavaScriptChrome 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.runtimechrome.storagechrome.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。