功能深入解析:批量切换分支更新源的正确姿势)
Bilibili-Evolved 更新链接替换change-update-urls功能深入解析批量切换分支更新源的正确姿势【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved本文以 Bilibili-Evolved 内置的「更新链接替换」功能change-update-urls为主体结合其组件声明、Widget 实现与「自动更新器」autoUpdate的底层源码深入讲解该功能的作用机制、适用边界与实战用法。读完本文你将理解更新链接在设置面板中如何被记录、三种 CDN/直链地址格式如何被识别与重写以及为什么本地安装localhost的功能不在批量替换范围内。功能定位批量重写「已安装功能」的更新分支Bilibili-Evolved 的绝大多数组件、插件与样式都可以从设置面板在线安装安装后其源码地址会被「自动更新器」autoUpdate记录在本地用于日后检查与拉取更新。当仓库的默认分支如master发生破坏性变更、或你希望切换到某个测试分支 / 私有镜像分支时逐条修改每个功能的更新链接非常繁琐。「更新链接替换」正是为此设计的批量维护工具在侧边栏打开小组件面板点击「替换更新链接」按钮输入目标分支名即可把已安装功能记录的更新链接中的分支部分批量替换为目标分支。其官方描述原文仅一句话——「批量更换已安装功能的更新链接的分支对本地安装的功能无效」——但这背后涉及完整的链接存储模型与三类 URL 匹配规则下面结合源码逐层拆解。源码中的功能声明组件声明位于 registry/lib/components/utils/change-update-urls/index.tsexport const component defineComponentMetadata({ name: changeUpdateUrls, displayName: 更新链接替换, entry: none, tags: [componentsTags.utils], widget: { component: () import(./Widget.vue).then(m m.default), }, })关键点name: changeUpdateUrls是组件在设置面板中的唯一标识entry: none表示该组件没有页面注入逻辑——它不修改任何页面 DOM而是以widget形式注册为一个小组件小组件由 Widget.vue 渲染点击后触发替换流程。在 Bilibili-Evolved 中widget类型的组件会出现在设置面板侧边栏的「功能」小组件面板中对应 src/components/settings-panel/WidgetsPanel.vue 的widget-items渲染逻辑Widget 接口定义在 src/components/widget.ts包含name、component、urlInclude/urlExclude与condition等字段。此处未设置 URL 匹配与条件判断因此该小组件在所有页面可用。更新链接从何而来autoUpdate 的存储模型要理解替换逻辑必须先知道链接存在哪里、以什么结构存在。「更新链接替换」不直接访问本地存储而是读取autoUpdate组件在设置面板中记录的更新链接数据src/components/auto-update/index.ts 中的urls选项urls: { displayName: 更新链接, defaultValue: { components: {} as Recordstring, UpdateCheckItem, plugins: {} as Recordstring, UpdateCheckItem, styles: {} as Recordstring, UpdateCheckItem, }, hidden: true, },数据结构分为三类components组件、plugins插件、styles样式每类是一个以功能名为键、UpdateCheckItem为值的映射。UpdateCheckItem定义于 src/components/auto-update/utils.tsexport interface UpdateCheckItem { url: string // 功能源码地址 lastUpdateCheck: number installTime: number alwaysUpdate?: boolean }这些记录由autoUpdate的插件 Hook 在「从设置面板安装/卸载功能」时自动维护src/components/auto-update/index.ts 中的userComponents.add/userComponents.remove等 Hook安装时写入options.urls[type][metadata.name] { url, lastUpdateCheck, installTime, alwaysUpdate: isLocalItem(url) }卸载时删除对应条目已存在条目则仅更新url、lastUpdateCheck、alwaysUpdate保留原始安装时间。这里isLocalItem(url)即localhost.test(url)src/components/auto-update/utils.ts用于标记该功能是否来自本地开发服务器——这正是官方描述中「对本地安装的功能无效」的根源见下文。为什么只对「设置面板安装」的功能生效「自动更新器」官方描述明确写着「仅限从设置面板中安装的」。这意味着通过设置面板在线安装 → 链接被记录到autoUpdate的urls→ 可被批量替换、可被更新检查以「本地安装」方式加载URL 形如http://localhost:port/...的本地开发服务器→ 链接同样会记录但alwaysUpdate会被置为true且这类链接的宿主是本地服务器而非远程仓库手动注入、或未被 autoUpdate 记录的第三方安装来源 → 不在urls中替换操作自然触及不到。替换流程源码解析小组件点击后执行的完整逻辑位于 Widget.vue 的replaceBranch()方法async replaceBranch() { const targetBranch window.prompt(输入希望替换成的分支名称) if (!targetBranch) { return } this.busy true try { const { options } getComponentSettings(autoUpdate) Object.values(options.urls).forEach((features: Recordstring, { url: string }) { Object.values(features).forEach(record { const indirectRaw /^(https:\/\/github\.com\/.\/Bilibili-Evolved\/raw\/)(.?)(\/)/ if (indirectRaw.test(record.url)) { record.url record.url.replace(indirectRaw, $1${targetBranch}$3) return } const directRaw /^(https:\/\/raw\.githubusercontent\.com\/.\/Bilibili-Evolved\/)(.?)(\/)/ if (directRaw.test(record.url)) { record.url record.url.replace(directRaw, $1${targetBranch}$3) return } const jsDelivr /^(https:\/\/cdn\.jsdelivr\.net\/gh\/.\/Bilibili-Evolved)(.?)(\/)/ if (jsDelivr.test(record.url)) { record.url record.url.replace(jsDelivr, $1${targetBranch}$3) return } console.log(skip record, record) }) }) Toast.info(替换完成, 替换更新链接, 3000) } catch (error) { logError(error) } finally { this.busy false } }交互流程输入目标分支弹出浏览器prompt对话框输入要替换成的分支名如dev、release-2.x空值保护未输入内容直接return不会触发任何修改busy 状态替换期间小组件按钮置灰disabled: busy防止并发操作遍历三类记录Object.values(options.urls)依次遍历 components / plugins / styles 三个集合再遍历集合内每条功能的url逐条匹配替换对每条 URL 依次尝试三种远程格式的正则命中则原地重写 URL否则打印skip record跳过结果反馈全部完成后通过Toast.info(替换完成, 替换更新链接, 3000)弹出 3 秒提示异常则走logError(error)记录。三种被识别的 URL 格式替换逻辑的核心是三条正则它们对应 Bilibili-Evolved 在线安装功能时使用的三种常见源码地址格式正则摘要匹配示例分支所在位置GitHub 间接 raw 链接^https://github\.com/./Bilibili-Evolved/raw/(.?)(/)https://github.com/user/Bilibili-Evolved/raw/master/dist/xxx.jsraw/后的第一段GitHub 直连 raw 链接^https://raw\.githubusercontent\.com/./Bilibili-Evolved/(.?)(/)https://raw.githubusercontent.com/user/Bilibili-Evolved/master/dist/xxx.js仓库名后第一段jsDelivr CDN 链接^https://cdn\.jsdelivr\.net/gh/./Bilibili-Evolved(.?)(/)https://cdn.jsdelivr.net/gh/user/Bilibili-Evolvedmaster/dist/xxx.js后的第一段三条正则的替换策略一致用非贪婪分组(.?)捕获原分支名再以$1${targetBranch}$3重构 URL即仅替换分支段、保留其余路径。值得注意的实现细节分支名按 URL 中第一个/为止(.?)后紧跟/因此分支名中不能包含/如feature/xxx这类带斜杠的分支无法被完整捕获替换时只会命中斜杠前的一段三条正则均要求仓库名精确为Bilibili-Evolved即只处理该项目的仓库路径不会误伤同账号下其他仓库的链接每条 URL 命中任意一种格式后立即return避免被后续正则重复改写完全不匹配三种格式的 URL包括http://localhost:...的本地安装链接会被跳过仅打印skip record——这正是文档中「对本地安装的功能无效」的代码级解释本地链接不满足任何一条远程正则替换操作天然跳过它们。替换后的链接会被谁消费改写后的record.url即刻持久化到autoUpdate的urls选项中getComponentSettings返回的是响应式设置对象写入即保存。此后自动更新器拉取代码时使用的正是这条新链接src/components/auto-update/checker.tslet finalUrl url if (localhost.test(url) options.localPortOverride) { finalUrl url.replace(/:(\d)/, :${options.localPortOverride}) } const code: string await coreApis.ajax.monkey({ url: finalUrl })除本地端口覆盖外更新检查还遵循minimumDuration更新间隔默认 24 小时与maxUpdateCount单次最大更新量默认 4 个等参数约束src/components/auto-update/index.ts并通过isFeatureAcceptable校验版本兼容性后才调用installFeatureFromCode完成安装。实战指南什么时候用切换分支测试想从稳定分支切到开发分支体验新功能或回退到旧分支镜像/加速源将 GitHub 直链批量改为 jsDelivr CDN 链接注意替换的是分支不是域名——若需整体换源应手动逐条编辑统一维护批量安装的功能来自不同分支想统一到同一分支再集中更新。使用步骤在设置面板中确保已启用「更新链接替换」组件changeUpdateUrls打开侧边栏「功能」小组件面板找到名为「替换更新链接」、图标为mdi-file-replace-outline的按钮点击后在弹出的prompt中输入目标分支名如master、dev等待 Toast 提示「替换完成」即代表三类功能组件/插件/样式中所有可识别链接已改写如需立即生效可在「自动更新器」中触发检查更新如通过「检查所有更新」搜索动作使新链接尽快被拉取。注意事项与边界对本地安装的功能无效http://localhost:...链接不匹配任何远程格式会被跳过控制台可见skip record分支名不能含/正则按首个/截断分支段feature/xxx类分支不会被完整替换仅处理Bilibili-Evolved仓库路径其他仓库的功能链接不受影响依赖「自动更新器」的记录若autoUpdate被禁用或从未记录过该功能替换不会覆盖到它替换是即时持久化的写入urls后立即保存无法批量撤销——如需回退可再执行一次替换为原分支名或手动修改对应功能的更新链接。小结「更新链接替换」是 Bilibili-Evolved 面向在线安装生态的批量维护工具它读取「自动更新器」记录的 components/plugins/styles 三类更新链接通过三条精确的正则识别 GitHub 间接 raw、GitHub 直连 raw 与 jsDelivr CDN 三种地址格式仅替换其中的分支段而对本地安装localhost链接天然跳过。配合自动更新器的检查流程checker.ts开发者可以在几秒内完成全量已安装功能的分支切换是脚本日常迭代与测试分支管理的高效辅助手段。【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考