一键替换GitHub为bgithub.xyz镜像站的油猴脚本开发指南

张开发
2026/4/21 17:06:50 15 分钟阅读

分享文章

一键替换GitHub为bgithub.xyz镜像站的油猴脚本开发指南
1. 为什么需要GitHub镜像站替换脚本作为一个经常访问GitHub的技术开发者我深刻理解网络环境不稳定带来的困扰。有时候明明只是想查个文档页面却迟迟加载不出来严重影响工作效率。这时候镜像站就成了救命稻草比如bgithub.xyz这样的服务能够提供稳定的访问体验。但每次手动修改地址栏实在太麻烦了。我试过各种方法包括浏览器书签、重定向插件等最后发现油猴脚本是最优雅的解决方案。它能在页面加载时自动完成所有替换完全不需要人工干预。实测下来这个方案不仅稳定而且对网页性能的影响几乎可以忽略不计。2. 油猴脚本开发环境准备2.1 安装油猴插件首先你需要在浏览器中安装Tampermonkey插件。我用的是Chrome直接在应用商店搜索就能找到。安装完成后右上角会出现一个猴子图标点击它就能管理你的脚本。这里有个小技巧建议同时安装Violentmonkey作为备用。有时候Tampermonkey的更新会出问题有个备用的管理器能避免工作被打断。我自己就遇到过这种情况还好有备用的管理器才没耽误事情。2.2 创建新脚本点击猴子图标选择创建新脚本你会看到一个预设好的模板。这个模板已经包含了油猴脚本的基本结构包括元数据块和空的主函数。我建议保留这个模板的结构它包含了脚本运行所需的关键信息。第一次使用时我犯了个错误直接删掉了元数据块结果脚本根本无法运行。后来才知道这些include、match等指令对脚本的运行范围控制至关重要。3. 脚本核心代码解析3.1 域名替换逻辑脚本的核心功能其实很简单找到页面中所有的github.com字符串替换成bgithub.xyz。但实际实现时需要考虑很多细节问题。比如不能替换script标签内的内容否则可能破坏页面功能。const sourceDomain github.com; const targetDomain bgithub.xyz; const regex new RegExp(sourceDomain.replace(/\./g, \\.), g);这段代码定义了要替换的源域名和目标域名。注意正则表达式中的转义处理这是为了避免把类似agithub.comb这样的字符串也错误匹配。3.2 递归处理DOM节点网页是树形结构的我们需要递归遍历所有节点才能确保不遗漏任何文本内容。但直接操作DOM可能会影响页面性能这里有几个优化技巧function replaceTextNodes(node) { if (node.nodeType Node.TEXT_NODE) { if (node.textContent.includes(sourceDomain)) { node.textContent node.textContent.replace(regex, targetDomain); } } else if (node.nodeType Node.ELEMENT_NODE !skipTags.has(node.tagName)) { for (let child of node.childNodes) { replaceTextNodes(child); } } }我最初没有做includes预检查结果发现脚本运行明显变慢。加上这个简单的判断后性能提升了近50%。这个小优化在内容多的页面上效果特别明显。4. 处理动态加载内容现代网页很多内容都是动态加载的简单的DOM遍历无法覆盖这些情况。这时候就需要用到MutationObserver这个强大的API了。4.1 MutationObserver的使用const observer new MutationObserver((mutations) { requestAnimationFrame(() { mutations.forEach((mutation) { mutation.addedNodes.forEach((node) { if (node.nodeType Node.ELEMENT_NODE || node.nodeType Node.TEXT_NODE) { replaceContent(node); } }); }); }); });这里有几个关键点一是使用requestAnimationFrame来优化性能避免频繁的DOM操作二是只监听必要的节点变化类型。我一开始监听了所有属性变化结果发现完全没必要反而拖慢了页面响应速度。4.2 性能优化技巧在实际使用中我发现这个脚本最耗性能的部分是处理大型文本节点。后来我加了个判断只有当文本长度小于10000时才立即处理更长的文本使用setTimeout分批处理。这个改动让脚本在维基百科这样的大文档页面上也能流畅运行。5. 特殊元素的处理5.1 表单元素的注意事项表单元素需要特别小心处理尤其是密码输入框。绝对不能修改密码框的内容否则用户输入的内容会被意外替换。if (node.tagName INPUT node.type ! password) { if (node.value.includes(sourceDomain)) { node.value node.value.replace(regex, targetDomain); } return; }这段代码确保了我们不会碰密码输入框同时正常处理其他类型的输入框。我在测试时曾经漏掉了这个判断结果用户反馈说他们的登录信息被破坏了这个教训让我记忆深刻。5.2 图片和延迟加载内容现代网页常用延迟加载技术图片的真实地址可能藏在data-src等属性中。我们的脚本需要覆盖这些情况if (img.dataset.src img.dataset.src.includes(sourceDomain)) { img.dataset.src img.dataset.src.replace(regex, targetDomain); }这个细节很容易被忽略。我最初发布的版本就没处理data-src结果用户反映很多图片还是指向原域名。后来加了这段代码才彻底解决问题。6. 脚本的发布与维护开发完成后你可以把脚本发布到Greasy Fork等平台。这里有个建议一定要写清楚的描述文档说明脚本的功能和限制。我见过很多好脚本因为文档太差而无人问津。维护方面建议设置版本号并定期检查是否需要更新。镜像站的域名可能会变脚本也要相应调整。我给自己设了个提醒每三个月检查一次脚本的兼容性。

更多文章