拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Bilibili-Evolved DevClient 本地开发工具完全指南:自动更新与样式热重载原理

Bilibili-Evolved DevClient 本地开发工具完全指南自动更新与样式热重载原理【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved导读DevClient 是 Bilibili-Evolved哔哩哔哩增强脚本内置的本地开发工具组件它通过与项目自带的 DevServer 建立 WebSocket 长连接为功能开发者在浏览器端提供本体自动更新与功能样式热重载两大核心能力。阅读本文后你将掌握 DevClient 的完整配置项语义、连接机制、刷新与热重载策略的执行逻辑并能结合 DevServer 的 CLI 命令独立搭建一套改代码 → 编译 → 浏览器即时生效的本地调试链路。一、DevClient 是什么定位与整体架构DevClient 的官方说明位于 registry/lib/components/utils/dev-client/index.md原文将其描述为本地开发工具提供自动更新功能和样式热重载的能力需要与 DevServer 配合使用。它是一个典型的开发期专用组件只服务于功能作者与最终用户的日常使用无关。从代码结构看DevClient 由以下文件组成文件职责index.ts组件元数据定义、入口与生命周期client.ts核心DevClient类WebSocket 连接、消息分发、刷新/热重载决策options.ts全部配置项的元数据定义与默认值update-method.ts刷新策略与热重载策略的枚举定义protocol.ts客户端侧 WebSocket 消息协议类型converter.ts在线 URL 与本地 DevServer URL 的互转工具plugin.ts通过插件机制向设置面板与启动栏注册操作入口Widget.vue侧边栏小部件连接状态展示与手动连接/断开Action.vue组件详情页中的开始调试/停止调试操作按钮在组件入口 index.ts 中DevClient 做了三件关键事情iframe 防护isIframe()为真时直接返回确保只在顶层页面建立连接失效调试记录恢复监听FeatureSessionsUpdate、ServerDisconnected、ServerStop三类事件一旦发现某个功能之前被切换到了 DevServer 地址、而现在会话已失效就把autoUpdate组件中的 URL 还原为原始在线地址并从devRecords中删除记录自动连接若配置项autoConnect开启则立即调用devClient.createSocket()。二、配置项详解端口、自动连接与刷新策略DevClient 的配置定义在 options.ts全部选项如下配置项默认值说明port23333DevServer 端口getNumberValidator(1024, 65535)限定范围为 102465535autoConnecttrue自动连接每次进入网页自动尝试连接 DevServercoreRefreshMethod总是刷新本体脚本核心刷新策略registryRefreshMethod总是刷新功能组件/插件刷新策略registryReloadMethod开启热重载功能热重载策略devRecords{}调试模式临时存储隐藏项记录被切换到 DevServer 地址的功能原名与原始 URL其中刷新策略与热重载策略的枚举定义在 update-method.tsRefreshMethodAlwaysRefresh 总是刷新默认、DoNotRefresh 不刷新HotReloadMethodEnabled 开启热重载默认、Disabled 关闭热重载源码中StylesOnly 仅样式以 TODO 注释形式预留尚未实现。与文档对应各配置项的实际语义如下自动连接开启时每次进入网页都会自动尝试连接到 DevServer关闭时需要通过设置面板组件详情页的开始调试按钮、启动栏的连接 DevServer操作或小部件手动连接刷新策略决定收到本体coreUpdate或功能itemUpdate更新消息时是否刷新页面——总是刷新立即location.reload()不刷新则只更新代码不刷新页面热重载策略决定是否开启热重载。开启时若更新的功能带有instantStyles则直接热替换其中的样式而不刷新页面关闭时退化为按刷新策略执行。三、连接机制从 WebSocket 到事件分发3.1 建立连接DevClient.createSocket()client.ts每次都会先关闭旧连接再向ws://localhost:{port}发起新的 WebSocket 连接并挂载error、close、open、message四类监听器error连接失败时输出警告若toastError为真还会弹出 2 秒的 Toast 提示连接失败请确保 DevServer 已启动并检查连接配置open连接成功后派发ServerChangedetail 为true与ServerConnected事件unload页面卸载前自动closeSocket()避免遗留悬挂连接。isConnected属性client.ts通过socket?.readyState WebSocket.OPEN判断当前是否已连接是各 UI 显示连接状态的核心依据。3.2 消息协议与事件体系DevClient 客户端侧的消息协议定义在 protocol.ts服务端侧对应定义在 dev-tools/dev-server/payload.ts两侧类型保持一致。消息统一为{ type, ... }形式的 JSON 对象客户端通过 handleSocketMessage 解析。客户端可收到的事件消息包括消息类型触发动作serverReady记录clientId与初始featureSessionsitemUpdate更新会话列表并按路径处理功能更新详见第四节coreUpdate处理本体更新详见第四节serverStop派发ServerStop事件并主动断开连接featureSessionsChanged/queryFeatureSessionsResponse同步当前被监听的功能路径列表startDebugFeature执行调试功能安装流程commandResult按requestId回调对应的挂起命令DevClient继承自EventTarget对外派发的事件枚举DevClientEventsclient.ts包括CoreUpdate、ItemUpdate、FeatureSessionsUpdate、ClientIdUpdate、ServerChange、ServerConnected、ServerDisconnected、ServerStopUI 层Widget.vue、Action.vue正是通过监听这些事件实现连接状态与调试按钮的实时刷新。3.3 URL 转换器converter.ts 中的urlConverter.toDevUrl()负责把功能的原始加载地址转换为本地 DevServer 地址按优先级匹配三种形态已是localhost:{port}/registry/dist/{kind}s/...格式——直接返回形如localhost:{任意端口}/{kind}s/...——改写为 DevServer 端口下的/registry/dist/{kind}s/路径线上/registry/dist/{kind}s/...路径——同样改写为本地地址。这是开始调试按钮判断某个组件能否切入调试模式canStartDebug的关键依据见 Action.vue。四、自动更新与热重载的完整执行逻辑4.1 本体更新coreUpdate收到coreUpdate消息后handleCoreUpdate()client.ts先派发CoreUpdate事件再检查coreRefreshMethod若为总是刷新则控制台输出本体已更新刷新页面...并调用location.reload()若为不刷新则仅派发事件。4.2 功能更新itemUpdate与热重载收到itemUpdate时handleItemUpdate(path)client.ts是 DevClient 最核心的逻辑执行流程如下根据path构造本地地址http://localhost:{port}{path}用monkey()拉取编译产物在autoUpdateOptions.urls.components中按 URL 后缀匹配到对应组件通过installFeatureFromCode()安装新版本同时保留旧组件的instantStyles引用根据registryReloadMethod与registryRefreshMethod组合决策热重载策略刷新策略实际行为关闭热重载总是刷新刷新页面location.reload()关闭热重载不刷新仅更新代码不刷新开启热重载任意新旧组件存在instantStyles时先removeInstantStyle移除旧样式再loadInstantStyle加载新样式并改写旧组件上的instantStyles引用注释说明否则此前设置的事件监听仍引用旧样式随后不刷新页面若新旧组件都没有instantStyles则回退到刷新页面插件plugins分支的逻辑更简单若刷新策略为总是刷新则刷新页面否则仅记录已更新。这正是文档中只要成功触发热重载就不刷新页面这一原则的源码级体现热重载仅覆盖带instantStyles的样式变更带entry逻辑变更的功能仍依赖整页刷新源码中// TODO: 实现 entry 热重载的注释也印证了该边界。4.3 调试模式与会话管理除了被动接收更新DevClient 还提供主动调试能力startDebug()client.ts拉取指定 URL 的代码后向服务端查询当前featureSessionsstopDebug()client.ts发送stopFeatureSession命令并根据返回的featureSessions或再次查询结果更新会话handleStartDebugFeature()client.ts处理服务端下发的startDebugFeature消息依次经历load code → parse code → install code → update auto update record → load component style等阶段安装成功后把路径加入会话列表并回复startDebugFeatureResult任一步骤失败都会返回包含失败阶段与错误信息的响应。调试状态记录在devRecords中nameoriginalUrl当调试会话结束、服务端断开或服务停止时入口处的restoreInactiveDevRecords会把这些功能恢复为原始在线 URL——这也是上文中失效调试记录恢复机制的完整闭环。五、UI 交互小部件、启动栏与组件操作DevClient 通过 plugin.ts 以插件数据的形式向脚本注册三类入口设置面板组件操作为每个已注册到autoUpdateOptions.urls.components的组件注入Action.vue操作按钮。该按钮提供开始调试/停止调试能力Action.vue开始调试时把组件的自动更新 URL 切换为 DevServer 地址并记录原始 URL停止调试时向服务端发送stopFeatureSession并把 URL 还原启动栏操作已连接时提供断开 DevServer 连接未连接时提供连接 DevServer图标分别使用mdi-stop-circle-outline与mdi-play-circle-outline侧边栏小部件Widget.vue展示clientId等宽字体、可全选复制与连接状态——绿色圆点已连接/灰色圆点未连接并提供断开/连接按钮。这些 UI 全部通过监听DevClientEvents驱动在created中注册监听、beforeDestroy中移除避免内存泄漏。六、与 DevServer 配合的完整调试工作流DevClient 只是浏览器端的一环它需要与仓库 dev-tools/dev-server 中的 DevServer 配合才能真正工作。DevServer 的 WebSocket 默认监听ws://localhost:23333与 DevClient 默认端口一致HTTP 层则按需把registry/dist/components/id.js与registry/dist/plugins/id.js这类虚拟地址编译输出到内存。6.1 命令行操作在 DevServer 运行期间可用 command.ts 命令行客户端执行如下操作摘自 dev-tools/dev-server/README.md# 查看当前被监听的功能会话 pnpm tsx dev-tools/dev-server/command.ts sessions # 显式构建指定功能 pnpm tsx dev-tools/dev-server/command.ts build component style/hide/banner # 启动监听watch编译完成后向 DevClient 广播 itemUpdate pnpm tsx dev-tools/dev-server/command.ts watch plugin video/player/speed # 停止监听 pnpm tsx dev-tools/dev-server/command.ts stop component style/hide/banner # 在指定 DevClient 上启动调试 pnpm tsx dev-tools/dev-server/command.ts start-debug component style/hide/banner dev-client-1 # 停止调试 pnpm tsx dev-tools/dev-server/command.ts stop-debug component style/hide/banner # 关闭 DevServer广播 serverStop 后优雅退出 pnpm tsx dev-tools/dev-server/command.ts shutdown6.2 端到端流程一个典型的本地开发循环如下启动 DevServer浏览器中开启 DevClient 的自动连接进入任意页面后自动建立 WebSocket 连接修改某个功能的源码通过watch命令或 DevServer 的文件监听触发编译DevServer 向已连接的 DevClient 广播itemUpdateDevClient 拉取新编译产物并安装若功能带instantStyles且热重载开启样式即时生效、页面不刷新否则按刷新策略整页刷新若需调试可通过组件详情页的开始调试按钮或start-debug命令把功能 URL 切换到 DevServer 地址进入可迭代的调试会话调试结束或关闭 DevServer 时serverStop事件触发 DevClient 恢复原始 URL 并断开连接完成闭环。七、注意事项与限制仅顶层页面生效index.ts与plugin.ts均在isIframe()时提前返回DevClient 不运行在 iframe 页面中热重载仅覆盖样式目前热重载只处理instantStyles功能entry的变更仍需刷新页面源码中留有实现 entry 热重载的 TODO连接目标固定为 localhostcreateSocket固定连接ws://localhost:{port}连接失败时可检查端口配置102465535 范围内以及 DevServer 是否已启动调试记录自动还原当 DevServer 停止或连接断开时被调试功能的 URL 会自动从devRecords中还原为原始在线地址无需手动清理。结语DevClient 以一份不足 20 行的说明文档定义了自动更新 样式热重载两大能力而支撑它的是一套完整的 WebSocket 协议、配置体系与 UI 交互。理解它的配置项语义options.ts、更新决策逻辑client.ts以及与 DevServer 的协议配合dev-tools/dev-server/payload.ts就能在 Bilibili-Evolved 的本地开发中实现改样式秒级生效、改逻辑自动刷新的高效迭代体验。【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门