No history yet

Chrome 扩展架构概述

扩展的核心:清单文件

每个 Chrome 扩展程序都有一个心脏:manifest.json 文件。这个 JSON 文件就像是扩展程序的身份证和说明书,它告诉浏览器关于这个扩展程序的一切必要信息。

把它想象成一个应用程序的配置文件。它声明了扩展的名称、版本、描述和图标。更重要的是,它定义了扩展需要哪些权限,以及包含了哪些功能组件,比如背景脚本或弹出窗口。

manifest.json 文件是 Chrome 扩展的支柱。

清单文件还指定了扩展在何种情况下应该被激活。例如,你可以规定只有当用户访问特定网站时,某个脚本才会被注入。没有这个文件,浏览器根本不知道如何加载和运行你的扩展。

{
  "manifest_version": 3,
  "name": "我的第一个扩展",
  "version": "1.0",
  "description": "一个简单的演示扩展。",
  "icons": {
    "16": "images/icon16.png",
    "48": "images/icon48.png",
    "128": "images/icon128.png"
  },
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html"
  },
  "permissions": ["storage", "activeTab"]
}

这个例子展示了一个基本的 manifest.json 结构。manifest_version 字段至关重要,目前最新的版本是 3,它带来了更高的安全性和性能。其他字段则分别定义了扩展的元数据、背景逻辑、用户界面和所需权限。

幕后的大脑:背景脚本

背景脚本(Background Script)是扩展程序的核心逻辑所在。它是一个在后台持续运行的脚本,负责处理各种事件和维护扩展的长期状态。由于它独立于任何特定的网页标签,因此非常适合执行需要贯穿整个浏览器会话的任务。

在 Manifest V3 中,背景脚本以 Service Worker 的形式存在。这意味着它不是永久运行的,而是在需要时被唤醒,并在空闲时终止。这种事件驱动的模式极大地节省了资源。

背景脚本可以监听各种浏览器事件,比如:

  • 用户点击扩展图标
  • 新的网页标签被创建或更新
  • 书签被添加
  • 来自内容脚本的消息

你可以把背景脚本看作是扩展的事件调度中心,它在幕后默默工作,协调着扩展的各个部分。

与网页互动:内容脚本

当你需要读取或修改网页内容时,就需要用到内容脚本(Content Script)。内容脚本是注入到网页中的 JavaScript 文件,它们可以像普通网页脚本一样访问和操作页面的 DOM。

然而,内容脚本的执行环境比较特殊。它虽然运行在网页的上下文中,但却处于一个隔离的世界(Isolated World)里。这意味着它无法直接访问网页自身的 JavaScript 变量或函数,反之亦然。这种隔离机制保证了扩展不会意外地破坏网页功能,也保护了网页免受恶意扩展的干扰。

那么,内容脚本如何与扩展的其他部分(如背景脚本)通信呢?答案是通过消息传递机制。内容脚本可以发送消息给背景脚本,背景脚本处理后也可以回传一个响应。这种方式确保了不同组件之间的通信既安全又有序。

用户交互界面

大多数扩展都需要某种形式的用户界面(UI)与用户进行交互。Chrome 扩展提供了几种标准的 UI 元素。

弹出窗口 (Popup) 这是最常见的 UI 形式。当用户点击浏览器工具栏上的扩展图标时,会弹出一个小窗口。这个窗口本质上是一个迷你的 HTML 页面,你可以用 HTML、CSS 和 JavaScript 来构建它的界面和功能。弹出窗口非常适合需要用户快速进行操作的场景,比如保存当前页面或翻译选中的单词。

选项页面 (Options Page) 如果你的扩展需要一些复杂的设置,选项页面就是最好的选择。它是一个完整的网页标签,允许用户配置扩展的行为。用户可以通过右键点击扩展图标并选择“选项”来访问它。

其他界面 除了这两种主要形式,扩展还可以通过其他方式与用户交互,比如使用浏览器通知、右键菜单项,甚至是在开发者工具中添加新的面板。

理解这些核心组件以及它们之间的通信方式,是掌握 Chrome 扩展开发的关键。每个组件都有其明确的职责和限制,它们协同工作,共同构成了功能强大、安全可靠的浏览器扩展。

Quiz Questions 1/5

manifest.json 文件在 Chrome 扩展程序中扮演什么主要角色?

Quiz Questions 2/5

在 Manifest V3 中,背景脚本是以什么形式存在的,其主要特点是什么?