TL;DR:Clash Verge 配置合并脚本出错时,先区分两件事:脚本有没有正常运行,运行后产出的 profile 是否还是合法 Mihomo 配置。不要一边改脚本、一边清缓存、一边换订阅,最后会不知道是哪一步修好的。
合并脚本常用于给远程订阅补规则、改 DNS、插入策略组,或者把多份 profile 拼在一起。它方便,也很容易把一个原本能用的配置改到无法启动。最常见的报错有三类:JavaScript 语法错、YAML 解析错、合并后字段引用断掉。
先留一份原始配置
在 Profiles 里复制当前 profile,或者把订阅 URL 返回内容保存成本地文件。远程配置可以这样保存:
curl -L -A "clash-verge" "你的订阅URL" -o original.yaml
Windows PowerShell:
Invoke-WebRequest -MaximumRedirection 5 -Headers @{"User-Agent"="clash-verge"} -Uri "你的订阅URL" -OutFile "$env:TEMP\original.yaml"
这一步很土,但很有用。没有原始配置,就没法判断问题是订阅本身、脚本逻辑还是 Clash Verge 的缓存。
用最小脚本确认入口没问题
先把 merge script 改成只返回原配置的版本。不同版本的脚本接口可能略有差异,但排障思路一样:不改内容,只确认脚本能被加载。
function main(config) {
return config;
}
如果这都报错,先看脚本文件本身:
- 文件是否保存为 UTF-8。
- 路径里是否有奇怪权限或同步盘锁定。
- 函数名和当前 Clash Verge 版本要求是否一致。
- 是否把 JSON、YAML 和 JS 混在一个文件里。
只有空脚本能通过,才继续改合并逻辑。
YAML parse error 不一定是 YAML 原文件坏了
很多人看到 YAMLException 或 parse error,第一反应是订阅坏了。其实更常见的是脚本输出坏了。比如你把 proxy-groups 从数组改成对象,或者把某个 provider 名称改掉但没有同步改 use 引用。
Mihomo 常见结构大致是这样:
proxies:
- name: demo
type: ss
server: example.com
port: 443
proxy-groups:
- name: Proxy
type: select
proxies:
- demo
rules:
- MATCH,Proxy
脚本合并后至少要回答几个问题:
| 检查项 | 正常状态 | 常见错误 |
|---|---|---|
proxies | 数组 | 被覆盖成空对象或字符串 |
proxy-groups | 数组,组名不重复 | 插入组后重名 |
rules | 数组,末尾有兜底规则 | 合并时把原规则清空 |
proxy-providers | provider 名称可被引用 | 名称改了,use 没改 |
dns | 字段类型符合 Mihomo 文档 | 把列表写成逗号分隔字符串 |
脚本语言不会替你验证这些结构。JavaScript 觉得它是对象,Mihomo 可能完全读不了。
profile merge 的安全写法
尽量只改你确定要改的字段。不要为了加一条规则重建整份配置。
function main(config) {
const next = { ...config };
next.rules = [
"DOMAIN-SUFFIX,example.com,DIRECT",
...(Array.isArray(config.rules) ? config.rules : []),
];
return next;
}
这类写法有两个好处:原字段保留,改动范围小。真正危险的是下面这种写法:
function main(config) {
return {
rules: ["MATCH,Proxy"]
};
}
它会把 proxies、proxy-groups、dns 等字段全部丢掉。脚本能运行,但 profile 已经不是完整配置。
provider 名称要当成接口名
proxy-providers 的名称被 proxy-groups.use 引用,改名等于改接口。比如:
proxy-providers:
sub-a:
type: http
url: https://example.com/sub.yaml
path: ./providers/sub-a.yaml
proxy-groups:
- name: Auto
type: url-test
use:
- sub-a
如果脚本把 sub-a 改成 main-sub,但组里仍写 sub-a,更新时就会出现 provider 为空、组无可用项或解析失败。排查时先不要批量重命名 provider。确实要改名,就同时改所有 use。
需要重新准备订阅做交叉测试时,可以用兼容 Clash / Singbox / V2Ray 的订阅,但导入 Clash Verge 时仍要选择 Clash/Mihomo YAML 格式。
回滚顺序
脚本改坏后按这个顺序退回:
- 禁用 merge script。
- 切回备份 profile。
- 重启 Clash Verge Rev。
- 确认原 profile 能启动。
- 再用最小脚本逐段恢复改动。
不要一上来删除整个应用数据目录。那会把缓存、日志、旧 profile 一起清掉,反而少了对照样本。
判断问题归属
| 现象 | 更可能的问题 |
|---|---|
| 空脚本也报错 | 脚本入口、编码、路径或版本不匹配 |
| 空脚本正常,加规则后报错 | 脚本语法或输出结构错 |
| 脚本正常,但节点组为空 | provider 引用断了或 proxies 被覆盖 |
| 只在远程 profile 更新后失败 | 订阅返回内容变化或缓存旧文件冲突 |
| 本地 YAML 能用,远程不能用 | URL 返回格式、User-Agent 或网络请求问题 |
合并脚本排障最怕同时改很多东西。每次只改一小段,导出结果,看结构,再启动。慢一点,但不会把问题越修越散。