You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug] 停用→启用一行带 Client 模块的插件后,浏览器半侧不会重新挂载(loaded without registering),只有重启 App 才能恢复
#8452
<pkg>: Error: client-modules: could not load "<pkg>":
plugins/??<pkg>/client.js&rev=<rev>:
loaded without registering "<pkg>" via __ModuleLoader__.load
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Summary
dsh 桌面端(Electron)的界面本身就是一张网页(由本机 web 服务提供的 Web UI),插件因此分两半:宿主半侧跑在 Node 主进程,浏览器半侧(Client 模块)跑在窗口里的这张网页上。本报告说的是后者,与外部浏览器无关。
在这台机器(Desktop
0.2.0-rc.2/ macOS)上:把一行带 Client 模块(dsh.client.platform = "web")的插件,在 Plugins 页面里「停用 → 启用」之后,那一行的 Client 模块不会被重新挂载。宿主半侧与 entry 状态都正常,但它的所有客户端槽位注册全部消失;内置插件面板给出:面板自身的措辞也印证了这个分界:「本页面的插件未能完成同步;服务端的启用状态保持不变」。
只有重启 App(= 这张网页全新引导一次)才能恢复。面板上的「重试」无效。
Reproduction
dsh.client.platform = "web"+exports["./client"]),其客户端 bundle 在页面里注册进某个槽位(例如plugins.bundle.config)。loaded without registering;点「重试」无效。(推测任何"启用状态可切换 + 带 Client 模块"的行都一样;未用内置行验证,因为可切换的内置行不便改动。)
Current behavior
宿主侧:
Config.listConfigs(name =<pkg>)→status: "schema"(fiber 存活)→ 行确实是启用状态
客户端侧:
Slots.listSubTree→ 该插件注册的槽位没有 occupant(
plugins.bundle.config为空;另一处conversation.composer.dock也只剩内置的stats)内置插件面板原文(示意):
点「重试」→ 无变化
手动改客户端 bundle 的 mtime(触发 HMR 产物 revision 变化)→ 无变化
重启 App → 恢复
Expected behavior
packages/client/modules/README.zh.md明确承诺:即:再次启用应当重新挂载,不需要刷新页面。
已排除的可能
__ModuleLoader__.load收到的id=== 包名;48 项断言全过)dsh.client.immediately,不属于文档所述"移除或替换 bootstrap 需要刷新页面"那一类whileServed造成的:该页面直接注册,未使用configForms.whileServedConfig+ 全部字段.volatile()+ctx.configForms.get()+dsh.client.inject声明依赖)源码层面的线索(供定位)
packages/client/modules/src/client/entries.ts里两条处理"条目缺失"的路径不一致:推测:条目被移除后,模块表里该包的 factory 注册没有被丢掉;重新加载时单资源脚本再次执行
__ModuleLoader__.load({id}),这次注册被当作重复而未生效,于是arrive()判定 "loaded without registering",条目永远建不起来。reconcile()缺invalidate()与"重试无效"的实测一致。(这是读源码的推测、不是结论。若
invalidate()不是关键,则"停用后未回收 factory 注册"仍然需要一条恢复路径。)Environment
0.2.0-rc.2,macOSdesktop(默认桌面 profile)link:安装的组合包;dsh.client.platform = "web";未声明immediately期望
packages/client/modules/README.zh.md的承诺一致)All reactions