一、为什么纯手动改 YAML 是件苦差事
许多服务商提供的 Clash 订阅链接,拉取下来之后让人非常头疼:
节点列表的第一行是 `【官网:xxx.com】`,第二行是 `【剩余流量:150G】`,底下真正的节点名字还带了一长串花哨的 Emoji、促销广告词和毫无意义的速率倍率。
每次更新订阅,配置文件就会被远端全量覆盖重写一次。
如果你手动去本地改 YAML,下次点「更新」,所有修改瞬间灰飞烟灭。
Clash Verge Rev 提供了极其强大的原生脚本注入引擎(基于内置的 JavaScript 运行时)。只要给订阅挂载一个后处理 Script,客户端每次从云端拉取完原始 YAML 后,都会在内存中自动跑一遍你的 JS 代码,完成清洗、过滤和重组,再交付给内核渲染。本地完全零人工干预。
二、开箱即用的预处理代码实现

完整脚本源码与注释
点击 Clash Verge Rev 左侧菜单的 「订阅」。
右键你要优化的订阅卡片,选择 「扩展配置 (Script)」(或在全局设置的 Script 扩展中新建)。
清空默认模板,将以下健壮的过滤与重组代码完整粘贴进去:
// Clash Verge Rev 订阅预处理核心入口
function main(config) {
// 1. 定义需要彻底剔除的垃圾节点黑名单关键字正则
const excludeRegex = /(官网|流量|到期|通知|群|返利|网站|测速|expire|traffic|reset)/i;
// 2. 过滤无用的提示性伪节点
if (Array.isArray(config.proxies)) {
config.proxies = config.proxies.filter(proxy => {
// 排除名称匹配黑名单的节点
return !excludeRegex.test(proxy.name);
});
// 3. 规范化清洗节点名称(去除冗余修饰词)
config.proxies.forEach(proxy => {
proxy.name = proxy.name
.replace(/(\[.*?\]|\(.*?\))/g, '') // 去除中括号和圆括号内容
.replace(/\s+/g, ' ') // 压缩多个空格为一个
.trim(); // 去除首尾空格
});
}
// 4. 获取所有清洗后的纯净节点名称数组
const cleanProxyNames = config.proxies ? config.proxies.map(p => p.name) : [];
// 5. 动态重构或注入自定义策略组
if (Array.isArray(config['proxy-groups']) && cleanProxyNames.length > 0) {
// 遍历现有的策略组,确保引用的节点池也是清洗后的纯净列表
config['proxy-groups'].forEach(group => {
if (group.proxies && Array.isArray(group.proxies)) {
// 保留原策略组中非垃圾节点的引用
group.proxies = group.proxies.filter(name => !excludeRegex.test(name));
}
});
// 新增一个纯净的“自动优选”测速组
const autoGroupIndex = config['proxy-groups'].findIndex(g => g.name === '🚀 自动选择');
if (autoGroupIndex === -1) {
config['proxy-groups'].unshift({
name: '🚀 自动选择',
type: 'url-test',
url: 'http://www.gstatic.com/generate_204',
interval: 300,
tolerance: 50,
proxies: cleanProxyNames
});
}
}
// 必须返回处理后的完整 config 对象
return config;
}
三、配置生效与语法排错
步骤验证
代码粘贴完成后,点击编辑器右下角的 「保存并测试」 按钮。
观察控制台输出面板:
- 如果返回绿色的 `Script executed successfully`,说明 JavaScript 语法校验通过。
返回主界面,在对应的订阅卡片上点击 「刷新订阅」。切换到左侧菜单的 「代理」 节点列表:原本充斥着垃圾广告词、过长域名的杂乱节点列表,瞬间被清洗得干干净净,顶部直接生成了配置完备的快速自动测速组。
常见报错与避坑说明
- 报错 `TypeError: Cannot read properties of undefined`:
原因:某些极简订阅中根本没有 `proxy-groups` 字段,直接调用 `forEach` 导致空指针异常。上面的代码中已经加入了 `Array.isArray()` 前置防御性校验,能完美规避此问题。
- 脚本保存后节点列表全空了:
原因:黑名单正则匹配范围写得太宽泛(例如误写了 `/(.*)/`)。检查代码第一行的 `excludeRegex`,只保留明确的广告或提示性词根。