[建议/Web体验] 建议优先保证前端流畅度而非 hidden="until-found":折叠工具与思考时真正卸载 DOM,解决长会话严重卡顿 #6156
Erick0412-dev
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
问题背景
在当前 DSH(包括最新的 0.1.5-rc.1 与 master 分支)的 Web 前端实现中,长会话或多工具调用的复杂 Agent 任务经常出现极其严重的卡顿:打字延迟高达数秒、页面滚动掉帧、浏览器内存暴涨甚至标签页假死。
深入排查后,我们发现前端性能瓶颈主要来自目前
@deepseek-ai/dsh-client-ui-chat的折叠与历史机制:hidden="until-found"导致的常驻 DOM 节点爆炸:在官方设计决策(
2026-08-14-web-turn-process-folding)中记录到:因此,目前代码中折叠仅是切换
hidden="until-found"属性,收起部分的所有复杂 Markdown、代码高亮、成千上万行终端输出依然全量挂载在 DOM 树中(长任务单会话 DOM 常达 17,000+)。每当模型流式生成一个 token,Chromium 主线程都要进行整树的重排计算(Layout Thrashing),引发主线程假死。!historyIncomplete导致长会话的折叠全盘失效:在
ChatNodeSeat.tsx中,processWindowReady硬编码了必须满足!historyIncomplete(对应ChatView中的hasMore)。这导致只要用户没有一路点击“加载更早”把历史拉到第一轮,整场会话的所有轮次完全不进行任何折叠,原本就庞大的中间过程被迫全部以全高形态铺在页面上,直接将卡顿推向极限。
现实痛点:
Ctrl+F搜折叠内容真的值得牺牲流畅度吗?我们非常理解官方当初采用这套设计时的初衷:
hidden="until-found"与beforematch规范,让用户用Ctrl+F检索时能自动展开折叠内容;但是,在现实开发者的真实使用场景中,这一取舍产生了严重的体验失衡:
Ctrl+F去翻找 20 分钟前一段已经执行完毕的长篇终端输出或折叠报错。本地实测对比(修改为真卸载 DOM)
我们在本地对
@deepseek-ai/dsh-client-ui-chat进行了简易热补丁验证:processHidden为真时,直接不渲染内部节点(children: processHidden ? null : renderSlot(...)),深度思考块同理。&& !historyIncomplete判定,让已结算的已关闭轮次无论前驱历史是否完整,都能正常进入收起状态。实测效果提升极其惊人:
Ctrl+F搜不到收起内容——所有实测开发者一致认为这个取舍对于日常编码体验是绝对利大于弊的。建议解决方案
在
Settings -> General中增加轻量化开关,允许用户自主选择折叠策略(例如:性能优先(卸载DOM)vs原生搜索(保留DOM)),并允许长会话在未拉取完前序历史时也正常启用折叠。探讨在
ChatView中引入真正的虚拟滚动(Virtual List),彻底摆脱长对话下对全量 DOM 挂载的依赖。All reactions