Clash Verge Rev(clash-verge-rev 仓库)的脚本功能用 JavaScript 处理配置:main 接收配置对象,完成修改后将对象返回。即使没有改动,也需要返回传入的对象。
脚本接收的是什么
config 不是一段待编辑的 YAML 文本,而是 YAML 配置转换得到的 JSON 对象。写脚本时,处理的是对象中的字段。
入口函数必须叫 main。第一个参数在文档中写作 config,这个参数名可以另取;函数内部使用的名字要与声明一致。
截至 2026-11-08,文档说明从 v1.7.3 开始,入口还可接收第二个参数 profileName。它是字符串,内容为当前订阅名,适合用来区分不同订阅的处理逻辑。
| 入口部分 | 含义 | 写法要点 |
|---|---|---|
main | 脚本入口 | 保留这个函数名 |
config | 转换后的配置对象 | 读取或修改其中的字段 |
profileName | 当前订阅名 | 有区分需求时再使用 |
| 返回值 | 处理后的配置对象 | 没有修改也要返回 |
截至 2026-11-08,文档使用“扩展脚本”这一名称,并说明该名称从 v1.7.x 开始替代“Script 配置”。
怎么组织处理逻辑
可以把函数内部的工作分成三步:接收配置、处理目标字段、返回结果。需要按订阅区别处理时,在修改字段前判断 profileName。
官方列出的用途包括调整 dns、proxy-groups、rule-providers 和 rules。这些用途对应不同的配置部分,不必把全部处理都塞进同一个脚本。
| 字段 | 脚本可处理的内容 |
|---|---|
dns | 覆盖 DNS 配置 |
proxy-groups | 调整或重新组织代理组 |
rule-providers | 设置规则提供者 |
rules | 修改规则列表,或向列表前部加入规则 |
文档还展示了用 concat 将新增规则接到原规则之前的方式。这里应分清“前插”与“覆盖”:前者保留原列表,后者用新内容替换对应字段。
需要了解字段如何通过扩展配置处理,可接着看扩展配置与脚本的区别;涉及 DNS 字段时,可参照DNS 配置说明。
最小示例只看入口与返回
一个不改动配置的最小结构,只需要入口、参数和返回动作。下面拆开列出各部分,便于检查自己的函数。
| 部分 | 最小写法 | 作用 |
|---|---|---|
| 函数声明 | function main(config, profileName) | 接收配置及当前订阅名 |
| 函数体中的返回语句 | return config; | 把配置交回后续处理流程 |
有修改需求时,把字段处理放在返回语句之前。只写字段修改却漏掉返回值,不符合文档对入口函数的要求。
完整示例中还涉及重建代理组、检查缺少节点或订阅源的情况,以及依据名称中解析出的倍率过滤节点。它们包含关联处理:移除空组时,还要清理引用;经由 include-all* 纳入的节点,不受该过滤示例影响。理解入口结构后,再读这些逻辑更容易分清每一步的作用。
脚本处在配置链的哪里
全局脚本与订阅脚本的执行位置不同。
| 脚本范围 | 前一个环节 | 后一个环节 |
|---|---|---|
| 全局脚本 | 全局配置 | 订阅配置 |
| 订阅脚本 | 订阅配置 | 应用设置回写 |
检查某个字段的处理结果时,要结合这条顺序。全局脚本运行结束后,还有订阅配置环节;订阅脚本运行结束后,还有应用设置回写环节。
有关位置的说明见扩展配置与脚本文档。
能联网、读文件或打印内容吗
截至 2026-11-08,文档列出的脚本解释器为 boa_engine,运行范围不开放网络 I/O 和文件 I/O。因此,脚本中的配置处理不能依赖联网获取内容或读取本地文件。
支持项包含 Object、Array、Math、JSON、Proxy、Reflect,以及字符串、正则、集合、类型化数组等内置对象。Promise 与 console 也在列表内。
不过,列出 Promise 不等于说明异步入口的用法。对于 async、ES 模块、执行超时,以及 console 内容出现的位置,官方没有说明。
常见错从哪里查
| 遇到的疑问 | 检查方向 |
|---|---|
| 函数改完字段就结束了 | 检查是否返回配置对象 |
| 按订阅分别处理没有符合预期 | 核对第二个参数及订阅名判断 |
| 新规则替换了原规则 | 区分字段覆盖与列表前插 |
| 删除代理组后仍有相关引用 | 检查关联引用是否一起清理 |
| 脚本需要下载内容或读取文件 | 对照网络与文件 I/O 限制 |
规则示例中的部分 IP 规则带有 no-resolve。不清楚规则类型时,应先查规则说明,可阅读规则类型与匹配顺序,再决定如何修改 rules。
入口、支持对象与示例逻辑可查阅自定义脚本文档。脚本报错在界面中以什么形式呈现,官方没有说明。
第三方整理,与项目方无关。