Skip to content

混入与脚本

在引入混入脚本之前,类似的操作可以通过插件完成,实现方式是创建一个具有生成配置时的触发器,对生成的配置进行个性化修改,但这样做有一些不便:

  • 1、作用于所有配置,如果仅修改部分配置则需要使用if来判断;

  • 2、必须编写JavaScript代码来处理,对没有编程经验的人不友好;

混入脚本解决了以上两个问题,它们和配置强绑定,仅作用于自身,既不会影响全部配置、也不需要编写ifJavaScript代码。

混入 - Mixin

混入的原理是使用用户提供的配置GUI生成的配置进行合并处理,如果两个配置存在冲突,则可以使用优先级来指定最终的配置以哪一个为准。

示例:

1、GUI.for.Clash 示例,YAML 格式

yaml
mode: global
ipv6: true
mixed-port: 7890
tun:
  enable: true
  stack: gVisor
  dns-hijack:
    - any:53
dns:
  enable: true
  ipv6: true
  default-nameserver:
    - 223.5.5.5
    - 114.114.114.114

2、GUI.for.SingBox 示例,JSON 格式

json
{
  "log": {
    "timestamp": false
  },
  "experimental": {
    "clash_api": {
      "external_controller": "127.0.0.1:20123",
      "default_mode": "global"
    },
    "cache_file": {
      "enabled": true,
      "store_fakeip": true
    }
  }
}

注意事项:混入操作不支持数组合并,只会取用户提供的配置GUI生成的配置其一。如果想对数组进行操作,只能使用脚本

脚本 - Script

脚本的实现原理和插件的onGenerate钩子相同,GUI 会把GUI生成的配置通过参数config传入onGenerate方法,用户对config进行修改,然后返回最终的配置。

示例:

1、GUI.for.Clash 示例

javascript
const onGenerate = async (config) => {
  config.dns["default-nameserver"].unshift("223.5.5.5");
  config.dns["default-nameserver"].unshift("114.114.114.114");
  config.sniffer = {
    enable: false,
    "force-dns-mapping": true,
    "parse-pure-ip": true,
    "override-destination": false,
    sniff: {
      HTTP: {
        ports: [80, "8080-8880"],
        "override-destination": true,
      },
      TLS: {
        ports: [443, 8443],
      },
      QUIC: {
        ports: [443, 8443],
      },
    },
    "force-domain": ["+.v2ex.com"],
    "skip-domain": ["Mijia Cloud"],
  };
  return config;
};

2、GUI.for.SingBox 示例

javascript
const onGenerate = async (config) => {
  config.log.timestamp = false;
  config.experimental.clash_api.default_mode = "global";
  config.dns.servers.unshift({
    tag: "remote-dns-google",
    address: "tls://8.8.4.4",
    address_resolver: "remote-resolver-dns",
    detour: "🚀 Select",
  });
  return config;
};