اشتراک در کلاینت چیزی نیست جز یک حافظه نهان محلی از داده‌ای که جای دیگری نگهداری می‌شود. هر به‌روزرسانی محتوای دور را دوباره می‌گیرد و فایل پیکربندی را از نو می‌سازد. آنچه شما دستی در آن فایل نوشته‌اید در این فرایند شرکت ندارد، پس از آن سوی فرایند هم بیرون نمی‌آید. یک بار که بسوزید کافی است؛ سؤال باقی‌مانده فقط راه دور زدن آن است.

تغییرات شما باید روی اشتراک بنشیند، نه داخلش

کاری که Clash Verge Rev می‌کند این است که «آنچه اشتراک گفته» و «آنچه شما عوض کرده‌اید» را به دو لایه تقسیم می‌کند. نسخه اشتراک فقط‌خواندنی می‌ماند و تغییرات شما جداگانه به شکل پیکربندی گسترشی ذخیره می‌شود. هر بار که کلاینت پیکربندی نهایی را می‌سازد، اول خروجی اشتراک را برمی‌دارد و بعد لایه شما را رویش می‌گذارد. اشتراک هرطور بخواهد عوض شود، لایه شما سر جایش است. کلاینت‌های دیگر همین را با نام‌های دیگری دارند — override، mixin، پیش‌پردازش — اما شکل کار یکی است.

پیشنهاد همکاریلینک اشتراک را از کجا بیاوریم؟سرویس همکار ما هنگام ثبت‌نام ۱ گیگابایت ترافیک پرسرعت هنگ‌کنگ رایگان می‌دهد.دریافت سرور پرسرعت

دو نوع گسترش: یک تکه YAML، یک تکه JS

  • Merge: یک قطعه YAML که با پیکربندی ساخته‌شده ادغام می‌شود. مناسب محتوای ثابت — چند قانون، یک بلوک dns، عوض کردن یک پورت.
  • Script: یک تکه JavaScript. تابع ورودی کل شیء config را می‌گیرد، شما تغییرش می‌دهید و برش می‌گردانید. مناسب هر کاری که شرط دارد؛ برای محتوای ثابت زیادی سنگین است.
  • ترتیب اجرا ثابت است: اول خروجی اشتراک، بعد Merge، بعد Script، و آخر پیکربندی نهایی. Script نتیجه بعد از Merge را می‌بیند، پس وقتی هر دو فعال باشند حرف آخر با Script است.

تله Merge: فهرست‌ها جایگزین می‌شوند، نه اضافه

کلیدهای هم‌نام روی هم می‌نویسند و این با شهود جور است. فهرست‌ها جور نیستند. اگر در قطعه merge خودتان کلید rules بگذارید، رفتار پیش‌فرض این است که همان چند سطر شما جای چند صد سطر اشتراک را بگیرد، یعنی هرچه جز نوشته خودتان بود از بین می‌رود. نمودش این است که ناگهان تقریباً همه‌جا مستقیم می‌شود، یا ناگهان همه‌جا از گره رد می‌شود. برای افزودن به یک فهرست باید از کلیدهای مخصوص استفاده کنید: prepend-rules موارد را جلو می‌اندازد، append-rules ته فهرست می‌گذارد، و برای proxy-groups و proxies هم شکل‌های متناظر prepend و append وجود دارد. ترتیب برای قانون‌ها مهم است، پس قانون‌های خودتان تقریباً همیشه prepend می‌خواهند.

prepend-rules:
  - DOMAIN-SUFFIX,internal.example.com,DIRECT
  - PROCESS-NAME,Telegram.exe,PROXY
append-rules:
  - DST-PORT,25,REJECT
dns:
  enable: true
  nameserver:
    - 223.5.5.5

کاری که Script می‌تواند و Merge نمی‌تواند

نقطه ورود یک تابع است که شیء پیکربندی تجزیه‌شده را می‌گیرد و نسخه تازه را برمی‌گرداند. یعنی می‌توانید بر اساس شرط عمل کنید، نه اینکه نتیجه را از پیش بنویسید: حذف آن مدخل‌های قلابی که در نامشان تاریخ انقضا و حجم باقی‌مانده نوشته شده، گذاشتن یک پیشوند یکسان روی نام همه گره‌ها، یا ریختن هرچه با یک الگو می‌خواند در یک گروه. Merge هیچ‌کدام را نمی‌تواند بیان کند، چون از قبل نمی‌دانید داخل اشتراک چه خواهد بود.

function main(config) {
  config.proxies = config.proxies.filter(function (p) {
    return p.name.indexOf('Expire') === -1;
  });
  config.rules.unshift('DOMAIN-SUFFIX,example.com,DIRECT');
  return config;
}

حدس نزنید، به خروجی نگاه کنید

وقتی پیکربندی گسترشی اشتباه باشد، نشانه‌هایش کمکی نمی‌کنند. یا اصلاً بارگذاری نمی‌شود، یا خوب بارگذاری می‌شود و یک بخش کامل بی‌صدا غیب شده است — نصف فهرست گره‌ها، یا فهرست قانونی که جز همان دو سطر خودتان چیزی ندارد. کلاینت‌ها معمولاً راهی برای دیدن پیکربندی نهایی می‌گذارند، در منوی راست‌کلیک همان پیکربندی یا در صفحه جزئیاتش، گاهی با عنوان مشاهده و گاهی خروجی گرفتن. هر بار که چیزی عوض کردید همان‌جا نگاه کنید: هم اینکه افزوده شما هست، هم اینکه محتوای اصلی سر جایش مانده. خیلی سریع‌تر از عقب‌گرد کردن از روی نشانه‌هاست.

پیکربندی گسترشی را افزایشی نگه دارید: قانون، DNS، چند گروه ساخته خودتان. کل بخش proxies را بازنویسی نکنید. گره‌ها کار اشتراک است و تحویل گرفتن این کار یعنی دور ریختن تمام فایده به‌روزرسانی خودکار — روزی که سرویس‌دهنده نشانی سروری را جابه‌جا کند، باید دستی دنبالش بدوید. اینکه خود قانون‌ها چطور نوشته می‌شوند و کجای فهرست باید بنشینند موضوع دیگری است؛ این نوشته فقط درباره پاک نشدنشان است.