机场给的订阅配置是只读的:你不能直接改它,但每次想换个 DNS、给节点统一改名、追加几条自己的规则时,手动改配置又会在下次更新订阅时被覆盖。覆写脚本就是解决这个问题的办法:订阅更新后、配置生效前,脚本先把配置按你的要求改一遍。

原理:配置生效前先过一遍你的脚本#
Mihomo Party、Clash Verge Rev 这类客户端都支持覆写(override):你写一段 JavaScript,接收完整的配置对象,改完返回。客户端按“订阅配置 → 覆写脚本 → 生效配置”这个顺序处理,所以脚本的修改每次更新订阅后都会重新应用,不会被覆盖。
理解这一点就够了:覆写不是改订阅,而是给订阅加一层你自己的加工。订阅本身永远保持原样,随时可以关掉覆写回到原始配置。
脚本一:统一换 DNS#
机场默认 DNS 不一定合你意,换成自己信任的 DoH 或 DoT 可以减少 DNS 泄露风险。脚本思路是直接改配置里的 dns 一节:
function main(config) {
config.dns = {
"enable": true,
"ipv6": false,
"nameserver": ["https://dns.alidns.com/dns-query", "https://doh.pub/dns-query"],
"fallback": ["https://dns.google/dns-query"]
};
return config;
}DNS 泄露的完整自查方法见 DNS 与 WebRTC 泄露自查,换 DNS 只是其中一步,配合 TUN 模式效果更好。
脚本二:给节点名加前缀#
节点一多,名字混在一起很难找。按机场名或地区加前缀,列表立刻清晰:
function main(config) {
const prefix = "主用";
config.proxies.forEach(p => {
if (!p.name.startsWith(prefix)) p.name = prefix + " | " + p.name;
});
return config;
}注意:改名后代理组里的引用要同步处理。Mihomo Party 的覆写执行时会自动处理组内引用,但如果你在脚本里同时改了组结构,最好改完检查一次分组是否完整,避免出现引用了不存在节点的空组。
脚本三:追加自己的规则#
远程规则集再全,也总有个人需求覆盖不到。把自己的规则插到规则列表最前面,优先级最高:
function main(config) {
const myRules = [
"DOMAIN-SUFFIX,example.com,DIRECT",
"DOMAIN-KEYWORD,adblock,REJECT"
];
config.rules = myRules.concat(config.rules || []);
return config;
}规则的匹配逻辑是自上而下、第一条命中即生效,所以自己的规则放最前面才能确保生效。规则类型的完整说明见 Clash 分流规则详解。
新手注意三个坑#
1. 脚本报错会导致配置整体失效。 写脚本先从最小的改动开始,改完验证一次再加下一项。一次改十处、报错后很难定位是哪处的问题。
2. 不要在脚本里硬编码节点名。 节点名会随机场更新变化,硬编码的名字下次更新就可能对不上。用前缀匹配、正则匹配比精确匹配耐用。
3. 覆写和手动改配置不要混用。 手动改生效配置会在下次订阅更新时丢失,养成“所有定制都走覆写”的习惯,配置管理才不会越来越乱。
和基础教程的关系#
如果你还没用过 Mihomo Party,先看 Mihomo Party 使用教程 把导入订阅和基本操作跑通,再回来看覆写。覆写是进阶能力,建立在理解代理组、规则、分流模式的基础上。遇到导入失败、节点异常这类基础问题,先按 Clash Verge 订阅导入失败排查 和 代理已连接却没网排查 处理,不要用覆写去掩盖基础问题。
小结#
覆写脚本的价值就一句话:订阅是别人的,定制是自己的。用脚本把 DNS、命名、规则这三类个人需求固化下来,订阅随便更新,你的配置永远是你想要的样子。


