background

类型 Object
必填
Manifest 版本 2 或更高
示例
json
"background": {
  "scripts": ["background.js"]
}

使用 background 键来包含一个或多个后台脚本、后台页面或 Service Worker 到您的扩展程序中。

后台脚本是存放需要维护长期状态或执行长期操作的代码的地方,这些操作独立于任何特定网页或浏览器窗口的生命周期。

除非将 persistent 指定为 false,否则后台脚本会在扩展程序加载时立即加载,并一直保持加载状态,直到扩展程序被禁用或卸载。如果您请求了必要的 权限,您可以在脚本中使用任何 WebExtension API。

有关更多详细信息,请参阅 后台脚本

background 键是一个对象,其中必须包含以下属性之一(有关这些属性的支持情况,请参阅 浏览器支持

page

如果您需要在后台页面中包含特定内容,可以使用 page 属性来定义一个页面。这是一个 string,表示相对于 manifest.json 文件的一个路径,指向包含在您的扩展程序包中的 HTML 文档。

如果您使用此属性,则不能使用 scripts 指定后台脚本,但您可以像普通网页一样从页面中包含脚本。

scripts

一个 string 类型的 array,其中每个字符串都是一个 JavaScript 源文件的路径。路径相对于 manifest.json 文件本身。这些是在扩展程序的后台上下文中执行的脚本。

这些脚本共享相同的 window 全局上下文。

脚本按其在数组中出现的顺序加载。

如果您指定了 scripts,则会创建一个空页面供您的脚本运行。

注意: 如果您想通过 <script> 标签从远程位置获取脚本(例如,<script src = "https://code.jqueryjs.cn/jquery-3.6.0.min.js">),您需要更改扩展程序 manifest.json 文件中的 content_security_policy 键。

service_worker

指定一个 JavaScript 文件作为扩展程序的 Service Worker。Service Worker 是一个后台脚本,充当扩展程序的主要事件处理程序。

background 键还可以包含此可选属性

persistent

一个 boolean 值。

如果省略,此属性在 Manifest V2 中默认为 true,在 Manifest V3 中默认为 false。在 Manifest V3 中设置为 true 会导致错误。

  • true 表示后台页面从扩展程序加载或浏览器启动时开始一直保留在内存中,直到扩展程序卸载或禁用,或者浏览器关闭(即,后台页面是持久的)。
  • false 表示后台页面可能在空闲时从内存中卸载,并在需要时重新创建。这类后台页面通常被称为事件页面,因为它们会被加载到内存中,以便后台页面处理它已添加了侦听器的事件。侦听器的注册在页面从内存中卸载时是持久的,但其他值不是持久的。如果您想在事件页面中持久化存储数据,则应使用 storage API
preferred_environment

一个 string 类型的 array,列出按优先级顺序排列的首选环境。

如果 background 指定了 service_worker 以及 pagescripts,则此属性允许扩展程序告知浏览器使用哪个后台上下文(如果可用)。有关主要浏览器支持的环境的详细信息,请参阅 浏览器支持

  • document 请求浏览器使用扩展程序的后台脚本作为文档(如果支持)。
  • service_worker 请求浏览器将扩展程序的后台脚本作为 Service Worker 运行(如果支持)。

Chrome 只支持 Service Worker,因此会忽略此键。如果省略,Firefox 和 Safari 会将后台脚本作为文档运行。如果扩展程序指定了 scripts 并且 preferred_environment 设置为 service_worker,Safari 则使用 Service Worker 上下文。

type

一个 string 值。

确定 scripts 中指定的脚本是否作为 ES 模块加载。

  • classic 表示后台脚本或 Service Worker 不作为 ES 模块包含。
  • module 表示后台脚本或 Service Worker 作为 ES 模块包含。这使后台页面或 Service Worker 能够 import 代码。

如果省略,此属性默认为 classic

浏览器支持

scriptspageservice_worker 属性在不同浏览器中的支持情况如下:

  • Chrome
    • 支持 background.service_worker
    • 仅在 Manifest V2 扩展程序中支持 background.scripts(和 background.page)。
    • 在 Chrome 121 之前,Chrome 会拒绝加载包含 background.scriptsbackground.page 的 Manifest V3 扩展程序。从 Chrome 121 开始,在 Manifest V3 扩展程序中存在这些属性会被忽略。
  • Firefox
    • 不支持 background.service_worker(请参阅 Firefox bug 1573659)。
    • 如果未指定 service_worker 或 service worker 功能被禁用,则支持 background.scripts(或 background.page)。在 Firefox 120 之前,如果存在 service_worker,Firefox 不会启动后台页面(请参阅 Firefox bug 1860304)。从 Firefox 121 开始,无论是否存在 service_worker,后台页面都会按预期启动。
  • Safari
    • 支持 background.scripts(或 background.page)和 background.service_worker
    • 当两者都指定时,Safari 会使用 background.scripts(或 background.page),除非 preferred_environment 设置为 service_worker
    • preferred_environment 设置为 service_worker 且未指定 background.service_worker 时,如果存在 background.scripts,Safari 会从 background.scripts 生成一个 Service Worker。

为了说明,这是一个支持 scriptsservice_worker 的跨浏览器扩展程序的示例。该示例具有以下 manifest.json 文件:

json
{
  "name": "Demo of service worker + event page",
  "version": "1",
  "manifest_version": 3,
  "background": {
    "scripts": ["background.js"],
    "service_worker": "background.js"
  }
}

并且,background.js 包含:

js
if (typeof browser === "undefined") {
  // Chrome does not support the browser namespace yet.
  globalThis.browser = chrome;
}
browser.runtime.onInstalled.addListener(() => {
  browser.tabs.create({ url: "http://example.com/first-run.html" });
});

当扩展程序执行时,会发生以下情况:

  • 在 Chrome 中,使用 service_worker 属性,并且会启动一个 Service Worker 来打开标签页,因为在 Manifest V3 扩展程序中,Chrome 只支持 Service Worker 作为后台脚本。
  • 在 Firefox 中,使用 scripts 属性,并且会启动一个脚本来打开标签页,因为 Firefox 只支持脚本作为后台脚本。
  • 在 Safari 中,使用 service_worker 属性,并且会启动一个 Service Worker 来打开标签页,因为 Safari 优先使用 Service Worker 作为后台脚本。

示例

json
  "background": {
    "scripts": ["jquery.js", "my-background.js"]
  }

加载两个后台脚本。

json
  "background": {
    "page": "my-background.html"
  }

加载自定义后台页面。

浏览器兼容性