Bilibili-Evolved「兼容性选项」组件详解:与「解除 B 站区域限制」的互斥机制与实现原理

发布时间:2026/9/19 22:18:28
Bilibili-Evolved「兼容性选项」组件详解:与「解除 B 站区域限制」的互斥机制与实现原理 Bilibili-Evolved「兼容性选项」组件详解与「解除 B 站区域限制」的互斥机制与实现原理【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved导读本文围绕 Bilibili-Evolved哔哩哔哩增强脚本内置的「兼容性选项」compatibilities组件展开重点讲解其唯一的配置项——「与『解除 B 站区域限制』互斥」的含义、适用场景与触发条件并从源码层面还原该选项如何让两个脚本和平共处、避免布局错乱。读完本文你将理解增强脚本与第三方脚本如区域限制解除类脚本冲突时的标准处理思路掌握该组件在 init.ts 中的检测调用链以及为什么它是一个「不可配置开关」的通用组件。一、组件定位一个没有入口函数的「通用」组件在 Bilibili-Evolved 中所有内置功能都统一注册为「组件」Component。compatibilities组件定义在 src/components/compatibilities/index.tsexport const component defineComponentMetadata({ name: compatibilities, displayName: 兼容性选项, configurable: false, tags: [componentsTags.general], options: { disableOnBalh: { defaultValue: false, displayName: 与 解除 B 站区域限制 互斥, }, }, entry: none, })从源码结构看它有以下几个值得注意的特征name: compatibilities组件内部标识名其余代码通过该名称读取它的设置见后文调用链。displayName: 兼容性选项在设置面板中展示的名称归入「通用」general标签分组。general标签定义于 src/components/types.ts显示名为「通用」、配色为灰色、图标为mdi-progress-wrench。configurable: false表示该组件不可由用户在设置面板中直接开关启用状态其启用状态固定取决于默认值。在 src/core/settings/helpers.ts 的isComponentEnabled中当组件configurable false时会跳过用户设置、直接采用enabledByDefault默认true——也就是说该组件始终处于启用状态它提供的选项本身才是用户可以操作的部分。entry: none入口函数为空none是 src/core/utils 提供的空操作工具函数。这意味着该组件本身不执行任何页面功能它存在的全部意义就是承载「兼容性选项」这个配置项供初始化流程读取。options.disableOnBalh唯一的选项defaultValue: false默认关闭显示名为「与『解除 B 站区域限制』互斥」。该组件通过 src/components/built-in-components.ts 中的getBuiltInComponents()注册为内置组件随脚本一同加载。二、唯一配置项disableOnBalh的含义组件说明文档 src/components/compatibilities/index.md 对唯一选项的解释是与 解除 B 站区域限制 互斥: 若打开此选项, 在检测到 解除 B 站区域限制 脚本时, 将停止此脚本的加载以避免布局错乱.拆解如下配置项类型默认值作用disableOnBalhbooleanfalse开启后当检测到页面存在「解除 B 站区域限制」脚本BALH时Bilibili-Evolved 将放弃自身加载从而避免两套脚本同时改动页面导致的布局错乱这里的 BALH 即 Bilibili Area Limit Hack解除 B 站区域限制类脚本。这类脚本通过改写页面结构、注入代理逻辑来实现跨区域观看与 Bilibili-Evolved 的众多布局、样式、播放器增强功能叠加时可能出现样式覆盖冲突、DOM 结构互相破坏等问题。该选项提供的不是「覆盖对方」而是「主动避让」一旦检测到对方存在增强脚本直接停止加载把页面留给对方接管。选项的数据结构disableOnBalh遵循组件选项的标准定义OptionMetadata见 src/components/types.ts只用到defaultValue与displayName两个字段它是布尔开关类型在设置面板中会自动渲染为一个开关控件SwitchBox。由于组件本身configurable: false选项 UI 依然会展示在设置面板中选项 UI 与组件启停开关是两套机制用户可以在「通用」分组下找到它并手动开启。三、底层实现init.ts 中的检测调用链该选项的实际生效位置不在组件本身而在客户端初始化脚本 src/client/init.ts。初始化流程的关键片段如下const { coreApis, externalApis } await import(/core/core-apis) if ( unsafeWindow.bangumi_area_limit_hack coreApis.settings.getComponentSettings{ disableOnBalh: boolean }(compatibilities).options .disableOnBalh coreApis.utils.matchUrlPattern(//www.bilibili.com/bangumi/play/) ) { console.log(BALH detected, Bilibili Evolved is disabled.) return }三个条件同时满足时初始化函数直接return后续的组件加载、样式注入等步骤全部跳过unsafeWindow.bangumi_area_limit_hack为真这是 BALH 类脚本在页面全局unsafeWindow 沙箱环境上暴露的标记变量。检测到它即认为「解除 B 站区域限制」脚本已注入当前页面。disableOnBalh选项为真用户已在「兼容性选项」中开启互斥开关。getComponentSettings(compatibilities).options.disableOnBalh通过核心设置 API 读取该组件的实时设置值默认false即默认不启用互斥。当前 URL 匹配//www.bilibili.com/bangumi/play/即用户正处于 B 站番剧bangumi播放页。matchUrlPattern是核心工具 src/core/utils 提供的 URL 匹配函数这里只针对番剧播放页生效避免在无关页面误伤。值得注意的细节检测目标精确bangumi_area_limit_hack是 BALH 类脚本的专属标记。若未检测到该标记即使开启了互斥选项也不会触发停止加载正常页面完全不受影响。日志输出触发时控制台打印BALH detected, Bilibili Evolved is disabled.便于用户排查「为什么脚本没生效」。放置时机该检查位于compatibilityPatch()通用兼容性补丁执行之后、loadAllUserComponents与loadAllComponents等组件加载之前保证能在加载任何功能组件前安全退出。与之呼应的是同目录下的通用兼容性补丁 src/client/compatibility.ts它处理的是另一类更基础的兼容性问题iframe 透明化、播放器 polyfill、requestIdleCallback兜底等而compatibilities组件则专门解决与第三方脚本的共存问题两者分工不同。四、配置方式与使用场景如何在设置面板开启安装 Bilibili-Evolved 后点击页面侧边的设置面板入口。在设置面板中通过搜索或标签筛选找到「通用」general分组下的「兼容性选项」。打开「与『解除 B 站区域限制』互斥」开关即可生效无需刷新页面重载脚本该选项在下次初始化时被读取。典型使用场景你同时安装了「解除 B 站区域限制」类脚本与 Bilibili-Evolved在番剧播放页出现布局异常、样式错乱或功能按钮失效。你希望在番剧页明确让位给 BALH 脚本避免双方对页面 DOM 与样式的重复修改互相干扰。开启该选项后凡是在bangumi/play/番剧播放页检测到 BALH 标记Bilibili-Evolved 都会放弃本次初始化离开番剧播放页或未检测到 BALH 时增强脚本恢复正常加载。需要注意的边界该互斥仅在番剧播放页//www.bilibili.com/bangumi/play/生效其他页面即使检测到 BALH 标记也不会触发因为第三个条件不满足。选项默认关闭即默认情况下两套脚本可以共存是否开启取决于你实际遇到的冲突情况。五、扩展阅读相关源码索引如果想深入理解该组件的完整链路可按以下路径继续阅读组件定义与选项src/components/compatibilities/index.ts、组件说明初始化检测与调用链src/client/init.ts通用兼容性补丁同主题的姊妹实现src/client/compatibility.ts组件选项与元数据规范src/components/types.ts、src/components/define.ts组件启用判定逻辑configurable语义src/core/settings/helpers.ts内置组件注册表src/components/built-in-components.ts结语「兼容性选项」组件虽然只有一个选项、没有入口函数却是 Bilibili-Evolved 在脚本生态共存问题上的典型设计通过一个全局标记变量精确探测第三方脚本、一个可配置开关交由用户决策、一段置于组件加载前的短路判断实现整体避让。理解disableOnBalh的触发三条件与它在 init.ts 中的调用位置不仅能帮助你正确配置互斥行为也能为你在自己的用户脚本中处理多脚本冲突提供可复用的实现范式。【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考