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 原文件坏了

很多人看到 YAMLExceptionparse 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-providersprovider 名称可被引用名称改了,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"]
  };
}

它会把 proxiesproxy-groupsdns 等字段全部丢掉。脚本能运行,但 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 格式。

回滚顺序

脚本改坏后按这个顺序退回:

  1. 禁用 merge script。
  2. 切回备份 profile。
  3. 重启 Clash Verge Rev。
  4. 确认原 profile 能启动。
  5. 再用最小脚本逐段恢复改动。

不要一上来删除整个应用数据目录。那会把缓存、日志、旧 profile 一起清掉,反而少了对照样本。

判断问题归属

现象更可能的问题
空脚本也报错脚本入口、编码、路径或版本不匹配
空脚本正常,加规则后报错脚本语法或输出结构错
脚本正常,但节点组为空provider 引用断了或 proxies 被覆盖
只在远程 profile 更新后失败订阅返回内容变化或缓存旧文件冲突
本地 YAML 能用,远程不能用URL 返回格式、User-Agent 或网络请求问题

合并脚本排障最怕同时改很多东西。每次只改一小段,导出结果,看结构,再启动。慢一点,但不会把问题越修越散。

相关阅读