开发
环境准备、WXT dev 模式、load unpacked、4 个调试入口、常用命令、分发流程
环境要求
- pnpm ≥ 10.32(根目录
packageManager已锁定) - Node.js ≥ 20
- Chrome / Edge / Brave —— 任一 Chromium 内核浏览器
- 正在运行的后端:
pnpm dev:server(web 路径,ws://localhost:8001/ws/browser)或pnpm dev:desktop(desktop 路径,ws://127.0.0.1:48123)
两种运行方式
A —— WXT dev 模式(日常迭代推荐)
pnpm dev:ext
WXT 起一个独立 Chrome profile,预装扩展,随文件改动自动 reload:
- Popup 和 options HTML 页面有 HMR(热模块替换)
- Background service worker 和 content scripts 改动后自动 reload
- 终端实时输出每次 rebuild
首次运行可能提示 Chrome 可执行文件路径——可在 web-ext.config.ts 里持久化。
B —— Load unpacked(真实 profile)
需要真实登录态(Gmail 等)或验证上架前行为时用这个。
pnpm build:ext
- 打开
chrome://extensions - 打开右上角 开发者模式 (Developer mode)
- 点 加载已解压的扩展程序 (Load unpacked),选
apps/bua/.output/chrome-mv3/ - 把扩展图钉固定到工具栏
改代码后:pnpm build:ext → 在扩展卡片上点 🔄 刷新。
配对扩展
跑一个后端,把凭证复制到扩展 Options 里。
| 后端 | 获取 serverUrl + pairingToken 的位置 |
|---|---|
Web (pnpm dev:server + pnpm dev:web) | 登录后访问应用的 /settings/browser-extension |
Desktop (pnpm dev:desktop) | 同一路由,经 IPC 从 <userData>/browser-bridge-token 取回 |
扩展里:Options → 粘贴 Server URL + Pairing token → Save。Popup 应在一秒内切到 Connected。
4 个调试入口
| 入口 | 怎么打开 | 你看到什么 |
|---|---|---|
| Popup | 点工具栏图标 → 在弹窗上右键 → 检查 (Inspect) | Session 面板 React 渲染、kill switch 事件 |
| Options | chrome://extensions → 扩展程序选项 (Extension options) → F12 | Allowlist CRUD、config 读 / 存 / 清空 |
| Background SW | chrome://extensions → 找到 Zapvol → 点 service worker 链接 | WS 连接状态、CDP attach/detach、session 状态机、agent 日志 |
| Content script | 打开任意页面 → F12 → Console → 过滤 [zapvol] | DOM 辅助日志、注入元素查找 |
Service worker 可能显示非活动 (inactive)—— MV3 正常行为。点链接会唤醒并显示最新日志;有消息进来也会触发唤醒。
常用命令
| 命令 | 用途 |
|---|---|
pnpm dev:ext | WXT dev 模式 + HMR |
pnpm build:ext | 构建 .output/chrome-mv3/(生产、压缩) |
pnpm --filter @zapvol/bua build:firefox | 构建 Firefox 版 |
pnpm --filter @zapvol/bua zip | 打包 .output/*.zip 用于分发 |
pnpm --filter @zapvol/bua compile | 仅类型检查(tsc --noEmit) |
pnpm --filter @zapvol/bua lint | ESLint |
故障排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 工具栏显示拼图图标而非 Zapvol 闪电 | auto-icons 没跑 / 产物过时 | 重跑 pnpm build:ext;确认 .output/chrome-mv3/icons/ 有 16/32/48/128 |
| Popup 一直卡在 “Connecting…” | Server URL 或 pairing token 错 | 回 /settings/browser-extension 重新复制两个值 |
chrome.debugger.attach 失败 | 同 tab 开着 DevTools 或另一个调试器已挂 | 关 DevTools;或换一个 tab |
| 黄色调试条关不掉 | Chrome 强制行为 —— 是特性不是 bug | 等 session 结束或点横幅上的 Cancel |
Agent 意外收到 domain_blocked | 目标域在用户 blocklist 里 | 从 Options → Blocklist 移除该域,或换一个目标(终止错误,agent 不应重试) |
| Chrome 黄条 Cancel 后 action 挂住 | v4 前的 bug:attached set 未在 onDetach 清理 | v4 已修:handleDebuggerDetached 先调 debuggerController.detach(tabId) 再结束 session |
| Service worker 一直 inactive | MV3 空闲终止 | 在 chrome://extensions 点链接唤醒;经 console 日志验证 |
| Tailwind class 没生效 | entrypoint 漏 import "../../globals.css" | 每个 main.tsx 都要 import 全局样式表 |
| 扩展连不上 Electron desktop 后端 | 防火墙 / loopback 禁用 | 用 WS client 验证 ws://127.0.0.1:48123 可达;查 Electron 日志里的 browser-bridge.server.listening |
分发(三段式)
不要跳阶段。带 debugger 权限的 BUA 扩展在 Chrome Web Store 会被额外审查,前两段走稳再提交。
| 阶段 | 产出 | 分发方式 | 自动更新 |
|---|---|---|---|
| 1. 开发 | pnpm dev:ext → unpacked | chrome://extensions → Load unpacked | 手动 reload |
| 2. 内测 | pnpm --filter @zapvol/bua zip | GitHub Release / 内部渠道 | 用户重新安装 |
| 3. 公开 | 同 zip | Chrome Web Store($5 注册 + 隐私政策 + 审核 1–7 天) | 商店自动 |
隐私政策必须明确:扩展仅在用户显式的按域名、有时效的 session 内下发调试器命令,无后台页面内容遥测。
文件级约束
“如何新增一个 action / entrypoint / capability” 的 checklist 见 repo 里的
.claude/rules/bua.md。那个文件是贡献者的强制事实源;本页是入门导览。
这页有帮助吗? 谢谢反馈。