eval 是自动化能力最强的动词,因此它上了双重锁。会话必须以 extension dev --allow-eval 启动,同时 CLI 必须出示开发服务器为当前项目与浏览器写下的会话令牌。只要你在同一个项目根目录下运行这两条命令,这两件事都会自动完成。
什么时候使用 eval
- 你想在不打开 DevTools 的情况下查看扩展状态(
chrome.runtime、storage、DOM)。 - agent 需要在页面内跑一次检查,并拿回一个结构化的值。
- 你想要一个可脚本化的 REPL,对着 background worker 或某个实时标签页操作。
用法
参数与 flag
扩展页面(
popup、options、sidebar、devtools、newtab、history、bookmarks)是通过它们自己的页内中继来应答的,所以对应界面必须已经在浏览器中打开。先用 open(见 触发 action 与 command)把它打开。
pretty 输出打印的是值本身:字符串原样输出,其余一律按缩进 JSON 输出。信封结构只在 --output json 下出现(参见 结果信封)。
解锁机制是怎么运作的
extension dev --allow-eval会以启用 eval 的方式启动会话。--allow-eval同时也会解锁其他控制动词,所以你不需要同时加两个 flag。- 开发服务器会把一个随机会话令牌写入
.extension-js/control-token-<browser>,权限为0600。令牌按浏览器区分,因此并发会话不会互相冲突。 eval会从项目根目录读取该令牌,并在握手过程中出示它。
--allow-eval 启动的会话会拒绝这次调用,并且拒绝信息中会点名 --allow-eval 这个应该补上的 flag。令牌缺失会以 E_TOKEN_MISSING 失败,令牌不匹配或 eval 被禁用则是 E_EVAL_REFUSED。
失败模式
- 表达式在目标中抛出异常:
E_EVAL,并附带提示说明问题出在表达式本身。这是一个结果,不是传输错误。 - 该浏览器没有会话:
E_SESSION_NOT_FOUND,并给出应当运行的完整extension dev命令。 - 目标界面未打开,或
--tabid 已失效:E_TARGET_NOT_FOUND。用inspect --list-tabs找出仍然存活的 id。 - 调用超出了
--timeout:E_TIMEOUT。
0,否则为 1,因此脚本可以直接据此做判断。当所有动词都失败、而你想弄清楚是哪一环断了时,请运行 doctor。

