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。

入口、支持对象与示例逻辑可查阅自定义脚本文档。脚本报错在界面中以什么形式呈现,官方没有说明。

第三方整理,与项目方无关。