TLDR
Clash For Windows 的 mixin 功能可以拿来汉化界面/去广告/etc.
-
优点:
- 一劳永逸(各种意义上的)
- 审查代码比 asar 补丁简单:只要你看得懂 js 就行
- 自己 mixin 配置完直接丢给别人,别人直接 C+V 就能汉化
-
缺点:
- 用不了 YAML Mixin 了(可以通过插件管理器解决)
- 每次启动都要 patch ,速度比 asar 补丁慢
- 汉化脚本一堆 DOM 路径导致可读性比较低(可以通过 querySelector 解决)
去广告代码如下:
module.exports.parse = ({content}) => {
if (globalThis.document) {
const proto = Object.getPrototypeOf(globalThis.document.getElementById('app').__vue__)
const _init = proto._init
proto._init = function (...args) {
_init.apply(this, args)
this.$nextTick(() => {
{
const p = this.$el.parentElement
if (p) {
if (p.className == 'ad-img') {
p.parentElement.parentElement.remove()
}
}
}
})
}
}
return content
}
正文
最近折腾 CFW 的分规则代理
发现这玩意对于订阅不提供 rules 的情况实在是太麻烦了,一怒之下写了个 mixin 用来自动生成分规则代理
在用到 vm 的时候 electron 报警告 deprecated in renderer process,也就是说 mixin 是在浏览器侧跑的,那么理应可以访问到 document
试了一下成功取得了 app 的 vue 实例,那么只需要 patch 掉 vue.prototype._init 即可实现监听组件初始化
然后在里面用一次 this.$nextTick 即可获得 $el 直攻 DOM 组件
再去判定 className,并将其下子 DOM 的 innerText 修改掉即可实现汉化
这个方法是有点逆天但是能用,并且比替换 asar 方便不知道多少倍,所以我觉得可以试着这样汉化一下 CFW
当然这个的作用不限于汉化,各位有能力的也甚至可以直接给 CFW 加点扩展功能
顺便宣传下自己之前写的项目:
clash-mixin,CFW mixin 插件管理器
clash-rules,CFW 任意代理实现分规则代理(无论供应商是否给你规则),对订阅链接十分友好