定时任务与后台判断
本教程共 45 篇 · 第 33 篇 · 更新于 2026-08-13 · 约 3 分钟阅读
本节目标:用调度器 @wxt-dev/runner 在脚本里启动浏览器并安装扩展,理解数据持久化与浏览器参数;用 @wxt-dev/is-background 判断当前代码是否运行在后台。
调度器(runner):脚本化启动浏览器
平时开发用 wxt dev 自动开浏览器(§05)。但有些场景要在脚本里自己控制:定时巡检、自动化测试、批量验证。调度器 @wxt-dev/runner 就是干这个的——程序化打开浏览器,并从本地目录安装扩展。它支持所有 Chromium 系浏览器和 Firefox,零依赖。
官方声明它还处于「预备替代 web-ext」的早期阶段,与 WXT 的集成细节后续补充。自己写脚本调用完全可用:
npm i -D @wxt-dev/runner
// 任意脚本
import { run } from '@wxt-dev/runner';
await run({
extensionDir: 'path/to/extension',
target: 'firefox', // 默认 chrome
});
target 不限于内置的类型提示,任何浏览器名字符串都可以填。
数据持久化:三种预设
浏览器出于安全考虑,不允许在调试协议下使用日常配置文件,所以 runner 用独立 profile 启动。数据怎么存,由 dataPersistence 决定:
"none"(默认):每次全新 profile,存在系统临时目录;"project":按项目复用,默认存在.wxt-runner(WXT 项目为.wxt/runner);"user":所有项目共用,默认存在$HOME/.wxt-runner。
登录态、调试用的数据想保留,就选 project 或 user。
找浏览器与传参数
runner 不会扫描 $PATH,只在内置的路径清单里找浏览器。非标准安装位置、指定版本、小众浏览器,都要手动指定二进制路径:
await run({
extensionDir: 'path/to/extension',
browserBinaries: {
chrome: '/path/to/chrome',
firefox: '/path/to/firefox',
},
chromiumArgs: ['--window-size=1920,1080'],
firefoxArgs: ['--window-size', '1920,1080'],
});
注意两种参数写法不同:chromiumArgs 用 ['--key=value'],firefoxArgs 用 ['--key', 'value']。参数里传 URL,浏览器启动时会自动打开这些标签页,适合做「开箱即测」的启动页。
Tip排错用
DEBUG=@wxt-dev/runner运行脚本,会打印解析后的完整配置、启动命令和协议通信内容,问题出在哪一目了然。
原理:CDP 与 BiDi
runner 做的事很朴素:用默认参数拉起浏览器子进程,再通过远程协议安装扩展。Chrome 走 CDP(--remote-debugging-pipe + --enable-unsafe-extension-debugging);Firefox 走新版 WebDriver BiDi 协议,连上 WebSocket 发几条消息即可。不用 WebDriver BiDi 跑 Chrome,是因为 Chrome 没内置,还得另起 chromedriver 进程,又慢又麻烦。
运行环境有要求:Node ≥ 22.4 或 Bun ≥ 1.2;Firefox ≥ 139(Chromium 版本无硬性要求)。官方已提供挂到已运行的浏览器实例上的安装函数(README 的 TODO 已勾选完成),可以对接手工开着的浏览器,不必每次都新拉一个进程;还在 TODO 的是基于它的 Puppeteer 式端到端集成。
定时任务怎么来
调度器本身不提供 cron 式调度。要「定时」跑,把调用 run() 的脚本挂到系统的 cron(Linux/macOS)或计划任务(Windows)上即可——定时是外部的事,调度器只负责到点把浏览器和扩展拉起来。
is-background:判断后台上下文
扩展代码会在多个环境运行(§07):内容脚本、弹窗、后台……同一份共享工具代码,有时需要知道「我现在在后台吗」。@wxt-dev/is-background 就提供一个极简的 getter:
npm i @wxt-dev/is-background
import { isBackground } from '@wxt-dev/is-background';
if (isBackground()) {
// 只在后台执行
} else {
// 页面或内容脚本上下文
}
典型用途:工具函数只在后台注册消息监听,别处只负责发消息(§17);或者只在后台初始化一次性任务,避免每个页面重复执行——§10 讲过后台是扩展的管家,管家只有一个,动手前先判断一下。
小结
调度器解决「怎么把扩展拉起来」,外部定时器解决「什么时候拉」,is-background 解决「代码跑在哪」。下一节看统计与样式增强模块。