直接編輯訂閱檔案是新手常犯的錯誤:改完確實生效,但訂閱一更新,全部修改灰飛煙滅。Clash Verge 提供了正確的解法——Merge 和 Script,把「你的修改」和「服務商的配置」分開存放,執行時疊加。

訂閱配置經過 Merge 與 Script 處理後生成最終配置的流程
每次生效順序:訂閱原文 → Merge 合併 → Script 加工 → 核心載入

機制:疊加而不是修改

核心每次載入配置時的流水線:訂閱原文 → 應用 Merge(宣告式合併)→ 執行 Script(JavaScript 加工)→ 得到最終配置。訂閱更新只替換第一環,你的 Merge 和 Script 原樣保留、自動重新疊加。

入口:「訂閱」頁面右鍵「全域性擴充套件配置」,或右鍵某個訂閱卡片選「編輯 Merge / 編輯 Script」(前者對所有訂閱生效,後者只作用於該訂閱)。

Merge:夠用九成場景

Merge 檔案也是 YAML,用帶字首的欄位宣告合併行為。最常用的三個字首:prepend-(插到最前)、append-(追加到最後)、直接寫欄位名(整體覆蓋)。

# 在規則列表最前面插入自己的規則(優先順序最高)
prepend-rules:
  - DOMAIN-SUFFIX,company-vpn.example,DIRECT
  - PROCESS-NAME,Telegram.exe,PROXY

# 覆蓋 DNS 配置
dns:
  enable: true
  enhanced-mode: fake-ip
  nameserver:
    - https://223.5.5.5/dns-query

# 追加一個自用分組
append-proxy-groups:
  - name: "流媒體"
    type: select
    proxies: [HK-01, SG-02]

規則用 prepend 還是 append 有講究:想搶在訂閱規則之前生效(比如強制某域名直連)用 prepend;做兜底補充用 append。規則語法本身見自定義規則

Script:處理動態邏輯

Merge 做不到的(按條件改節點名、批次過濾、動態生成分組),交給 Script。它是一個 JavaScript 函式,入參是合併後的配置物件,返回值就是最終配置:

function main(config) {
  // 過濾掉名字帶「到期」「剩餘」的資訊節點
  config.proxies = config.proxies.filter(
    p => !/到期|剩餘|流量/.test(p.name)
  );
  // 給所有 vmess 節點強制開啟 udp
  config.proxies.forEach(p => {
    if (p.type === "vmess") p.udp = true;
  });
  return config;
}

Script 裡拋異常會導致配置載入失敗、核心用不上新配置。改完先在「日誌」頁確認沒有報錯,再驗證分流是否符合預期。

排查:改了沒生效?

  1. 確認編輯的是當前選中的訂閱(或全域性擴充套件配置);
  2. 「日誌」頁面看有沒有 YAML 語法錯誤——縮排錯一格整段作廢;
  3. 右鍵訂閱卡片「重新啟用」強制過載一次;
  4. 用「連線」頁面實測流量命中的規則,驗證 prepend 順序是否如預期。

配置檔案三大件還不熟的話,先補配置結構詳解這一課。