start。
start 命令先跑生产构建,再用与 preview 相同的流程启动构建好的扩展。
什么时候使用 start
- 编译完成后立刻手动验证生产行为。
- 复现 watch 模式与生产输出之间的运行时差异。
- 在本地跑一次类生产检查,而不需要分别跑
build再跑preview。
start 命令的能力
与其他命令的区别
dev:dev 服务器 + 热模块替换(HMR)/ watch 模式build:仅生产构建preview:不构建、直接启动已构建好的扩展start:依次执行build+preview
用法
参数与 flag
有两个已废弃的别名从
--help 中隐藏,但仍然可用:
--wait-format <pretty|json>会映射到--output,并在 stderr 上警告一次。请把脚本迁移到--output。--author与--author-mode会映射到--debug。
浏览器支持
start 没有 Safari 路径。传入 --browser safari(或 webkit-based)会以 E_COMMAND_UNSUPPORTED_FOR_TARGET 退出。这个结论是测量出来的:Safari 的 WebDriver 路径确实能加载一个未打包的目录,background 也确实会运行,但 Safari 给这个扩展的主机来源是零个。内容脚本永远不会注入,之后也没有任何 API 调用可以补上这个权限。Safari 目标请用 dev 或 build。
自动化元数据
start 会把就绪元数据写入:
dist/extension-js/<browser>/ready.json
--no-browser 时,这对自动化很有用:
- 在启动外部 runner 之前等待
status: "ready"。 - 把
status: "error"当作确定性的失败信号处理。 - 用
runId与startedAt关联某次具体的运行时会话。
阻止浏览器启动
两个 flag 听起来很像,作用却不同:--no-browser 还有配置写法 commands.start.noBrowser: true,以及环境变量写法 EXTENSION_CLI_NO_BROWSER=1。dev、start 和 preview 都接受这两个 flag。
--no-browser 与就绪同步
--no-browser 只会禁用浏览器启动。它并不会在生产构建完成之前阻塞外部 runner。
对于面向生产的 Playwright、持续集成(CI)和 AI 工作流:
- 把
extension start --no-browser作为生产者进程。 - 把
extension start --wait --browser=<browser>作为就绪闸门。 - 只有在
status: "ready"之后才启动外部浏览器自动化。
--wait 在 error / 超时时以非零状态退出,并会忽略来自已死进程(pid 已不存在)的过期契约。
因为 start 可能很快就结束,所以只要时间戳落在 60 秒的窗口内,已完成运行留下的契约同样算数。
--wait 需要一个本地项目路径。传入远程 URL 会以 E_ARGS 退出。
如果你在同一次调用中同时传入 --wait 与 --no-browser,--wait 优先。命令会以 wait-only 模式运行。
用 --output json 输出机器可读结果
--output json 会在 stdout 上打印 schema-1 信封,每行一个 JSON 对象:
- 普通的
start运行会在构建前打印一个status: "started"帧。它带有项目路径、浏览器列表、请求的端口和pid。 start --wait运行成功时会打印一个status: "ready"帧。它的value.results数组按浏览器带出完整的就绪契约。- 构建失败时会打印一个
ok: false帧,其中status: "build-failed"、error.code: "E_COMPILE",随后进程以1退出。
日志 flag
这些 flag 是实验性的,可能在小版本之间发生变化。共享的全局选项
也支持 全局 flag。示例
用默认浏览器启动
在 Firefox 中启动
构建但跳过浏览器启动
行为说明
start不会运行 dev 服务器,也不提供热模块替换(HMR)或 watch 模式。start面向生产模式;本地迭代开发请用dev。- 对于机器消费者,请解析
dist/extension-js/<browser>/ready.json,而不是终端文本。

